diff --git a/goofy-client/.gitignore b/goofy-client/.gitignore index 4fd9280cfc1fbd0aa4b37c6d3c2c5798c3aea859..92abdb41d7fa17686e58d3ccf2fcb843520c83e7 100644 --- a/goofy-client/.gitignore +++ b/goofy-client/.gitignore @@ -45,3 +45,5 @@ testem.log # System Files .DS_Store Thumbs.db + +.angular diff --git a/goofy-client/angular.json b/goofy-client/angular.json index dc95c00d557171ac0c83278366be1a3a1463395a..faabb2288332d4d7fda6e994cf2e3450a17e6c01 100644 --- a/goofy-client/angular.json +++ b/goofy-client/angular.json @@ -741,6 +741,32 @@ }, "tags": [] }, + "vorgang-historie": { + "projectType": "library", + "root": "libs/vorgang-historie", + "sourceRoot": "libs/vorgang-historie/src", + "prefix": "goofy-client", + "architect": { + "test": { + "builder": "@nrwl/jest:jest", + "outputs": ["coverage/libs/vorgang-historie"], + "options": { + "jestConfig": "libs/vorgang-historie/jest.config.js", + "passWithNoTests": true + } + }, + "lint": { + "builder": "@nrwl/linter:eslint", + "options": { + "lintFilePatterns": [ + "libs/vorgang-historie/src/**/*.ts", + "libs/vorgang-historie/src/**/*.html" + ] + } + } + }, + "tags": [] + }, "vorgang-shared": { "projectType": "library", "root": "libs/vorgang-shared", diff --git a/goofy-client/apps/goofy-e2e/cypress-ci.json b/goofy-client/apps/goofy-e2e/cypress-ci.json index 226e3b24a4874cf11e02abb708326aa56cc6f09e..e9ae33f9b5536c4362ae095cb37566d4b2eee0b3 100644 --- a/goofy-client/apps/goofy-e2e/cypress-ci.json +++ b/goofy-client/apps/goofy-e2e/cypress-ci.json @@ -18,7 +18,7 @@ "screenshotsFolder": "./reports/screenshots", "chromeWebSecurity": false, "reporter": "../../node_modules/cypress-mochawesome-reporter", - "defaultCommandTimeout": 30000, + "defaultCommandTimeout": 10000, "reporterOptions": { "html": false, "json": true, diff --git a/goofy-client/apps/goofy-e2e/cypress.json b/goofy-client/apps/goofy-e2e/cypress.json index e6a2f99932c1bebd99a5b710f42ed5ad0257a9fc..4122b625bd22da6b8d73513906d3bb83f608dc3e 100644 --- a/goofy-client/apps/goofy-e2e/cypress.json +++ b/goofy-client/apps/goofy-e2e/cypress.json @@ -19,7 +19,7 @@ "screenshotsFolder": "./reports/screenshots", "chromeWebSecurity": false, "reporter": "../../node_modules/cypress-mochawesome-reporter", - "defaultCommandTimeout": 30000, + "defaultCommandTimeout": 10000, "reporterOptions": { "html": false, "json": true, diff --git a/goofy-client/apps/goofy-e2e/deployment-values/goofy/ea-values.yaml b/goofy-client/apps/goofy-e2e/deployment-values/goofy/ea-values.yaml index 186bcf470603c5e114d0646583806d9bda3cf9e8..0f0c380e7742c42c4aac7aa8b20a3bdc2912690c 100644 --- a/goofy-client/apps/goofy-e2e/deployment-values/goofy/ea-values.yaml +++ b/goofy-client/apps/goofy-e2e/deployment-values/goofy/ea-values.yaml @@ -1,6 +1,7 @@ sso: serverUrl: 'https://sso.dev.ozg-sh.de/auth' role_einheitlicher_ansprechpartner: true + apiPassword: "Goofy1234!" env: overrideSpringProfiles: 'oc,dev,ea,e2e' plutoName: pluto diff --git a/goofy-client/apps/goofy-e2e/deployment-values/goofy/values.yaml b/goofy-client/apps/goofy-e2e/deployment-values/goofy/values.yaml index 7fc995858ebbf5ef31d5ef914a9f0b8f83a3edad..cf6d7c3b88614b1b205cd616a46dc332303752a3 100644 --- a/goofy-client/apps/goofy-e2e/deployment-values/goofy/values.yaml +++ b/goofy-client/apps/goofy-e2e/deployment-values/goofy/values.yaml @@ -1,5 +1,6 @@ sso: serverUrl: 'https://sso.dev.ozg-sh.de/auth' + apiPassword: "Goofy1234!" env: overrideSpringProfiles: 'oc, dev, e2e' plutoName: pluto diff --git a/goofy-client/apps/goofy-e2e/src/components/postfach/postfach-mail.e2e.component.ts b/goofy-client/apps/goofy-e2e/src/components/postfach/postfach-mail.e2e.component.ts index c963cd470c996f9bd2505a8e4f53427d3fb44209..8caf345fa69221ddf747bdd958aedbb6334bbe3b 100644 --- a/goofy-client/apps/goofy-e2e/src/components/postfach/postfach-mail.e2e.component.ts +++ b/goofy-client/apps/goofy-e2e/src/components/postfach/postfach-mail.e2e.component.ts @@ -15,6 +15,7 @@ export class PostfachMailE2EComponent { return cy.getTestElement(this.locatorRoot); } + //TODO Umbenennen in bspw. sendButton public getButton() { return cy.getTestElement(this.locatorButton); } diff --git a/goofy-client/apps/goofy-e2e/src/components/vorgang/vorgang-list.e2e.component.ts b/goofy-client/apps/goofy-e2e/src/components/vorgang/vorgang-list.e2e.component.ts index adf241c5f3fab6967a7add75d9755ba38abf02d1..b1e2ac805a7aaba0c03dc50efc52f00ec2d8083a 100644 --- a/goofy-client/apps/goofy-e2e/src/components/vorgang/vorgang-list.e2e.component.ts +++ b/goofy-client/apps/goofy-e2e/src/components/vorgang/vorgang-list.e2e.component.ts @@ -6,6 +6,7 @@ export class VorgangListE2EComponent { private readonly spinnerComponent: SpinnerE2EComponent = new SpinnerE2EComponent(); private readonly locatorRoot: string = 'vorgang-list'; + private readonly locatorNoRoleMessage: string = 'user-no-role-message'; public getRoot() { return cy.getTestElement(this.locatorRoot); @@ -18,4 +19,8 @@ export class VorgangListE2EComponent { public getSpinner() { return this.spinnerComponent.findSpinner(this.getRoot()); } + + public getNoRoleMessage() { + return cy.getTestElement(this.locatorNoRoleMessage); + } } \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/src/fixtures/user/user_emil.json b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_emil.json index a5e8c36bf6737e1c73a30939cd905fa0068aeb04..fdf45c69e17675488dcbb47134c0d2f941f5f74c 100644 --- a/goofy-client/apps/goofy-e2e/src/fixtures/user/user_emil.json +++ b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_emil.json @@ -1,6 +1,6 @@ { "name": "emil", - "password": "Y9nk43yrQ_zzIPpfFU-I", + "password": "Ansprechpartner", "firstName": "Emil", "lastName": "Ansprechpartner", "fullName": "Emil Ansprechpartner", diff --git a/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kfinder.json b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kfinder.json index 22f78e014b70157a4d6d26ba3604e7affcf06fc9..3a7a5dcf387c718ca6e9f91ca3b0e834b8f06212 100644 --- a/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kfinder.json +++ b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kfinder.json @@ -1,5 +1,6 @@ { "name": "kfinder", "password": "Katrinfinder", - "groups": ["Abtl. 10.0.1 Versammlungsbehörde, Identitätsfeststellung, Fundbüro"] + "groups": ["Abtl. 10.0.1 Versammlungsbehörde, Identitätsfeststellung, Fundbüro"], + "clientRoles": ["VERWALTUNG_USER"] } \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kordner.json b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kordner.json index f1f4ebbbea2ffe18d2118a52470cf2b17be2a6ae..79b8c6c09a07eaf851ae30f92489b3afd057f71b 100644 --- a/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kordner.json +++ b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kordner.json @@ -1,5 +1,6 @@ { "name": "kordner", "password": "Klausordner", - "groups": ["Abtl. 10.5.1.2 Allgemeine Gefahrenabwehr und sonstige Ordnungsrechtsangelegenheiten"] + "groups": ["Abtl. 10.5.1.2 Allgemeine Gefahrenabwehr und sonstige Ordnungsrechtsangelegenheiten"], + "clientRoles": ["VERWALTUNG_USER"] } \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/src/fixtures/user/user_richard.json b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_richard.json new file mode 100644 index 0000000000000000000000000000000000000000..c1fa331c717ea67ff70dbeb7c599b91526189c7e --- /dev/null +++ b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_richard.json @@ -0,0 +1,6 @@ +{ + "name": "richard", + "firstName": "Richard", + "lastName": "Rollenlos", + "password": "Y9nk43yrQ_zzIPpfFU-I" +} \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.e2e-spec.ts index 06c04cf370028b782d68678eed6f5f88543020ea..e4c18311022168829fb39c3a0732dbe70e28119b 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.e2e-spec.ts @@ -25,6 +25,7 @@ describe('Vorgang abschliessen', () => { loginAsEmil(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -37,6 +38,7 @@ describe('Vorgang abschliessen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangAbschliessen.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -46,14 +48,11 @@ describe('Vorgang abschliessen', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbschliessen.status]); }) - it('should show snackBar message', () => { + it('should show snackBar', () => { vorgangFormularButtons.clickAbschliessenByButton(); - contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN) - }) - - it('should show snackBar close button', () => { exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN) }) it('should close snackBar', () => { @@ -68,13 +67,12 @@ describe('Vorgang abschliessen', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Abgeschlossen', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangAbschliessen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]); }) }) @@ -84,6 +82,7 @@ describe('Vorgang abschliessen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangAbschliessenRevoke.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -94,35 +93,34 @@ describe('Vorgang abschliessen', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbschliessenRevoke.status]); }) - it('should show snackBar message', () => { + it('should show snackBar', () => { vorgangPage.getSubnavigation().clickAbschliessenByIconButton(); - contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN); - }) - - it('should show snackBar close button', () => { exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN); }) - it('should show progressbar', () => { + it('should close snackbar on revoke', () => { snackBar.getRevokeButton().click(); + waitForSpinnerToDisappear(); - exist(vorgangPage.getProgressBar()); + notExist(snackBar.getMessage()); }) - it('should show status Beschieden', () => { + it('should show status Beschieden after progressbar dissapear', () => { + notExist(vorgangPage.getProgressBar()); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]); }) it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Beschieden', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangAbschliessenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]) }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.e2e-spec.ts index df4f9a76e881adcc96cf14d7323e62857e504320..409bded210ae8dc7b08be68647044ec2d7a5fda9 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.e2e-spec.ts @@ -24,6 +24,7 @@ describe('Vorgang forwarding', () => { loginAsEmil(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -35,6 +36,7 @@ describe('Vorgang forwarding', () => { it('should show vorgang header', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -55,6 +57,7 @@ describe('Vorgang forwarding', () => { forwardFormular.getPasswort().clear().type('zukurz'); forwardFormular.forward(); + waitForSpinnerToDisappear(); exist(forwardFormular.getPasswortError()); }) @@ -64,6 +67,7 @@ describe('Vorgang forwarding', () => { forwardFormular.getZustaendigeStelle().clear().type('invalidemail.com'); forwardFormular.forward(); + waitForSpinnerToDisappear(); exist(forwardFormular.getZustaendigeStelleError()); }) @@ -101,6 +105,7 @@ describe('Vorgang forwarding', () => { it('should show "zustellung success message" after click on button', () => { forwardingContainer.getMarkAsSuccessButton().click(); + waitForSpinnerToDisappear(); exist(forwardingContainer.getForwardingSuccessMessage()); }) @@ -110,7 +115,6 @@ describe('Vorgang forwarding', () => { it('should have status ' + vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET] + ' in list', () => { vorgangPage.getSubnavigation().clickBackButton(); - waitForSpinnerToDisappear(); haveText(vorgangList.getListItem(vorgang.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET]); @@ -121,6 +125,7 @@ describe('Vorgang forwarding', () => { it('should formular after switching vorgang without pending commands', () => { vorgangList.getListItem(vorgangEmpty.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(forwardingContainer.getRoot()); }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-e2e-spec.ts index 463be058e579c6309c498ab5d137cc2e9ab938cd..1c9bcbeddd8f52c7ed4b980949359601afdbdb9f 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-e2e-spec.ts @@ -23,6 +23,7 @@ describe('Vorgang forwarding failed', () => { loginAsEmil(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -34,6 +35,7 @@ describe('Vorgang forwarding failed', () => { it('should show vorgang header', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -52,13 +54,15 @@ describe('Vorgang forwarding failed', () => { formular.forward(); - waitForSpinnerToDisappear(); + exist(forwardingContainer.getSpinner()); }) }) describe('mark forwarding as fail', () => { it('should have status ' + vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET], () => { + waitForSpinnerToDisappear(); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET]) }) @@ -97,7 +101,6 @@ describe('Vorgang forwarding failed', () => { it('should have status ' + vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG] + ' in list', () => { vorgangPage.getSubnavigation().clickBackButton(); - waitForSpinnerToDisappear(); haveText(vorgangList.getListItem(vorgang.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]); diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.e2e-spec.ts index b446c717078d72330f2b0bf982cbbad040e60d50..ebd21580474f4f60c91cf4789a799fa6a6d6e80e 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.e2e-spec.ts @@ -30,6 +30,7 @@ describe('Vorgang Verwerfen', () => { loginAsEmil(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -41,6 +42,7 @@ describe('Vorgang Verwerfen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangVerwerfen.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -53,15 +55,13 @@ describe('Vorgang Verwerfen', () => { it('should show snackBar message', () => { vorgangFormularButtons.clickVerwerfenByButton(); + waitForSpinnerToDisappear(); - contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN); - }) - - it('should show snackBar close button', () => { exist(snackbar.getCloseButton()); + contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN); }) - it('should close snackBar', () => { + it('should close snackBar on close button', () => { snackbar.getCloseButton().click(); notExist(snackbar.getMessage()); @@ -78,13 +78,12 @@ describe('Vorgang Verwerfen', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Verworfen', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangVerwerfen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]); }) }) @@ -94,6 +93,7 @@ describe('Vorgang Verwerfen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangVerwerfenRevoke.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -104,23 +104,24 @@ describe('Vorgang Verwerfen', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangVerwerfenRevoke.status]); }) - it('should show snackBar message', () => { + it('should show snackBar', () => { vorgangPage.getSubnavigation().clickVerwerfenByIconButton(); + waitForSpinnerToDisappear(); - contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN); - }) - - it('should show snackBar close button', () => { exist(snackbar.getCloseButton()); + contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN); }) - it('should show progressbar', () => { + it('should close snackbar on revoke', () => { snackbar.getRevokeButton().click(); + waitForSpinnerToDisappear(); - exist(vorgangPage.getProgressBar()); + notExist(snackbar.getMessage()); }) - it('should show status Neu', () => { + it('should show status Neu after progressbar dissapear', () => { + notExist(vorgangPage.getProgressBar()); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]); }) @@ -131,13 +132,12 @@ describe('Vorgang Verwerfen', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Neu', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangVerwerfenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]); }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.e2e-spec.ts index 19969db1281cf3cb0698290ae52ffe031d983814..efdab9bb0f489f1af5f5330f3ed6ba79f24e1832 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.e2e-spec.ts @@ -25,6 +25,7 @@ describe('Vorgang wiedereroeffnen', () => { loginAsEmil(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -38,6 +39,7 @@ describe('Vorgang wiedereroeffnen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnen.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -48,17 +50,15 @@ describe('Vorgang wiedereroeffnen', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenWiedereroeffnen.status]); }) - it('should show snackBar message', () => { + it('should show snackBar', () => { vorgangFormularButtons.clickWiedereroeffnenByButton(); + waitForSpinnerToDisappear(); - contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); - }) - - it('should show snackBar close button', () => { exist(snackbar.getCloseButton()); + contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); }) - it('should close snackBar', () => { + it('should close snackBar on close', () => { snackbar.getCloseButton().click(); notExist(snackbar.getMessage()); @@ -70,13 +70,12 @@ describe('Vorgang wiedereroeffnen', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status In Bearbeitung', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]); }) }) @@ -86,6 +85,7 @@ describe('Vorgang wiedereroeffnen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnenRevoke.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -96,35 +96,35 @@ describe('Vorgang wiedereroeffnen', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenWiedereroeffnenRevoke.status]); }) - it('should show snackBar message', () => { + it('should show snackBar', () => { vorgangPage.getSubnavigation().clickWiedereroeffnenByIconButton(); + waitForSpinnerToDisappear(); - contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); - }) - - it('should show snackBar close button', () => { exist(snackbar.getCloseButton()); + contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); }) - it('should show progressbar', () => { + it('should close snackbar on revoke', () => { snackbar.getRevokeButton().click(); + waitForSpinnerToDisappear(); - exist(vorgangPage.getProgressBar()); + notExist(snackbar.getMessage()); }) - it('should show status Abgeschlossen', () => { + it('should show status Abgeschlossen after progressbar dissapear', () => { + notExist(vorgangPage.getProgressBar()); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]); }) it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Abgeschlossen', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]); }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.e2e-spec.ts index a8cca227ed36bc17abfa2ab8a7e675db15184700..dd64bead9a1e543c106ebf8a050900a7503125a9 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.e2e-spec.ts @@ -30,6 +30,7 @@ describe('Vorgang Zurueckholen', () => { loginAsEmil(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -41,6 +42,7 @@ describe('Vorgang Zurueckholen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangZurueckholen.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -51,17 +53,15 @@ describe('Vorgang Zurueckholen', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangZurueckholen.status]); }) - it('should show snackBar message', () => { + it('should show snackBar', () => { vorgangFormularButtons.getZurueckholenButton().click(); + waitForSpinnerToDisappear(); - contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT); - }) - - it('should show snackBar close button', () => { exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT); }) - it('should close snackBar', () => { + it('should close snackBar on close button', () => { snackBar.getCloseButton().click(); notExist(snackBar.getMessage()); @@ -77,13 +77,12 @@ describe('Vorgang Zurueckholen', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Neu', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangZurueckholen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]); }) }) @@ -93,6 +92,7 @@ describe('Vorgang Zurueckholen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangZurueckholenRevoke.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -103,23 +103,24 @@ describe('Vorgang Zurueckholen', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangZurueckholenRevoke.status]); }) - it('should show snackBar message', () => { + it('should show snackBar', () => { vorgangPage.getSubnavigation().getZurueckholenIconButton().click(); + waitForSpinnerToDisappear(); - contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT); - }) - - it('should show snackBar close button', () => { exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT); }) - it('should show progressbar', () => { + it('should close snackbar on revoke', () => { snackBar.getRevokeButton().click(); + waitForSpinnerToDisappear(); - exist(vorgangPage.getProgressBar()); + notExist(snackBar.getMessage()); }) - it('should show status Verworfen', () => { + it('should show status Verworfen after progressbar dissapear', () => { + notExist(vorgangPage.getProgressBar()); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]); }) @@ -130,13 +131,12 @@ describe('Vorgang Zurueckholen', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Verworfen', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangZurueckholenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]); }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts index 203c52d1434d3ea22f67dfd6b4ab3f84a4ac87a7..f883346b68b13208de815768db5915a07186c443 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts @@ -31,8 +31,8 @@ describe('VorgangList Suche for EA User', () => { loginAsEmil(); - exist(vorgangList.getRoot()); waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) after(() => { diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts index 5eb8d73a7a55affde88fd652bfabbdc5ea62aa0f..14f07f5139439315fc39e2a868ecd9111048655a 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts @@ -13,8 +13,8 @@ describe('Buildinfo', () => { before(() => { loginAsSabine(); - exist(vorgangList.getRoot()); waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) after(() => { diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-connection-timout.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-connection-timout.e2e-spec.ts index 31d96367988452e667682d3352d353808f902fb4..16b0888357438675785587de4c1a998ea3243ceb 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-connection-timout.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-connection-timout.e2e-spec.ts @@ -3,7 +3,7 @@ import { ConnectionTimeoutRetryDialogE2EComponent, ConnectionTimeoutRetryFailDia import { VorgangDetailHeaderE2EComponent } from '../../../components/vorgang/vorgang-detail-header.e2e.component'; import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; import { VorgangE2E } from '../../../model/vorgang'; -import { MainPage } from '../../../page-objects/main.po'; +import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; import { dropCollections, interceptWithResponse, waitOfInterceptor } from '../../../support/cypress-helper'; import { contains, exist } from '../../../support/cypress.util'; @@ -30,6 +30,7 @@ describe('Interceptor Connection Timeout', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -50,6 +51,7 @@ describe('Interceptor Connection Timeout', () => { it('should navigate to vorgang detail', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangHeader.getRoot()); }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-forbidden.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-forbidden.e2e-spec.ts index 6f971f3dce5e52e043a092c5c36efe36b2235337..d8c311a1f3424f7eb09ca478df052cdbe0f82c63 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-forbidden.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-forbidden.e2e-spec.ts @@ -4,7 +4,7 @@ import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-lis import { VorgangSubnavigationE2EComponent } from '../../../components/vorgang/vorgang-subnavigation'; import { HttpMethodE2E } from '../../../model/util'; import { VorgangE2E } from '../../../model/vorgang'; -import { MainPage } from '../../../page-objects/main.po'; +import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; import { dropCollections, interceptWithResponse, waitOfInterceptor } from '../../../support/cypress-helper'; import { contains, exist, notExist } from '../../../support/cypress.util'; @@ -28,6 +28,7 @@ describe('Interceptor Forbidden', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -48,6 +49,7 @@ describe('Interceptor Forbidden', () => { it('should show page and snackbar', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); waitOfInterceptor(interceptor).then((interception) => { assert(interception.response.statusCode, statusCode.toString()); @@ -59,8 +61,17 @@ describe('Interceptor Forbidden', () => { }) }) + it('should close snackbar on close button', () => { + snackbar.getCloseButton().click() + + notExist(snackbar.getMessage()); + }) + it('should navigate back on back button', () => { subnavigation.clickBackButton(); + + waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) }) }) \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-server-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-server-error.e2e-spec.ts index 01a057f45e4fdda8a23a26d4a21401ac8904fa8c..438160b38f2980878f20ccee42c6f7003e48ca59 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-server-error.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-server-error.e2e-spec.ts @@ -2,7 +2,7 @@ import { InternalServerErrorDialogE2EComponent } from '../../../components/ui/in import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; import { HttpMethodE2E } from '../../../model/util'; import { VorgangE2E } from '../../../model/vorgang'; -import { MainPage } from '../../../page-objects/main.po'; +import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; import { dropCollections, interceptWithResponse, waitOfInterceptor } from '../../../support/cypress-helper'; import { contains, exist, notExist } from '../../../support/cypress.util'; @@ -24,6 +24,7 @@ describe('Interceptor Server Error', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -44,6 +45,7 @@ describe('Interceptor Server Error', () => { it('should show page', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); waitOfInterceptor(interceptor).then(interception => { assert(interception.response.statusCode, statusCode.toString()); diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-unauthorized.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-unauthorized.e2e-spec.ts index fdd0153dd47f7ed0867268ea4823b188c8b3d1d8..9904eb389b800a0bfbc081e5b2f21af6167b4589 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-unauthorized.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-unauthorized.e2e-spec.ts @@ -25,6 +25,7 @@ describe('Interceptor unauthorized', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -42,6 +43,7 @@ describe('Interceptor unauthorized', () => { interceptWithResponse(HttpMethodE2E.GET, BASE_PATH + vorgang._id.$oid, { statusCode }).as(interceptorResponseUnauthorized); vorgangList.getListItem(vorgang.name).getRoot().click({ force: true }); + waitForSpinnerToDisappear(); waitOfInterceptor(interceptorResponseUnauthorized).then((interception) => { assert(interception.response.statusCode, statusCode.toString()); @@ -59,6 +61,9 @@ describe('Interceptor unauthorized', () => { it('should navigate back on back button', () => { subnavigation.clickBackButton(); + waitForSpinnerToDisappear(); + + exist(vorgangList.getRoot()); }) }) }) \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar/kommentar.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar/kommentar.e2e-spec.ts index aff539185f321f7c0c72a00d506d660e6834b2fc..ecaf35b5a3970e7fefb43c0dd1f9b1a5ce7787d3 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar/kommentar.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar/kommentar.e2e-spec.ts @@ -24,6 +24,7 @@ describe('Kommentar', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(mainPage.getVorgangList().getRoot()); }) @@ -35,6 +36,7 @@ describe('Kommentar', () => { it('Open Vorgang-Detail-Page', () => { mainPage.getVorgangList().getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -48,6 +50,7 @@ describe('Kommentar', () => { it('should show formular', () => { kommentarContainer.getHinzufuegenButton().click(); + waitForSpinnerToDisappear(); exist(kommentarContainer.getFormular()); }) @@ -65,9 +68,8 @@ describe('Kommentar', () => { describe('click on hinzufuegen button in formular', () => { it('should show error on invalid input', () => { - waitForSpinnerToDisappear(); - kommentarContainer.getFormularSpeichernButton().click(); + waitForSpinnerToDisappear(); exist(kommentarContainer.getTextError()); }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts index 83e1ee78b3d2fdf94dc4c2ce754c059e3422841d..8f5b997336681229f082ca75e91d259aac2ff6f5 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts @@ -1,13 +1,13 @@ import { NavigationE2EComponent } from 'apps/goofy-e2e/src/components/navigation/navigation.e2e.component'; import { VorgangListE2EComponent } from 'apps/goofy-e2e/src/components/vorgang/vorgang-list.e2e.component'; import { VorgangE2E } from 'apps/goofy-e2e/src/model/vorgang'; -import { MainPage } from 'apps/goofy-e2e/src/page-objects/main.po'; +import { MainPage, waitForSpinnerToDisappear } from 'apps/goofy-e2e/src/page-objects/main.po'; import { dropCollections } from 'apps/goofy-e2e/src/support/cypress-helper'; import { CypressKeyboardActions, exist, notExist } from 'apps/goofy-e2e/src/support/cypress.util'; import { getUserSabineUuid, loginAsSabine } from 'apps/goofy-e2e/src/support/user-util'; import { buildVorgang, createVorgang, initVorgaenge, objectIds } from 'apps/goofy-e2e/src/support/vorgang-util'; -describe.skip('Navigation', () => { +describe('Navigation', () => { const mainPage: MainPage = new MainPage(); const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList(); @@ -25,6 +25,10 @@ describe.skip('Navigation', () => { loginAsSabine(); + waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); + navigation.getAllVorgaengeItem().click(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -36,6 +40,7 @@ describe.skip('Navigation', () => { it('should hide not to user assigned vorgaenge', () => { navigation.getMyVorgaengeItem().click(); + waitForSpinnerToDisappear(); notExist(vorgangList.getListItem(vorgang.name).getRoot()); notExist(vorgangList.getListItem(vorgangNotBeFiltered.name).getRoot()); @@ -45,6 +50,7 @@ describe.skip('Navigation', () => { it('should hide not matching vorgaenge after do search', () => { doSearch(searchString); + waitForSpinnerToDisappear(); notExist(vorgangList.getListItem(vorgang.name).getRoot()); notExist(vorgangList.getListItem(vorgangNotBeFiltered.name).getRoot()); @@ -57,6 +63,7 @@ describe.skip('Navigation', () => { it('should show all vorgaenge', () => { navigation.getAllVorgaengeItem().click(); + waitForSpinnerToDisappear(); exist(vorgangList.getListItem(vorgang.name).getRoot()); exist(vorgangList.getListItem(vorgangNotBeFiltered.name).getRoot()); @@ -66,6 +73,7 @@ describe.skip('Navigation', () => { it('should hide not matching vorgaenge after do search', () => { doSearch(searchString); + waitForSpinnerToDisappear(); notExist(vorgangList.getListItem(vorgang.name).getRoot()); exist(vorgangList.getListItem(vorgangNotBeFiltered.name).getRoot()); diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail-error.e2e-spec.ts index 621dabf8a158720324163270a540d882c28f3c4a..7694fdeed57227d15a48267b26284576ebffa866 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail-error.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail-error.e2e-spec.ts @@ -4,7 +4,7 @@ import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-lis import { VorgangSubnavigationE2EComponent } from '../../../components/vorgang/vorgang-subnavigation'; import { VorgangE2E } from '../../../model/vorgang'; import { DirectionE2E, PostfachMailItemE2E, PostfachNachrichtMessageCodeE2E, PostfachNachrichtMessageCodeMessagesE2E, PostfachNachrichtSnackbarMessageE2E, VorgangAttachedItemE2E } from '../../../model/vorgang-attached-item'; -import { MainPage } from '../../../page-objects/main.po'; +import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { PostfachMailPage } from '../../../page-objects/postfach-mail.component.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; import { dropCollections } from '../../../support/cypress-helper'; @@ -41,6 +41,7 @@ describe('PostfachMail error', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -52,6 +53,7 @@ describe('PostfachMail error', () => { it('should open vorgang detail', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -109,6 +111,7 @@ describe('PostfachMail error', () => { it('click on resend button should hide error', () => { listItem.getResendButton().click(); + waitForSpinnerToDisappear(); notExist(listItem.getMailSendErrorIcon()); }) @@ -120,6 +123,12 @@ describe('PostfachMail error', () => { notExist(snackbar.getRevokeButton()); }) + it('should close snackbar on close button', () => { + snackbar.getCloseButton().click(); + + notExist(snackbar.getMessage()); + }) + it('should show mail subject', () => { contains(listItem.getSubject(), postfachMailItem.subject); }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.e2e-spec.ts index 63ee7d0fd571d2ae8748978b8e57b100a507fe77..944b11a29574a0e637ac97d4841a894853e2daf2 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.e2e-spec.ts @@ -53,6 +53,7 @@ describe('PostfachMail', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -61,6 +62,7 @@ describe('PostfachMail', () => { }) describe('mail icon', () => { + it('should not be visible', () => { notExist(vorgangList.getListItem(vorgang.name).getPostfachStatus()); }) @@ -70,6 +72,7 @@ describe('PostfachMail', () => { it('should open vorgang detail', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -98,6 +101,7 @@ describe('PostfachMail', () => { it('should show fixed dialog header and content', () => { postfachMailContainer.getButton().click(); + waitForSpinnerToDisappear(); exist(fixedDialog.getDialogHeader()); exist(fixedDialog.getDialogContent()); @@ -124,6 +128,7 @@ describe('PostfachMail', () => { it('should open dialog click on icon button', () => { subnavigation.getPostfachMailIconButton().click(); + waitForSpinnerToDisappear(); exist(postfachMailFormular.getEmpfaenger()); }) @@ -146,6 +151,7 @@ describe('PostfachMail', () => { it('should show error on subject if send empty', () => { postfachMailFormular.getSendButton().click(); + waitForSpinnerToDisappear(); exist(postfachMailFormular.getBetreffError()); }) @@ -173,32 +179,35 @@ describe('PostfachMail', () => { it('should show empty attachment after uploading it', () => { uploadEmptyFile(attachmentContainer.getUploadInput(), TEST_FILE_WITHOUT_CONTENT) + waitForSpinnerToDisappear(); exist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot()); }) it('should show attachment with content after uploading it', () => { uploadFile(postfachMailFormular.getAttachmentContainer().getUploadInput(), TEST_FILE_WITH_CONTENT); + waitForSpinnerToDisappear(); exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot()); }) it('should download empty attachment on click', () => { attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getDownloadButton().click(); - waitForSpinnerToDisappear(); + exist(readFileFromDownloads(TEST_FILE_WITHOUT_CONTENT)); }) it('should download attachment with content on click', () => { attachmentList.getItem(TEST_FILE_WITH_CONTENT).getDownloadButton().click(); - waitForSpinnerToDisappear(); + exist(readFileFromDownloads(TEST_FILE_WITH_CONTENT)); }) it('should not show empty attachment after deleting it', () => { attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getDeleteButton().click(); + waitForSpinnerToDisappear(); notExist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot()); }) @@ -208,12 +217,13 @@ describe('PostfachMail', () => { it('should show error snackbar', () => { uploadFile(postfachMailFormular.getAttachmentContainer().getUploadInput(), TEST_FILE_WITH_CONTENT_4_MB); + waitForSpinnerToDisappear(); exist(snackbar.getMessage()); contains(snackbar.getMessage(), BinaryFileSnackbarMessageE2E.ATTACHMENT_NOT_ADDED.replace('{size}', '3MB')); }) - it('should close snackbar', () => { + it('should close snackbar on close button', () => { snackbar.getCloseButton().click(); notExist(snackbar.getCloseButton()); @@ -240,6 +250,7 @@ describe('PostfachMail', () => { it('should close dialog', () => { postfachMailFormular.getSendButton().click(); + waitForSpinnerToDisappear(); notExist(postfachMailFormular.getEmpfaenger()); }) @@ -249,6 +260,12 @@ describe('PostfachMail', () => { notExist(snackbar.getRevokeButton()); }) + it('should close snackbar on close button', () => { + snackbar.getCloseButton().click(); + + notExist(snackbar.getMessage()); + }) + it('should show postfach mail in list', () => { const postfachMailItem: PostfachMailListItem = postfachMailContainer.getListItem(postfachMailToSend.subject); @@ -280,8 +297,8 @@ describe('PostfachMail', () => { it('should download attachment after click', () => { const postfachListItem: PostfachMailListItem = postfachMailPage.getListItem(postfachMailToSend.subject); - waitForSpinnerToDisappear(); postfachListItem.getAttachmentContainer().getList().getItem(TEST_FILE_WITH_CONTENT).getDownloadButton().click(); + waitForSpinnerToDisappear(); exist(readFileFromDownloads(TEST_FILE_WITHOUT_CONTENT)); }); @@ -390,6 +407,9 @@ describe('PostfachMail', () => { it('should open full view of postfachMailList', () => { postfachMailReplyItem.getRoot().click(); + waitForSpinnerToDisappear(); + + exist(postfachMailPage.getRoot()); }) it('should show subnavigation', () => { @@ -424,6 +444,7 @@ describe('PostfachMail', () => { it('should navigate to vorgang detail', () => { postfachMailPage.getSubnavigation().getBackButton().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.e2e-spec.ts index 8c388898fd9a633fe3e8a968ef7cdc970060b646..bfd4a54ec45dbff7c02fd4008796b96f782a15e7 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.e2e-spec.ts @@ -46,13 +46,14 @@ describe('PostfachNachrichten filtered by organisationseinheit', () => { before(() => { loginAsKfinder(); - exist(vorgangList.getRoot()); waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) it('should open postfachNachrichten page', () => { logInParts(authorizedUrl); visitUrl(authorizedUrl); + waitForSpinnerToDisappear(); exist(postfachMailPage.getBreadcrump()); }); @@ -60,10 +61,15 @@ describe('PostfachNachrichten filtered by organisationseinheit', () => { it('should not open postfachNachrichten page', () => { logInParts(forbiddenUrl); visitUrl(forbiddenUrl); + waitForSpinnerToDisappear(); notExist(postfachMailPage.getBreadcrump()); + }) + + it('should show snackbar', () => { + exist(snackbar.getCloseButton()); contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN); - }); + }) }) describe('on user kordner', () => { @@ -73,13 +79,14 @@ describe('PostfachNachrichten filtered by organisationseinheit', () => { before(() => { loginAsKordner(); - exist(vorgangList.getRoot()); waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) it('should open postfachNachrichten page', () => { logInParts(authorizedUrl); visitUrl(authorizedUrl); + waitForSpinnerToDisappear(); exist(postfachMailPage.getBreadcrump()) }) @@ -87,8 +94,13 @@ describe('PostfachNachrichten filtered by organisationseinheit', () => { it('should not open postfachNachrichten page', () => { logInParts(forbiddenUrl); visitUrl(forbiddenUrl); + waitForSpinnerToDisappear(); notExist(postfachMailPage.getBreadcrump()) + }) + + it('should show snackbar', () => { + exist(snackbar.getCloseButton()); contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN); }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.e2e-spec.ts index 417dc74f6409c2f42e5a22065a58d22e8fc141bc..1722f12188e52d052cb1b1c26e78a851e38362e0 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.e2e-spec.ts @@ -46,8 +46,8 @@ describe('Postfach Nachricht should be authorized by role', () => { it(`should show vorgang in Stauts ${VorgangStatusE2E.NEU}`, () => { visitUrl(vorgangInStatusNeuUrl); - waitForSpinnerToDisappear(); + exist(postfachNachrichtPage.getRoot()); }) @@ -55,24 +55,24 @@ describe('Postfach Nachricht should be authorized by role', () => { it(`${VorgangStatusE2E.IN_BEARBEITUNG}`, () => { visitUrl(vorgangInStatusInBearbeitungUrl); - waitForSpinnerToDisappear(); + notExist(postfachNachrichtPage.getRoot()); contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN); }) it(`${VorgangStatusE2E.ABGESCHLOSSEN}`, () => { visitUrl(vorgangInStatusAbgeschlossenUrl); - waitForSpinnerToDisappear(); + notExist(postfachNachrichtPage.getRoot()); contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN); }) it(`${VorgangStatusE2E.BESCHIEDEN}`, () => { visitUrl(vorgangInStatusBeschiedenUrl); - waitForSpinnerToDisappear(); + notExist(postfachNachrichtPage.getRoot()); contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN); }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachrichten.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachrichten.e2e-spec.ts index 52bc2268b846b11854cdda954a91b9faa0c581fe..62892150267e504f3b6d627b46481f12d7d4ad7e 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachrichten.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachrichten.e2e-spec.ts @@ -2,7 +2,7 @@ import { CyHttpMessages } from 'cypress/types/net-stubbing'; import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; import { HttpMethodE2E } from '../../../model/util'; import { VorgangE2E } from '../../../model/vorgang'; -import { MainPage } from '../../../page-objects/main.po'; +import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; import { dropCollections, interceptWithResponse } from '../../../support/cypress-helper'; import { exist, notExist } from '../../../support/cypress.util'; @@ -22,6 +22,7 @@ describe('Postfach Nachrichten', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -41,6 +42,7 @@ describe('Postfach Nachrichten', () => { it('navigate to vorgangDetail', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-assign-unassign.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-assign-unassign.e2e-spec.ts index 4ee3b74623b6c6d794867813a49552103d1a0c49..d7f781d43afe7f14d579ea044c81769ac0591e3e 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-assign-unassign.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-assign-unassign.e2e-spec.ts @@ -17,7 +17,7 @@ describe('User Profile im ausgewählten Vorgang', () => { const vorgangPage: VorgangPage = new VorgangPage(); const userProfileContainer: UserProfileE2EComponent = vorgangPage.getVorgangDetailHeader().getUserContainer(); - let vorgang: VorgangE2E = createVorgang(); + const vorgang: VorgangE2E = createVorgang(); const userSabine: UserE2E = getUserSabine(); const userEmil: UserE2E = getUserEmil(); @@ -26,6 +26,7 @@ describe('User Profile im ausgewählten Vorgang', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -46,6 +47,7 @@ describe('User Profile im ausgewählten Vorgang', () => { it('open vorgang detail', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -62,14 +64,14 @@ describe('User Profile im ausgewählten Vorgang', () => { describe('fill formular', () => { - it('should show error on enter empty field', () => { + it('should show error on enter wrong input', () => { enterWith(userProfileContainer.getSearchContainer().getInput(), 'Clark Kent'); exist(userProfileContainer.getSearchContainer().getError()); exist(userProfileContainer.getIconContainer().getUnassignedIcon()); }) - it('should show error on enter wrong input', () => { + it('should show error on enter empty field', () => { enterWith(userProfileContainer.getSearchContainer().getInput(), ''); exist(userProfileContainer.getSearchContainer().getError()); @@ -112,6 +114,7 @@ describe('User Profile im ausgewählten Vorgang', () => { it('open vorgang detail', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.e2e-spec.ts index 5c03ba490c7ab7982627d486f315ce28c7390554..b01f639bb481756e382349c755592a29b6edffd8 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.e2e-spec.ts @@ -36,6 +36,7 @@ describe('Postfach nachricht user profile on backend error', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -47,6 +48,7 @@ describe('Postfach nachricht user profile on backend error', () => { it('should navigate to vorgang detail', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); waitForSpinnerToDisappear(); @@ -62,6 +64,9 @@ describe('Postfach nachricht user profile on backend error', () => { it('should navigate back to list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); + + exist(vorgangList.getRoot()); }) }) @@ -96,6 +101,9 @@ describe('Postfach nachricht user profile on backend error', () => { it('should navigate back', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); + + exist(vorgangList.getRoot()); }) }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-vorgang-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-vorgang-error.e2e-spec.ts index 3270339a9c28435a401ac8ef8d962eb9ac436c33..25a62e54666685b4258417722be004b5c6be6104 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-vorgang-error.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-vorgang-error.e2e-spec.ts @@ -20,13 +20,14 @@ describe('User profile assigned to vorgang', () => { const vorgangPage: VorgangPage = new VorgangPage(); const userProfileContainer: UserProfileE2EComponent = vorgangPage.getVorgangDetailHeader().getUserContainer(); - let vorgang: VorgangE2E = { ...createVorgang(), assignedTo: faker.datatype.uuid() }; + const vorgang: VorgangE2E = { ...createVorgang(), assignedTo: faker.datatype.uuid() }; before(() => { initVorgang(vorgang); loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -40,9 +41,9 @@ describe('User profile assigned to vorgang', () => { it('should navigate to vorgang detail', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); - waitForSpinnerToDisappear(); }) it('should show icon', () => { @@ -55,6 +56,9 @@ describe('User profile assigned to vorgang', () => { it('should navigate back', () => { vorgangPage.getSubnavigation().clickBackButton(); + + waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) }) @@ -63,8 +67,6 @@ describe('User profile assigned to vorgang', () => { const userProfile: UserProfileIconE2EComponent = vorgangList.getListItem(vorgang.name).getUserProfile().getIconContainer(); it('should show icon', () => { - waitForSpinnerToDisappear(); - exist(userProfile.getErrorResourceNotFoundIcon()); }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-anhang/anhang-herunterladen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-anhang/anhang-herunterladen.e2e-spec.ts index d7c477c00215beb0d6768c4e33ddcb962b8a22b1..2cd258c55c852cf1e20ad2babe891387d8fd4676 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-anhang/anhang-herunterladen.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-anhang/anhang-herunterladen.e2e-spec.ts @@ -47,6 +47,7 @@ describe('Vorgang Anhänge', () => { loginAsSabine(); + waitForSpinnerToDisappear() exist(vorgangList.getRoot()); }) @@ -58,8 +59,8 @@ describe('Vorgang Anhänge', () => { it('should open vorgang detail page on click on single vorgang', () => { vorgangList.getListItem(vorgangAnhangVorhanden.name).getRoot().click(); - waitForSpinnerToDisappear(); + exist(vorgangHeader.getRoot()); }) @@ -73,23 +74,23 @@ describe('Vorgang Anhänge', () => { it('should download jpg', () => { const jpgAttachmentName: string = getJpgAttachment().name; attachmentContainer.getList().getItem(jpgAttachmentName).getRoot().click(); - waitForSpinnerToDisappear(); + exist(readFileFromDownloads(jpgAttachmentName)); }) it('should download pdf', () => { const pdfAttachmentName: string = getPdfAttachment().name; attachmentContainer.getList().getItem(convertToDataTestId(pdfAttachmentName)).getRoot().click(); - waitForSpinnerToDisappear(); + exist(readFileFromDownloads(pdfAttachmentName)); }) it('should navigate to vorganglist on back button', () => { subnavigation.clickBackButton(); - waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) @@ -106,8 +107,8 @@ describe('Vorgang Anhänge', () => { it('should open vorgang detail page on click on single vorgang', () => { vorgangList.getListItem(vorgangAnhangVorhanden.name).getRoot().click(); - waitForSpinnerToDisappear(); + exist(vorgangHeader.getRoot()); }) @@ -120,15 +121,15 @@ describe('Vorgang Anhänge', () => { it('should download representation', () => { attachmentContainer.getList().getItem(xmlRepresentation.name).getRoot().click(); - waitForSpinnerToDisappear(); + exist(readFileFromDownloads(xmlRepresentation.name)); }) it('should navigate to vorganglist on back button', () => { subnavigation.clickBackButton(); - waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-abschliessen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-abschliessen.e2e-spec.ts index 418c7631cfcffa90eb7157ac5dd19b4600aba17d..ca75d37cffb640113588983e344276215320c4a9 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-abschliessen.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-abschliessen.e2e-spec.ts @@ -25,6 +25,7 @@ describe('Vorgang abschliessen(EA)', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -36,6 +37,7 @@ describe('Vorgang abschliessen(EA)', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangAbschliessen.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -48,12 +50,10 @@ describe('Vorgang abschliessen(EA)', () => { it('should show snackBar message', () => { vorgangFormularButtons.clickAbschliessenByButton(); + waitForSpinnerToDisappear(); - contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN) - }) - - it('should show snackBar close button', () => { exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN) }) it('should close snackBar', () => { @@ -68,13 +68,12 @@ describe('Vorgang abschliessen(EA)', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Abgeschlossen', () => { - waitForSpinnerToDisappear() - haveText(vorgangList.getListItem(vorgangAbschliessen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]); }) }) @@ -84,6 +83,7 @@ describe('Vorgang abschliessen(EA)', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangAbschliessenRevoke.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -96,33 +96,33 @@ describe('Vorgang abschliessen(EA)', () => { it('should show snackBar message', () => { vorgangPage.getSubnavigation().clickAbschliessenByIconButton(); + waitForSpinnerToDisappear(); - contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN); - }) - - it('should show snackBar close button', () => { exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN); }) - it('should show progressbar', () => { + it('should close snackbar on revoke', () => { snackBar.getRevokeButton().click(); + waitForSpinnerToDisappear(); - exist(vorgangPage.getProgressBar()); + notExist(snackBar.getMessage()); }) it('should show status Beschieden', () => { + notExist(vorgangPage.getProgressBar()); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.BESCHIEDEN]); }) it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Beschieden', () => { - waitForSpinnerToDisappear() - haveText(vorgangList.getListItem(vorgangAbschliessenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.BESCHIEDEN]) }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-annehmen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-annehmen.e2e-spec.ts index 1e5c724078e13598c0f05f24941f0f19d1d14ae6..a7d9a247a87091fb9cd52fae58269d7e5148740c 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-annehmen.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-annehmen.e2e-spec.ts @@ -30,6 +30,7 @@ describe('Vorgang Annehmen', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -41,6 +42,7 @@ describe('Vorgang Annehmen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangAnnehmen.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -53,15 +55,13 @@ describe('Vorgang Annehmen', () => { it('should show snackBar message', () => { vorgangFormularButtons.clickAnnehmenByButton(); + waitForSpinnerToDisappear(); - contains(snackBar.getMessage(), VorgangMessagesE2E.ANGENOMMEN); - }) - - it('should show snackBar close button', () => { exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.ANGENOMMEN); }) - it('should close snackBar', () => { + it('should close snackBar on close', () => { snackBar.getCloseButton().click(); notExist(snackBar.getMessage()); @@ -73,13 +73,12 @@ describe('Vorgang Annehmen', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Angenommen', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangAnnehmen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ANGENOMMEN]); }) }) @@ -89,6 +88,7 @@ describe('Vorgang Annehmen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangAnnehmenRevoke.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -101,33 +101,32 @@ describe('Vorgang Annehmen', () => { it('should show snackBar message', () => { vorgangPage.getSubnavigation().clickAnnehmenByIconButton(); + waitForSpinnerToDisappear(); - contains(snackBar.getMessage(), VorgangMessagesE2E.ANGENOMMEN); - }) - - it('should show snackBar close button', () => { exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.ANGENOMMEN); }) - it('should show progressbar', () => { + it('should close snackbar on revoke', () => { snackBar.getRevokeButton().click(); - exist(vorgangPage.getProgressBar()); + notExist(snackBar.getMessage()); }) it('should show status Neu', () => { + notExist(vorgangPage.getProgressBar()); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]); }) it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Neu', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangAnnehmenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]); }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bearbeiten.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bearbeiten.e2e-spec.ts index f22f6ee8e24337c7a53373fc226e043a712481d9..c2c9639eb69124f39c53a631c445737ae8ae46ea 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bearbeiten.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bearbeiten.e2e-spec.ts @@ -25,6 +25,7 @@ describe('Vorgang bearbeiten', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -36,6 +37,7 @@ describe('Vorgang bearbeiten', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangBearbeiten.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -46,17 +48,15 @@ describe('Vorgang bearbeiten', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangBearbeiten.status]); }) - it('should show snackBar message', () => { + it('should show snackBar', () => { vorgangFormularButtons.clickBearbeitenByButton(); + waitForSpinnerToDisappear(); contains(snackBar.getMessage(), VorgangMessagesE2E.BEARBEITET); - }) - - it('should show snackBar close button', () => { exist(snackBar.getCloseButton()); }) - it('should close snackBar', () => { + it('should close snackBar on close button', () => { snackBar.getCloseButton().click(); notExist(snackBar.getMessage()); @@ -68,13 +68,12 @@ describe('Vorgang bearbeiten', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status In Bearbeitung', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangBearbeiten.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]) }) }) @@ -84,6 +83,7 @@ describe('Vorgang bearbeiten', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangBearbeitenRevoke.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -94,35 +94,35 @@ describe('Vorgang bearbeiten', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangBearbeitenRevoke.status]); }) - it('should show snackBar message', () => { + it('should show snackBar', () => { vorgangPage.getSubnavigation().clickBearbeitenByIconButton(); + waitForSpinnerToDisappear(); - contains(snackBar.getMessage(), VorgangMessagesE2E.BEARBEITET); - }) - - it('should show snackBar close button', () => { exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.BEARBEITET); }) - it('should show progressbar', () => { + it('should close snackbar on revoke', () => { snackBar.getRevokeButton().click(); + waitForSpinnerToDisappear(); - exist(vorgangPage.getProgressBar()); + notExist(snackBar.getMessage()); }) it('should show status Angenommen', () => { + notExist(vorgangPage.getProgressBar()); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ANGENOMMEN]); }) it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Angenommen', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangBearbeitenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ANGENOMMEN]) }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bescheiden.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bescheiden.e2e-spec.ts index 828b30bcfc7c56016230710851d2ffbe24ba0332..8a7507dc6faf733efb7e75a92ac8ac1361919ff1 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bescheiden.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bescheiden.e2e-spec.ts @@ -25,6 +25,7 @@ describe('Vorgang bescheiden', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -36,6 +37,7 @@ describe('Vorgang bescheiden', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangBescheiden.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -48,6 +50,7 @@ describe('Vorgang bescheiden', () => { it('should show snackBar message', () => { vorgangFormularButtons.clickBescheidenByButton(); + waitForSpinnerToDisappear(); contains(snackBar.getMessage(), VorgangMessagesE2E.BESCHIEDEN); }) @@ -68,6 +71,7 @@ describe('Vorgang bescheiden', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -84,6 +88,7 @@ describe('Vorgang bescheiden', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangBescheidenRevoke.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -96,6 +101,7 @@ describe('Vorgang bescheiden', () => { it('should show snackBar message', () => { vorgangPage.getSubnavigation().clickBescheidenByIconButton(); + waitForSpinnerToDisappear(); contains(snackBar.getMessage(), VorgangMessagesE2E.BESCHIEDEN); }) @@ -104,25 +110,27 @@ describe('Vorgang bescheiden', () => { exist(snackBar.getCloseButton()); }) - it('should show progressbar', () => { + it('should close snackbar on revoke', () => { snackBar.getRevokeButton().click(); + waitForSpinnerToDisappear(); - exist(vorgangPage.getProgressBar()); + notExist(snackBar.getMessage()); }) - it('should show status In Bearbeitung', () => { + it('should show status Angenommen', () => { + notExist(vorgangPage.getProgressBar()); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]); }) it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status In Bearbeitung', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangBescheidenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]); }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.e2e-spec.ts index 149ffcb5341df253331274d1a4580f85ceaba311..142169a91e9bffd79cb63977366549996c9874b5 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.e2e-spec.ts @@ -10,7 +10,7 @@ import { AntragstellerE2EComponent } from '../../../components/vorgang/vorgang-a import { VorgangDetailHeaderE2EComponent } from '../../../components/vorgang/vorgang-detail-header.e2e.component'; import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; import { VorgangE2E } from '../../../model/vorgang'; -import { MainPage } from '../../../page-objects/main.po'; +import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; import { dropCollections } from '../../../support/cypress-helper'; import { exist, notExist } from '../../../support/cypress.util'; @@ -42,6 +42,7 @@ describe('Vorgang Detailansicht by role', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -53,6 +54,7 @@ describe('Vorgang Detailansicht by role', () => { it('should show vorgang header', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangHeader.getRoot()); }) @@ -145,6 +147,7 @@ describe('Vorgang Detailansicht by role', () => { loginAsPeter(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -156,6 +159,7 @@ describe('Vorgang Detailansicht by role', () => { it('should show vorgang header', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangHeader.getRoot()); }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.e2e-spec.ts index ef4580dcb7452922d2048e243a025cfd593d4535..3a142e56dcc6d31bbf8050116cfd248c30fdd072 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.e2e-spec.ts @@ -41,8 +41,8 @@ describe('Vorgang Detailansicht should be authorized by role', () => { it(`should show vorgang in Stauts ${VorgangStatusE2E.NEU}`, () => { visitUrl(vorgangInStatusNeuUrl); - waitForSpinnerToDisappear(); + exist(vorgangHeader.getRoot()); }) @@ -50,24 +50,24 @@ describe('Vorgang Detailansicht should be authorized by role', () => { it(`${VorgangStatusE2E.IN_BEARBEITUNG}`, () => { visitUrl(vorgangInStatusInBearbeitungUrl); - waitForSpinnerToDisappear(); + notExist(vorgangHeader.getRoot()); contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN); }) it(`${VorgangStatusE2E.ABGESCHLOSSEN}`, () => { visitUrl(vorgangInStatusAbgeschlossenUrl); - waitForSpinnerToDisappear(); + notExist(vorgangHeader.getRoot()); contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN); }) it(`${VorgangStatusE2E.BESCHIEDEN}`, () => { visitUrl(vorgangInStatusBeschiedenUrl); - waitForSpinnerToDisappear(); + notExist(vorgangHeader.getRoot()); contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN); }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.e2e-spec.ts index 646844ed4200896472625a8675a0e92888172e45..a4379d6f5b9cec103dea4f24bdee60d6337b3f4d 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.e2e-spec.ts @@ -7,7 +7,7 @@ import { VorgangDetailHeaderE2EComponent } from '../../../components/vorgang/vor import { VorgangFormularDatenE2EComponent } from '../../../components/vorgang/vorgang-formular.e2e.component'; import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; import { NO_AKTENZEICHEN, VorgangE2E, vorgangStatusLabelE2E } from '../../../model/vorgang'; -import { MainPage } from '../../../page-objects/main.po'; +import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; import { dropCollections, reload } from '../../../support/cypress-helper'; import { contains, exist, haveText, shouldFirstContains, shouldHaveAttributeBeGreaterThan, shouldHaveAttributeBeLowerThan } from '../../../support/cypress.util'; @@ -34,6 +34,7 @@ describe('Vorgang Detailansicht', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -47,6 +48,7 @@ describe('Vorgang Detailansicht', () => { it('should show header', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangHeader.getRoot()); }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.e2e-spec.ts index cb4b967375f9dac8017e703ffd3e9c8b4826164e..04c011a405433385a98d2539c52698ddf192bcd7 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.e2e-spec.ts @@ -43,20 +43,26 @@ describe('Vorgang-detailansicht filtered by organisationseinheit', () => { before(() => { loginAsKfinder(); - exist(vorgangList.getRoot()); waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) it('should open detailpage', () => { - visitUrl(authorizedUrl) + visitUrl(authorizedUrl); + waitForSpinnerToDisappear(); exist(detailPage.getRoot()); }) it('should not open detailpage', () => { - visitUrl(forbiddenUrl) + visitUrl(forbiddenUrl); + waitForSpinnerToDisappear(); notExist(detailPage.getRoot()); + }) + + it('should show snackbar', () => { + exist(snackbar.getCloseButton()); contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN); }) }) @@ -68,20 +74,26 @@ describe('Vorgang-detailansicht filtered by organisationseinheit', () => { before(() => { loginAsKordner(); - exist(vorgangList.getRoot()); waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) it('should open detailpage', () => { - visitUrl(authorizedUrl) + visitUrl(authorizedUrl); + waitForSpinnerToDisappear(); exist(detailPage.getRoot()); }) it('should not open detailpage', () => { - visitUrl(forbiddenUrl) + visitUrl(forbiddenUrl); + waitForSpinnerToDisappear(); notExist(detailPage.getRoot()); + }) + + it('should show snackbar', () => { + exist(snackbar.getCloseButton()); contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN); }) }) @@ -93,23 +105,41 @@ describe('Vorgang-detailansicht filtered by organisationseinheit', () => { before(() => { loginAsZonk(); - exist(vorgangList.getRoot()); waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) describe('for vorgang with assigned organisationseinheitenId', () => { it('should not open detailpage (for kordner)', () => { - visitUrl(authorizedUrl) + visitUrl(authorizedUrl); + waitForSpinnerToDisappear(); notExist(detailPage.getRoot()); + }) + + it('should show snackbar', () => { + exist(snackbar.getCloseButton()); contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN); }) + it('should close snackbar on close button', () => { + //FIXME Workaround, somewhere and somehow here are appearing multiple instances of snackbar(or the button) + snackbar.getCloseButton().click({ multiple: true }); + + notExist(snackbar.getCloseButton()); + notExist(snackbar.getMessage()); + }) + it('should not open detailpage (for kfinder)', () => { - visitUrl(forbiddenUrl) + visitUrl(forbiddenUrl); + waitForSpinnerToDisappear(); notExist(detailPage.getRoot()); + }) + + it('should show snackbar', () => { + exist(snackbar.getCloseButton()); contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN); }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-verwerfen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-verwerfen.e2e-spec.ts index 0d15e1c5b29f7d9e1acd5d833f6e47c1b08cc3cb..406f302306caf7fba1c9e696a8e0bd8580fca210 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-verwerfen.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-verwerfen.e2e-spec.ts @@ -30,6 +30,7 @@ describe('Vorgang Verwerfen', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -41,6 +42,7 @@ describe('Vorgang Verwerfen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangVerwerfen.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -51,17 +53,15 @@ describe('Vorgang Verwerfen', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangVerwerfen.status]); }) - it('should show snackBar message', () => { + it('should show snackBar', () => { vorgangFormularButtons.clickVerwerfenByButton(); + waitForSpinnerToDisappear(); - contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN); - }) - - it('should show snackBar close button', () => { exist(snackbar.getCloseButton()); + contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN); }) - it('should close snackBar', () => { + it('should close snackBar on close button', () => { snackbar.getCloseButton().click(); notExist(snackbar.getMessage()); @@ -78,13 +78,12 @@ describe('Vorgang Verwerfen', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Verworfen', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangVerwerfen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]); }) }) @@ -94,6 +93,7 @@ describe('Vorgang Verwerfen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangVerwerfenRevoke.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -104,23 +104,24 @@ describe('Vorgang Verwerfen', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangVerwerfenRevoke.status]); }) - it('should show snackBar message', () => { + it('should show snackBar', () => { vorgangPage.getSubnavigation().clickVerwerfenByIconButton(); + waitForSpinnerToDisappear(); - contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN); - }) - - it('should show snackBar close button', () => { exist(snackbar.getCloseButton()); + contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN); }) - it('should show progressbar', () => { + it('should close snackbar on revoke', () => { snackbar.getRevokeButton().click(); + waitForSpinnerToDisappear(); - exist(vorgangPage.getProgressBar()); + notExist(snackbar.getMessage()); }) it('should show status Neu', () => { + notExist(vorgangPage.getProgressBar()); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]); }) @@ -131,13 +132,12 @@ describe('Vorgang Verwerfen', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Neu', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangVerwerfenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]); }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.e2e-spec.ts index 1858838d553977c8fb374a22588823053dbdf3a2..c8f66d7b542e403c20c0bed24cc5d23042c104ab 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.e2e-spec.ts @@ -27,6 +27,7 @@ describe('Vorgang wiedereroeffnen', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -40,6 +41,7 @@ describe('Vorgang wiedereroeffnen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangBeschiedenWiedereroeffnen.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -52,15 +54,13 @@ describe('Vorgang wiedereroeffnen', () => { it('should show snackBar message', () => { vorgangFormularButtons.clickWiedereroeffnenByButton(); + waitForSpinnerToDisappear(); - contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); - }) - - it('should show snackBar close button', () => { exist(snackbar.getCloseButton()); + contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); }) - it('should close snackBar', () => { + it('should close snackBar on close', () => { snackbar.getCloseButton().click(); notExist(snackbar.getMessage()); @@ -72,13 +72,12 @@ describe('Vorgang wiedereroeffnen', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status In Bearbeitung', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangBeschiedenWiedereroeffnen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]); }) }) @@ -88,6 +87,7 @@ describe('Vorgang wiedereroeffnen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangBeschiedenWiedereroeffnenRevoke.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -99,18 +99,17 @@ describe('Vorgang wiedereroeffnen', () => { it('should show snackBar message', () => { vorgangPage.getSubnavigation().clickWiedereroeffnenByIconButton(); + waitForSpinnerToDisappear(); - contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); - }) - - it('should show snackBar close button', () => { exist(snackbar.getCloseButton()); + contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); }) - it('should show progressbar', () => { + it('should close snackbar on revoke', () => { snackbar.getRevokeButton().click(); + waitForSpinnerToDisappear(); - exist(vorgangPage.getProgressBar()); + notExist(snackbar.getMessage()); }) it('should show status Beschieden', () => { @@ -119,13 +118,12 @@ describe('Vorgang wiedereroeffnen', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Beschieden', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangBeschiedenWiedereroeffnenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.BESCHIEDEN]); }) }) @@ -138,6 +136,7 @@ describe('Vorgang wiedereroeffnen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnen.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -148,17 +147,15 @@ describe('Vorgang wiedereroeffnen', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenWiedereroeffnen.status]); }) - it('should show snackBar message', () => { + it('should show snackBar', () => { vorgangFormularButtons.clickWiedereroeffnenByButton(); + waitForSpinnerToDisappear(); - contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); - }) - - it('should show snackBar close button', () => { exist(snackbar.getCloseButton()); + contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); }) - it('should close snackBar', () => { + it('should close snackBar on close', () => { snackbar.getCloseButton().click(); notExist(snackbar.getMessage()); @@ -170,13 +167,12 @@ describe('Vorgang wiedereroeffnen', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status In Bearbeitung', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]); }) }) @@ -186,6 +182,7 @@ describe('Vorgang wiedereroeffnen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnenRevoke.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -196,35 +193,35 @@ describe('Vorgang wiedereroeffnen', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenWiedereroeffnenRevoke.status]); }) - it('should show snackBar message', () => { + it('should show snackBar', () => { vorgangPage.getSubnavigation().clickWiedereroeffnenByIconButton(); + waitForSpinnerToDisappear(); - contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); - }) - - it('should show snackBar close button', () => { exist(snackbar.getCloseButton()); + contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); }) - it('should show progressbar', () => { + it('should close snackbar on revoke', () => { snackbar.getRevokeButton().click(); + waitForSpinnerToDisappear(); - exist(vorgangPage.getProgressBar()); + notExist(snackbar.getMessage()); }) it('should show status Abgeschlossen', () => { + notExist(vorgangPage.getProgressBar()); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]); }) it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Abgeschlossen', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]); }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckholen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckholen.e2e-spec.ts index f22c2435761230070c1ec32e386a11d41bfeb015..65e409c051f981a604756c121cea4c0ba6377b71 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckholen.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckholen.e2e-spec.ts @@ -30,6 +30,7 @@ describe('Vorgang Zurueckholen', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -41,6 +42,7 @@ describe('Vorgang Zurueckholen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangZurueckholen.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -53,15 +55,13 @@ describe('Vorgang Zurueckholen', () => { it('should show snackBar message', () => { vorgangFormularButtons.getZurueckholenButton().click(); + waitForSpinnerToDisappear(); - contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT); - }) - - it('should show snackBar close button', () => { exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT); }) - it('should close snackBar', () => { + it('should close snackBar on close button', () => { snackBar.getCloseButton().click(); notExist(snackBar.getMessage()); @@ -77,13 +77,12 @@ describe('Vorgang Zurueckholen', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Neu', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangZurueckholen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]); }) }) @@ -93,6 +92,7 @@ describe('Vorgang Zurueckholen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangZurueckholenRevoke.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -103,23 +103,24 @@ describe('Vorgang Zurueckholen', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangZurueckholenRevoke.status]); }) - it('should show snackBar message', () => { + it('should show snackBar', () => { vorgangPage.getSubnavigation().getZurueckholenIconButton().click(); + waitForSpinnerToDisappear(); - contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT); - }) - - it('should show snackBar close button', () => { exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT); }) - it('should show progressbar', () => { + it('should close snackbar on revoke', () => { snackBar.getRevokeButton().click(); + waitForSpinnerToDisappear(); - exist(vorgangPage.getProgressBar()); + notExist(snackBar.getMessage()); }) - it('should show status Verworfen', () => { + it('should show status Abgeschlossen', () => { + notExist(vorgangPage.getProgressBar()); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]); }) @@ -130,13 +131,12 @@ describe('Vorgang Zurueckholen', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Verworfen', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangZurueckholenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]); }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.e2e-spec.ts index 5369892a4a69a2dba8d398761ecc0cda846f714a..26b97a8d3e6246618865b62106ebe903914d2fd2 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.e2e-spec.ts @@ -32,6 +32,7 @@ describe('Vorgang Zurueckstellen', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -43,6 +44,7 @@ describe('Vorgang Zurueckstellen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangZurueckstellen.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -54,19 +56,16 @@ describe('Vorgang Zurueckstellen', () => { }) it('should have assigned user(Bearbeiter)', () => { - waitForSpinnerToDisappear(); exist(userContainer.getRoot()); exist(userContainer.getIconContainer().getAssignedIcon()); }) it('should show snackBar message', () => { vorgangFormularButtons.clickZurueckstellenByButton(); + waitForSpinnerToDisappear(); - contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGESTELLT); - }) - - it('should show snackBar close button', () => { exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGESTELLT); }) it('should close snackBar', () => { @@ -81,13 +80,12 @@ describe('Vorgang Zurueckstellen', () => { it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status Zurückgestellt', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangZurueckstellen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ANGENOMMEN]); }) }) @@ -97,6 +95,7 @@ describe('Vorgang Zurueckstellen', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgangZurueckstellenRevoke.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -109,33 +108,33 @@ describe('Vorgang Zurueckstellen', () => { it('should show snackBar message', () => { vorgangPage.getSubnavigation().clickZurueckstellenByIconButton(); + waitForSpinnerToDisappear(); - contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGESTELLT); - }) - - it('should show snackBar close button', () => { exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGESTELLT); }) - it('should show progressbar', () => { + it('should close snackbar on revoke', () => { snackBar.getRevokeButton().click(); + waitForSpinnerToDisappear(); - exist(vorgangPage.getProgressBar()); + notExist(snackBar.getMessage()); }) it('should show status In Bearbeitung', () => { + notExist(vorgangPage.getProgressBar()); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]); }) it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) it('should have status In Bearbeitung', () => { - waitForSpinnerToDisappear(); - haveText(vorgangList.getListItem(vorgangZurueckstellenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]); }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.e2e-spec.ts index 67c6139fd149877e2ab73d2c0d283140bacd87eb..8f4f7a8ffd29da11826f5d8d9958988c5d96c929 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.e2e-spec.ts @@ -57,8 +57,8 @@ describe('VorgangList Wiedervorlagen Next Frist', () => { loginAsSabine(); - exist(vorgangList.getRoot()); waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) after(() => { diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.e2e-spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..f1965d99c729fabcfa424f835f127b8057e1b0cb --- /dev/null +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.e2e-spec.ts @@ -0,0 +1,92 @@ +import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; +import { EingangE2E, VorgangE2E } from '../../../model/vorgang'; +import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; +import { dropCollections } from '../../../support/cypress-helper'; +import { exist, notExist } from '../../../support/cypress.util'; +import { ORGANISATIONSEINHEITEN_ID_FOR_KFINDER, ORGANISATIONSEINHEITEN_ID_FOR_KORDNER } from '../../../support/data.util'; +import { loginAsKfinder, loginAsKordner, loginAsRichard, loginAsZonk } from '../../../support/user-util'; +import { buildVorgang, createVorgang, initVorgaenge, objectIds } from '../../../support/vorgang-util'; + +describe('VorgangList', () => { + const mainPage: MainPage = new MainPage(); + const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList(); + + const eingangForKFinder: EingangE2E = { ...createVorgang().eingangs[0], zustaendigeStelle: { organisationseinheitenId: ORGANISATIONSEINHEITEN_ID_FOR_KFINDER } }; + const vorgangForKFinder: VorgangE2E = { ...buildVorgang(objectIds[0], 'VorgangVisibleToKFinder'), eingangs: [eingangForKFinder] }; + + const eingangForKOrdner: EingangE2E = { ...createVorgang().eingangs[0], zustaendigeStelle: { organisationseinheitenId: ORGANISATIONSEINHEITEN_ID_FOR_KORDNER } }; + const vorgangForKOrdner: VorgangE2E = { ...buildVorgang(objectIds[1], 'VorgangVisibleToKOrdner'), eingangs: [eingangForKOrdner] }; + + before(() => { + initVorgaenge([vorgangForKFinder, vorgangForKOrdner]); + }) + + after(() => { + dropCollections(); + }) + + describe('filtered/authorized', () => { + + describe('by user kfinder', () => { + + before(() => { + loginAsKfinder(); + + waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); + }) + + it('should show authorized vorgaenge', () => { + exist(vorgangList.getListItem(vorgangForKFinder.name).getRoot()); + notExist(vorgangList.getListItem(vorgangForKOrdner.name).getRoot()); + }) + }) + + describe('by user kordner', () => { + + before(() => { + loginAsKordner(); + + waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); + }) + + it('should show authorized vorgaenge', () => { + exist(vorgangList.getListItem(vorgangForKOrdner.name).getRoot()); + notExist(vorgangList.getListItem(vorgangForKFinder.name).getRoot()); + }) + }) + + describe('by user zonk', () => { + + const vorgang: VorgangE2E = createVorgang(); + + before(() => { + loginAsZonk(); + + waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); + }) + + it('should show authorized empty vorgaenge', () => { + notExist(vorgangList.getListItem(vorgangForKOrdner.name).getRoot()); + notExist(vorgangList.getListItem(vorgangForKFinder.name).getRoot()); + notExist(vorgangList.getListItem(vorgang.name).getRoot()); + }) + }) + + describe('by user richard', () => { + + before(() => { + loginAsRichard(); + + waitForSpinnerToDisappear(); + }) + + it('should show hint message while have no roles', () => { + notExist(vorgangList.getRoot()); + exist(vorgangList.getNoRoleMessage()); + }) + }) + }) +}) \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.filtered-by-organisationseinheit.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.filtered-by-organisationseinheit.e2e-spec.ts deleted file mode 100644 index a34bf37792c33edaad29827f089cda91bf558ec6..0000000000000000000000000000000000000000 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.filtered-by-organisationseinheit.e2e-spec.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; -import { EingangE2E, VorgangE2E } from '../../../model/vorgang'; -import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; -import { dropCollections } from '../../../support/cypress-helper'; -import { exist, notExist } from '../../../support/cypress.util'; -import { ORGANISATIONSEINHEITEN_ID_FOR_KFINDER, ORGANISATIONSEINHEITEN_ID_FOR_KORDNER } from '../../../support/data.util'; -import { loginAsKfinder, loginAsKordner, loginAsZonk } from '../../../support/user-util'; -import { buildVorgang, createVorgang, initVorgaenge, objectIds } from '../../../support/vorgang-util'; - -describe('VorgangList filtered by organisationseinheit', () => { - const mainPage: MainPage = new MainPage(); - const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList(); - - const eingangForKFinder: EingangE2E = { ...createVorgang().eingangs[0], zustaendigeStelle: { organisationseinheitenId: ORGANISATIONSEINHEITEN_ID_FOR_KFINDER } }; - const vorgangForKFinder: VorgangE2E = { ...buildVorgang(objectIds[0], 'VorgangVisibleToKFinder'), eingangs: [eingangForKFinder] }; - - const eingangForKOrdner: EingangE2E = { ...createVorgang().eingangs[0], zustaendigeStelle: { organisationseinheitenId: ORGANISATIONSEINHEITEN_ID_FOR_KORDNER } }; - const vorgangForKOrdner: VorgangE2E = { ...buildVorgang(objectIds[1], 'VorgangVisibleToKOrdner'), eingangs: [eingangForKOrdner] }; - - before(() => { - initVorgaenge([vorgangForKFinder, vorgangForKOrdner]); - }) - - after(() => { - dropCollections(); - }) - - describe('on user kfinder', () => { - - before(() => { - loginAsKfinder(); - - exist(vorgangList.getRoot()); - waitForSpinnerToDisappear(); - }) - - it('should check list', () => { - exist(vorgangList.getListItem(vorgangForKFinder.name).getRoot()); - notExist(vorgangList.getListItem(vorgangForKOrdner.name).getRoot()); - }) - }) - - describe('on user kordner', () => { - - before(() => { - loginAsKordner(); - - exist(vorgangList.getRoot()); - waitForSpinnerToDisappear(); - }) - - it('should check list', () => { - exist(vorgangList.getListItem(vorgangForKOrdner.name).getRoot()); - notExist(vorgangList.getListItem(vorgangForKFinder.name).getRoot()); - }) - }) - - describe('on user zonk', () => { - - const vorgang: VorgangE2E = createVorgang(); - - before(() => { - loginAsZonk(); - - exist(vorgangList.getRoot()); - waitForSpinnerToDisappear(); - }) - - it('should check list', () => { - notExist(vorgangList.getListItem(vorgangForKOrdner.name).getRoot()); - notExist(vorgangList.getListItem(vorgangForKFinder.name).getRoot()); - notExist(vorgangList.getListItem(vorgang.name).getRoot()); - }) - }) -}) \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts index b6952573e714611b15933a1e6454dd4ca50bc861..1fa2c0c8f192151232620a5b18288730884f2038 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts @@ -37,8 +37,8 @@ describe('VorgangList Suche', () => { loginAsSabine(); - exist(vorgangList.getRoot()); waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) after(() => { @@ -81,8 +81,8 @@ describe('VorgangList Suche', () => { beforeEach(() => { doSearchWith(requestId); - waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); vorgangStayInList.getRoot().click(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); @@ -133,8 +133,8 @@ describe('VorgangList Suche', () => { loginAsSabine(); - exist(vorgangList.getRoot()); waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) after(() => { @@ -263,8 +263,8 @@ describe('VorgangList Suche', () => { loginAsSabine();; - exist(vorgangList.getRoot()); waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) after(() => { @@ -281,8 +281,8 @@ describe('VorgangList Suche', () => { it('should show result by vorgang name', () => { doSearchWith(vorgangNameToMatch); - waitForSpinnerToDisappear(); + exist(byVorgangName.getRoot()); notExist(byAktenzeichen.getRoot()); notExist(byAntragstellerVorname.getRoot()); @@ -292,8 +292,8 @@ describe('VorgangList Suche', () => { it('should show result by aktenzeichen', () => { doSearchWith(aktenzeichenToMatch); - waitForSpinnerToDisappear(); + notExist(byVorgangName.getRoot()); exist(byAktenzeichen.getRoot()); notExist(byAntragstellerVorname.getRoot()); @@ -303,8 +303,8 @@ describe('VorgangList Suche', () => { it('should show result by antragsteller vorname', () => { doSearchWith(antragstellerVornameToMatch); - waitForSpinnerToDisappear(); + notExist(byVorgangName.getRoot()); notExist(byAktenzeichen.getRoot()); exist(byAntragstellerVorname.getRoot()); @@ -314,8 +314,8 @@ describe('VorgangList Suche', () => { it('should show result by antragsteller nachname', () => { doSearchWith(antragstellerNachnameToMatch); - waitForSpinnerToDisappear(); + notExist(byVorgangName.getRoot()); notExist(byAktenzeichen.getRoot()); notExist(byAntragstellerVorname.getRoot()); @@ -325,8 +325,8 @@ describe('VorgangList Suche', () => { it('should show result by requestId/eingangskennzeichen', () => { doSearchWith(requestIdToMatch); - waitForSpinnerToDisappear(); + notExist(byVorgangName.getRoot()); notExist(byAktenzeichen.getRoot()); notExist(byAntragstellerVorname.getRoot()); @@ -336,8 +336,8 @@ describe('VorgangList Suche', () => { it('search button should show search result', () => { doSearchWith(requestIdToMatch); - waitForSpinnerToDisappear(); + notExist(byVorgangName.getRoot()); }) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.e2e-spec.ts index d50a8ae4105283a7041facd9ddc2ad1566b3ed1c..10106d131b9ce4651c8cce2fad6f5fd6980c0ff6 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.e2e-spec.ts @@ -3,7 +3,7 @@ import localeDe from '@angular/common/locales/de'; import localeDeExtra from '@angular/common/locales/extra/de'; import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; import { VorgangE2E } from '../../../model/vorgang'; -import { MainPage } from '../../../page-objects/main.po'; +import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; import { WiedervorlagePage } from '../../../page-objects/wiedervorlage.po'; import { dropCollections } from '../../../support/cypress-helper'; @@ -20,13 +20,14 @@ describe('Vorgang Detailansicht Wiedervorlage routing', () => { const vorgangPage: VorgangPage = new VorgangPage(); const wiedervorlagePage: WiedervorlagePage = new WiedervorlagePage(); - let vorgang: VorgangE2E = createVorgang(); + const vorgang: VorgangE2E = createVorgang(); before(() => { initVorgang(vorgang); loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -36,30 +37,35 @@ describe('Vorgang Detailansicht Wiedervorlage routing', () => { it('Open Vorgang-Detail-Page', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) it('click on create wiedervorlage icon button should open page', () => { vorgangPage.getSubnavigation().clickWiedervorlageIconButton(); + waitForSpinnerToDisappear(); exist(wiedervorlagePage.getSubnavigation().getRoot()); }) it('click on navigate back', () => { wiedervorlagePage.getSubnavigation().navigateBack(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) it('click on create wiedervorlage button should open page', () => { vorgangPage.getWiedervorlagenContainer().getCreateWiedervorlageButton().click(); + waitForSpinnerToDisappear(); exist(wiedervorlagePage.getSubnavigation().getRoot()); }) it('click on navigate back', () => { wiedervorlagePage.getSubnavigation().navigateBack(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.e2e-spec.ts index f4cba20491929dc51591384784419a59a350e68b..d16dae4aa356bd1e72fc8b44c6c0015966b90fe4 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.e2e-spec.ts @@ -51,8 +51,8 @@ describe('Vorgang Wiedervorlagen List', () => { loginAsSabine(); - exist(vorgangList.getRoot()); waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); }) after(() => { @@ -61,6 +61,7 @@ describe('Vorgang Wiedervorlagen List', () => { it('navigate to vorgang detail', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.e2e-spec.ts index ba33064224e38a6e59e2c85881154acd8d54170f..72f6b9bf35d522885ace442ade1a8eb6fcf07516 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.e2e-spec.ts @@ -46,6 +46,7 @@ describe('Wiedervorlage attachments', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -57,48 +58,57 @@ describe('Wiedervorlage attachments', () => { it('should show vorgang detail page on click on list item', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) it('should show wiedervorlage page on click on create wiedervorlage button', () => { wiedervorlageContainerInVorgang.getCreateWiedervorlageButton().click(); - waitForSpinnerToDisappear(); + exist(wiedervorlagePage.getRoot()); }) it('should show empty attachment after upload', () => { - uploadEmptyFile(attachmentContainer.getUploadInput(), TEST_FILE_WITHOUT_CONTENT) + uploadEmptyFile(attachmentContainer.getUploadInput(), TEST_FILE_WITHOUT_CONTENT); + waitForSpinnerToDisappear(); exist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot()); }) it('should download empty attachment on click', () => { attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getDownloadButton().click(); - waitForSpinnerToDisappear(); + exist(readFileFromDownloads(TEST_FILE_WITHOUT_CONTENT)); }) it('should show attachment with content after download', () => { uploadFile(attachmentContainer.getUploadInput(), TEST_FILE_WITH_CONTENT); + waitForSpinnerToDisappear(); exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot()); }) - it('should error snackbar after upload to large file', () => { + it('should error snackbar after upload to large file', { defaultCommandTimeout: 30000 }, () => { uploadFile(attachmentContainer.getUploadInput(), TEST_FILE_WITH_CONTENT_46MB); + waitForSpinnerToDisappear(); exist(snackbar.getMessage()); contains(snackbar.getMessage(), BinaryFileSnackbarMessageE2E.ATTACHMENT_NOT_ADDED.replace('{size}', '40MB')); + }) + + it('should close snackbar on close button', () => { snackbar.getCloseButton().click(); + + notExist(snackbar.getMessage()); }) it('should download attachment on click', () => { attachmentList.getItem(TEST_FILE_WITH_CONTENT).getDownloadButton().click(); - waitForSpinnerToDisappear(); + exist(readFileFromDownloads(TEST_FILE_WITH_CONTENT)); }) @@ -126,15 +136,15 @@ describe('Wiedervorlage attachments', () => { it('should download empty attachment on click in list', () => { wiedervorlageContainerInVorgang.getWiedervorlage(wiedervorlage.betreff).getAttachmentContainer().getList().getItem(TEST_FILE_WITHOUT_CONTENT).getDownloadButton().click(); - waitForSpinnerToDisappear(); + exist(readFileFromDownloads(TEST_FILE_WITHOUT_CONTENT)); }) it('should download attachment on click in list', () => { wiedervorlageContainerInVorgang.getWiedervorlage(wiedervorlage.betreff).getAttachmentContainer().getList().getItem(TEST_FILE_WITH_CONTENT).getDownloadButton().click(); - waitForSpinnerToDisappear(); + exist(readFileFromDownloads(TEST_FILE_WITH_CONTENT)); }) }) @@ -145,6 +155,7 @@ describe('Wiedervorlage attachments', () => { it('should open wiedervorlage page', () => { wiedervorlageComp.getLink().click(); + waitForSpinnerToDisappear(); exist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot()); exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot()); @@ -183,6 +194,7 @@ describe('Wiedervorlage attachments', () => { it('should not show any attachments', () => { wiedervorlageComp.getLink().click(); + waitForSpinnerToDisappear(); notExist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITHOUT_CONTENT).getRoot()); notExist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITH_CONTENT).getRoot()); @@ -196,18 +208,21 @@ describe('Wiedervorlage attachments', () => { it('should open wiedervorlage page', () => { wiedervorlageComp.getLink().click(); + waitForSpinnerToDisappear(); exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot()); }) it('should mark as erledigt', () => { subnavigation.erledigen(); + waitForSpinnerToDisappear(); containClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); }) it('should mark as open', () => { subnavigation.wiedereroeffnen(); + waitForSpinnerToDisappear(); notContainClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); }) @@ -218,5 +233,4 @@ describe('Wiedervorlage attachments', () => { haveLength(attachmentList.getRoot(), 1); }) }) - }) \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.e2e-spec.ts index c30efb2c9e26b234f830b35f6b3149a2c4b16b55..12e23b39b5bd51e5ad0046acd2cbff709e41299f 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.e2e-spec.ts @@ -49,9 +49,9 @@ describe('Wiedervorlage should be authorized by role', () => { it(`should NOT show vorgang in status ${VorgangStatusE2E.NEU}`, () => { visitUrl(vorgangInStatusNeuUrl); + waitForSpinnerToDisappear(); exist(mainPage.getHeader().getTitle()); - waitForSpinnerToDisappear(); notExist(wiedervorlagePage.getRoot()); }) @@ -59,18 +59,18 @@ describe('Wiedervorlage should be authorized by role', () => { it(`${VorgangStatusE2E.IN_BEARBEITUNG}`, () => { visitUrl(vorgangInStatusInBearbeitungUrl); + waitForSpinnerToDisappear(); exist(mainPage.getHeader().getTitle()); - waitForSpinnerToDisappear(); contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN); notExist(wiedervorlagePage.getRoot()); }) it(`${VorgangStatusE2E.ABGESCHLOSSEN}`, () => { visitUrl(vorgangInStatusAbgeschlossenUrl); + waitForSpinnerToDisappear(); exist(mainPage.getHeader().getTitle()); - waitForSpinnerToDisappear(); notExist(wiedervorlagePage.getRoot()); notExist(wiedervorlageSubnavigation.getRoot()); contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN); @@ -78,9 +78,9 @@ describe('Wiedervorlage should be authorized by role', () => { it(`${VorgangStatusE2E.BESCHIEDEN}`, () => { visitUrl(vorgangInStatusBeschiedenUrl); + waitForSpinnerToDisappear(); exist(mainPage.getHeader().getTitle()); - waitForSpinnerToDisappear(); notExist(wiedervorlagePage.getRoot()); notExist(wiedervorlageSubnavigation.getRoot()); contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN); diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.e2e-spec.ts index 535e28642e37b956b3256a1335a634a6bfc858fe..2d3bcaa65cdf8b7948a87549e1c4c34e4206e7c7 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.e2e-spec.ts @@ -40,6 +40,7 @@ describe('Wiedervorlage', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -51,6 +52,7 @@ describe('Wiedervorlage', () => { it('should show vorgang detail by click on vorgang in list', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -60,6 +62,7 @@ describe('Wiedervorlage', () => { it('should open wiedervorlage pag by click on create wiedervorlage button', () => { vorgangPage.getWiedervorlagenContainer().getCreateWiedervorlageButton().click(); + waitForSpinnerToDisappear(); exist(wiedervorlagePage.getSubnavigation().getRoot()); }) @@ -68,6 +71,7 @@ describe('Wiedervorlage', () => { wiedervorlageCotainer.getBetreff().clear().type('Ab'); wiedervorlageCotainer.getSpeichernButton().click(); + waitForSpinnerToDisappear(); exist(wiedervorlageCotainer.getBetreffError()); }) @@ -76,6 +80,7 @@ describe('Wiedervorlage', () => { wiedervorlageCotainer.getBetreff().clear().type(faker.random.alphaNumeric(41)); wiedervorlageCotainer.getSpeichernButton().click(); + waitForSpinnerToDisappear(); exist(wiedervorlageCotainer.getBetreffError()); }) @@ -85,6 +90,7 @@ describe('Wiedervorlage', () => { wiedervorlageCotainer.getFrist().clear().type('1.1.2020'); wiedervorlageCotainer.getSpeichernButton().click(); + waitForSpinnerToDisappear(); exist(wiedervorlageCotainer.getDatumError()); }) @@ -95,6 +101,7 @@ describe('Wiedervorlage', () => { wiedervorlageCotainer.getFrist().clear().type(wiedervorlageFrist); wiedervorlageCotainer.getSpeichernButton().click(); + waitForSpinnerToDisappear(); exist(snackbar.getMessage()); haveText(snackbar.getMessage(), MessagesE2E.WIEDERVORLAGE_ANGELEGT.replace('%s', wiedervorlageBetreff)); @@ -127,6 +134,7 @@ describe('Wiedervorlage', () => { it('should open Vorgang-Detail-Page on click on vorgang in list', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -135,6 +143,7 @@ describe('Wiedervorlage', () => { const wiedervorlageInVorgang: WiedervorlageInVorgangE2EComponent = vorgangPage.getWiedervorlagenContainer().getWiedervorlage(wiedervorlageBetreff); wiedervorlageInVorgang.getLink().click(); + waitForSpinnerToDisappear(); exist(wiedervorlagePage.getSubnavigation().getRoot()); }) @@ -151,6 +160,7 @@ describe('Wiedervorlage', () => { wiedervorlageCotainer.getFrist().clear().type(formatDateLocal(new Date(), 'dd.MM.yyyy')); wiedervorlageCotainer.getSpeichernButton().click(); + waitForSpinnerToDisappear(); exist(snackbar.getMessage()); haveText(snackbar.getMessage(), MessagesE2E.WIEDERVORLAGE_GESPEICHERT.replace('%s', 'Editierter Betreff')); diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.erledigen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.erledigen.e2e-spec.ts index 59a41a3ddf76e6be4e5a16b5689299f960b68974..8ed26664b938399c9619e0791efafdc7d567d775 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.erledigen.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.erledigen.e2e-spec.ts @@ -7,7 +7,7 @@ import { WiedervorlageSubnavigationE2EComponent } from '../../../components/wied import { WiedervorlagenInVorgangE2EComponent } from '../../../components/wiedervorlage/wiedervorlagen-in-vorgang.e2e.component'; import { VorgangE2E } from '../../../model/vorgang'; import { WiedervorlageE2E } from '../../../model/wiedervorlage'; -import { MainPage } from '../../../page-objects/main.po'; +import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; import { WiedervorlagePage } from '../../../page-objects/wiedervorlage.po'; import { dropCollections } from '../../../support/cypress-helper'; @@ -41,6 +41,7 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { loginAsSabine(); + waitForSpinnerToDisappear(); exist(mainPage.getVorgangList().getRoot()); }) @@ -52,6 +53,7 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { it('Open Vorgang-Detail-Page', () => { mainPage.getVorgangList().getListItem(vorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); exist(vorgangPage.getVorgangDetailHeader().getRoot()); }) @@ -63,18 +65,21 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { it('should open wiedervorlage on click', () => { wiedervorlage.getLink().click(); + waitForSpinnerToDisappear(); exist(subnavigation.getRoot()); }) it('should mark as erledigt after do erledigen', () => { subnavigation.erledigen(); + waitForSpinnerToDisappear(); containClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); }) it('should open vorgang detail on click on back', () => { subnavigation.navigateBack(); + waitForSpinnerToDisappear(); exist(vorgangDetailHeader.getRoot()); }) @@ -86,18 +91,21 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { it('should open wiedervorlage on click', () => { wiedervorlage.getLink().click(); + waitForSpinnerToDisappear(); exist(subnavigation.getRoot()); }) it('should mark as open after do wiedereroeffnen', () => { subnavigation.wiedereroeffnen(); + waitForSpinnerToDisappear(); notContainClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); }) it('should open vorgang detail on click on back', () => { subnavigation.navigateBack(); + waitForSpinnerToDisappear(); exist(vorgangDetailHeader.getRoot()); }) @@ -109,30 +117,35 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { it('should open wiedervorlage on click', () => { wiedervorlage.getLink().click(); + waitForSpinnerToDisappear(); exist(subnavigation.getRoot()); }) it('should mark as erledigt', () => { subnavigation.erledigen(); + waitForSpinnerToDisappear(); containClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); }) it('should mark as open', () => { subnavigation.wiedereroeffnen(); + waitForSpinnerToDisappear(); notContainClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); }) it('should mark as erledigt', () => { subnavigation.erledigen(); + waitForSpinnerToDisappear(); containClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); }) it('should mark as open', () => { subnavigation.wiedereroeffnen(); + waitForSpinnerToDisappear(); notContainClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); }) diff --git a/goofy-client/apps/goofy-e2e/src/support/user-util.ts b/goofy-client/apps/goofy-e2e/src/support/user-util.ts index 8c205092db57422b6353aeef62a68bb03a41e614..148d262be6246794a3a93ed8b67b489f3f20c97f 100644 --- a/goofy-client/apps/goofy-e2e/src/support/user-util.ts +++ b/goofy-client/apps/goofy-e2e/src/support/user-util.ts @@ -21,6 +21,7 @@ enum DatabaseUser { KFINDER = 'user/user_kfinder.json', KORDNER = 'user/user_kordner.json', PETER = 'user/user_peter.json', + RICHARD = 'user/user_richard.json', SABINE = 'user/user_sabine.json', ZONK = 'user/user_zonk.json' } @@ -41,6 +42,10 @@ export function loginAsPeter(): void { login(DatabaseUser.PETER); } +export function loginAsRichard(): void { + login(DatabaseUser.RICHARD); +} + export function loginAsSabine(): void { login(DatabaseUser.SABINE); } diff --git a/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss b/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss index 89fc0e3b6c753a8f96b78f11004fe86ce9892805..25c38013e2a41900e131a44781410d0a7947294c 100644 --- a/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss +++ b/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss @@ -1,6 +1,7 @@ @use '@angular/material' as mat; $grey: #777; +$greyLight: rgba(0, 0, 0, 0.08); $background: #fafafa; $dark-background: #303030; diff --git a/goofy-client/libs/command-shared/src/lib/command.util.spec.ts b/goofy-client/libs/command-shared/src/lib/command.util.spec.ts index 1002d550218dfdc411faa7c542ed7b750b090e6e..432fb515888fcf6969ad36da92f7413eba1b08c7 100644 --- a/goofy-client/libs/command-shared/src/lib/command.util.spec.ts +++ b/goofy-client/libs/command-shared/src/lib/command.util.spec.ts @@ -65,25 +65,35 @@ describe('CommandUtil', () => { }) }) - describe('getPendingForwardCommand', () => { + describe('getPendingCommandByOrder', () => { const order: string = 'dummyOrder'; + const anotherOrder: string = 'anotherOrder'; it('should return null on non existing pending command', () => { const listResource: CommandListResource = createCommandListResource(); - const pendingCommand: CommandResource = getPendingCommandByOrder(listResource, order); + const pendingCommand: CommandResource = getPendingCommandByOrder(listResource, [order]); expect(pendingCommand).toBeNull(); }) - it('should return existing pending command', () => { - const pendingForwardCommand: CommandResource = { ...createCommandResource(), order }; - const listResource: CommandListResource = createCommandListResource([pendingForwardCommand]); + it('should return existing pending command on single order', () => { + const command: CommandResource = { ...createCommandResource(), order }; + const listResource: CommandListResource = createCommandListResource([command]); - const pendingCommand: CommandResource = getPendingCommandByOrder(listResource, order); + const pendingCommand: CommandResource = getPendingCommandByOrder(listResource, [order]); - expect(pendingCommand).toBe(pendingForwardCommand); + expect(pendingCommand).toBe(command); + }) + + it('should return existing pending command on multiple orders', () => { + const command: CommandResource = { ...createCommandResource(), order: anotherOrder }; + const listResource: CommandListResource = createCommandListResource([command]); + + const pendingCommand: CommandResource = getPendingCommandByOrder(listResource, [order, anotherOrder]); + + expect(pendingCommand).toBe(command); }) }) }) \ No newline at end of file diff --git a/goofy-client/libs/command-shared/src/lib/command.util.ts b/goofy-client/libs/command-shared/src/lib/command.util.ts index 9dcbd90775befb85c776dc61492d959bdbd6423e..059d50eb855e30a32b0a9347d67662eefff8cd28 100644 --- a/goofy-client/libs/command-shared/src/lib/command.util.ts +++ b/goofy-client/libs/command-shared/src/lib/command.util.ts @@ -27,8 +27,8 @@ export function getEmbeddedCommandResources(commandListResource: CommandListReso return getEmbeddedResource<CommandResource[]>(commandListResource, CommandListLinkRel.COMMAND_LIST); } -export function getPendingCommandByOrder(pendingCommands: CommandListResource, commandOrder: any): CommandResource { - var commands: CommandResource[] = getEmbeddedCommandResources(pendingCommands).filter(command => command.order == commandOrder); +export function getPendingCommandByOrder(pendingCommands: CommandListResource, commandOrder: any[]): CommandResource { + var commands: CommandResource[] = getEmbeddedCommandResources(pendingCommands).filter(command => commandOrder.includes(command.order)); return commands.length > 0 ? commands[0] : null; } diff --git a/goofy-client/libs/postfach-shared/src/lib/postfach.model.ts b/goofy-client/libs/postfach-shared/src/lib/postfach.model.ts index ac93192a7a4aeee007690262a9026467b5bbe414..16b14da973576f667d55f47b6a9e35ac31e94115 100644 --- a/goofy-client/libs/postfach-shared/src/lib/postfach.model.ts +++ b/goofy-client/libs/postfach-shared/src/lib/postfach.model.ts @@ -27,7 +27,7 @@ export enum ReplyOption { } export enum PostfachOrder { - SEND_POSTFACH_MAIL = 'SEND_POSTFACH_MAIL', + SEND_POSTFACH_NACHRICHT = 'SEND_POSTFACH_NACHRICHT', RESEND_POSTFACH_MAIL = 'RESEND_POSTFACH_MAIL' } diff --git a/goofy-client/libs/postfach-shared/src/lib/postfach.util.spec.ts b/goofy-client/libs/postfach-shared/src/lib/postfach.util.spec.ts index 8c4013d38bbb218b4ac52b3acf0852db3f6c9e59..4048bf842743adee9370e896f611b9a6ee26d910 100644 --- a/goofy-client/libs/postfach-shared/src/lib/postfach.util.spec.ts +++ b/goofy-client/libs/postfach-shared/src/lib/postfach.util.spec.ts @@ -13,7 +13,7 @@ describe('PostfachUtil', () => { it('should have order', () => { const command: CreatePostfachMailCommand = createSendPostfachMailCommand(postfachMail); - expect(command.order).toEqual(PostfachOrder.SEND_POSTFACH_MAIL); + expect(command.order).toEqual(PostfachOrder.SEND_POSTFACH_NACHRICHT); }) it('should have body', () => { diff --git a/goofy-client/libs/postfach-shared/src/lib/postfach.util.ts b/goofy-client/libs/postfach-shared/src/lib/postfach.util.ts index 45f7d021e76e5c50148c2dc47bedd0105038b428..42cb6bb5a63ffdc9360a5f51dd2aa1da444864d3 100644 --- a/goofy-client/libs/postfach-shared/src/lib/postfach.util.ts +++ b/goofy-client/libs/postfach-shared/src/lib/postfach.util.ts @@ -2,7 +2,7 @@ import { postfachNachrichtMessageCodeMessages } from './postfach.message-code'; import { CreatePostfachMailCommand, Direction, PostfachMail, PostfachMailResource, PostfachOrder } from './postfach.model'; export function createSendPostfachMailCommand(postfachMail: PostfachMail): CreatePostfachMailCommand { - return { order: PostfachOrder.SEND_POSTFACH_MAIL, body: postfachMail }; + return { order: PostfachOrder.SEND_POSTFACH_NACHRICHT, body: postfachMail }; } export function createResendPostfachMailCommand(): CreatePostfachMailCommand { diff --git a/goofy-client/libs/tech-shared/src/index.ts b/goofy-client/libs/tech-shared/src/index.ts index b607f46b67b53b24bfee67f8af75735ed9d821f2..7e0f749f00c0b9bc0c3f6c8895db70bec44535fb 100644 --- a/goofy-client/libs/tech-shared/src/index.ts +++ b/goofy-client/libs/tech-shared/src/index.ts @@ -11,6 +11,7 @@ export * from './lib/pipe/file-size.pipe'; export * from './lib/pipe/format-date-with-time.pipe'; export * from './lib/pipe/format-to-pretty-date.pipe'; export * from './lib/pipe/has-link.pipe'; +export * from './lib/pipe/not-has-link.pipe'; export * from './lib/pipe/to-embedded-resource.pipe'; export * from './lib/pipe/to-resource-uri.pipe'; export * from './lib/pipe/to-traffic-light-tooltip.pipe'; diff --git a/goofy-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.spec.ts b/goofy-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..c7517c2753666e5651cbfae1fcfa477f60780b86 --- /dev/null +++ b/goofy-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.spec.ts @@ -0,0 +1,21 @@ +import { Resource } from '@ngxp/rest'; +import { createDummyResource } from 'libs/tech-shared/test/resource'; +import { NotHasLinkPipe } from './not-has-link.pipe'; + +describe('NotHasLinkPipe', () => { + const selfLink: string = 'self'; + const dummyLink: string = 'dummy'; + const resource: Resource = createDummyResource([selfLink]); + const pipe: NotHasLinkPipe = new NotHasLinkPipe(); + + it('resource has link', () => { + const result: boolean = pipe.transform(resource, selfLink); + + expect(result).toBe(false); + }) + it('resource doesnt has link', () => { + const result: boolean = pipe.transform(resource, dummyLink); + + expect(result).toBe(true); + }) +}) diff --git a/goofy-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.ts b/goofy-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.ts new file mode 100644 index 0000000000000000000000000000000000000000..d68f0417cea19776db39a12a21129d85b0f11269 --- /dev/null +++ b/goofy-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.ts @@ -0,0 +1,9 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { hasLink, Resource } from '@ngxp/rest'; + +@Pipe({ name: 'notHasLink' }) +export class NotHasLinkPipe implements PipeTransform { + transform(resource: Resource, link: string) { + return !hasLink(resource, link); + } +} diff --git a/goofy-client/libs/tech-shared/src/lib/tech-shared.module.ts b/goofy-client/libs/tech-shared/src/lib/tech-shared.module.ts index 2ed55173a712884078afff7af605bde8623913b7..67328c81f7d110f528ba7d4282651a251f6ddf24 100644 --- a/goofy-client/libs/tech-shared/src/lib/tech-shared.module.ts +++ b/goofy-client/libs/tech-shared/src/lib/tech-shared.module.ts @@ -8,6 +8,7 @@ import { FileSizePipe } from './pipe/file-size.pipe'; import { FormatDateWithTimePipe } from './pipe/format-date-with-time.pipe'; import { FormatToPrettyDatePipe } from './pipe/format-to-pretty-date.pipe'; import { HasLinkPipe } from './pipe/has-link.pipe'; +import { NotHasLinkPipe } from './pipe/not-has-link.pipe'; import { ToEmbeddedResourcesPipe } from './pipe/to-embedded-resource.pipe'; import { ToResourceUriPipe } from './pipe/to-resource-uri.pipe'; import { ToTrafficLightTooltipPipe } from './pipe/to-traffic-light-tooltip.pipe'; @@ -20,6 +21,7 @@ import { ToTrafficLightPipe } from './pipe/to-traffic-light.pipe'; EnumToLabelPipe, FormatDateWithTimePipe, HasLinkPipe, + NotHasLinkPipe, ToResourceUriPipe, ToTrafficLightPipe, ToTrafficLightTooltipPipe, @@ -32,6 +34,7 @@ import { ToTrafficLightPipe } from './pipe/to-traffic-light.pipe'; EnumToLabelPipe, FormatDateWithTimePipe, HasLinkPipe, + NotHasLinkPipe, ToResourceUriPipe, ToTrafficLightPipe, ToTrafficLightTooltipPipe, diff --git a/goofy-client/libs/test-utils/src/lib/helper.ts b/goofy-client/libs/test-utils/src/lib/helper.ts index e16d3029e0f10ca2d8a5602bc54d52a835d69c9e..94887c81370ac5a428485249e842ddc34158afdd 100644 --- a/goofy-client/libs/test-utils/src/lib/helper.ts +++ b/goofy-client/libs/test-utils/src/lib/helper.ts @@ -10,15 +10,15 @@ function getDebugElementFromFixtureByType<T>(fixture: ComponentFixture<any>, com return fixture.debugElement.query(By.directive(component)); } -export function getDebugElementFromFixtureByCss(fixture: ComponentFixture<any>, query: string): DebugElement { - return fixture.debugElement.query(By.css(query)); -} - export function getElementFromFixture(fixture: ComponentFixture<any>, htmlElement: string): any { return fixture.nativeElement.querySelector(htmlElement); } export function dispatchEventFromFixture(fixture: ComponentFixture<any>, elementSelector: string, event: string): void { - const element = fixture.debugElement.query(By.css(elementSelector)); + const element = getDebugElementFromFixtureByCss(fixture, elementSelector) element.nativeElement.dispatchEvent(new Event(event)); } + +export function getDebugElementFromFixtureByCss(fixture: ComponentFixture<any>, query: string): DebugElement { + return fixture.debugElement.query(By.css(query)); +} \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.html b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.html new file mode 100644 index 0000000000000000000000000000000000000000..312d42ddadb72b90bf3559e644f3f8601a9a4955 --- /dev/null +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.html @@ -0,0 +1,3 @@ +<button mat-icon-button (click)="close.emit()" data-test-id="snackbar-close-button"> + <mat-icon data-test-class="icon">clear</mat-icon> +</button> \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.scss b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..5e2fce20b698f7394eacec58ae3fbd517862d2ee --- /dev/null +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.scss @@ -0,0 +1,50 @@ +@use 'sass:map'; +@use '@angular/material' as mat; +@import 'variables'; + +.message { + white-space: pre-wrap +} + +::ng-deep .mat-snack-bar-container.error { + min-width: 240px; + max-width: 90vw; + + border: 3px solid mat.get-color-from-palette($warnPalette); + background-color: lighten(mat.get-color-from-palette($warnPalette), 38%); + color: rgba(#000, 0.89); + position: relative; + + &:before { + position: absolute; + content: url("/assets/icons/error_outline_white.svg"); + display: block; + background-color: mat.get-color-from-palette($warnPalette); + left: 0; + top: 0; + padding: 11px 9px 11px 7px; + color: #fff; + height: 100%; + } + + > div { + margin-left: 44px; + } +} + +.wrapper { + display: flex; + align-items: center; +} + +.mat-button { + color: mat.get-color-from-palette($primaryPalette, lighter); +} + +button { + margin: -12px -8px -12px 8px +} + +::ng-deep body.dark .mat-snack-bar-container .mat-button { + color: mat.get-color-from-palette($primaryPalette); +} diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.spec.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..4a419ae9594946ac9edc382392cddd4bc5b1f47d --- /dev/null +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.spec.ts @@ -0,0 +1,39 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatIcon } from '@angular/material/icon'; +import { dispatchEventFromFixture, mock } from '@goofy-client/test-utils'; +import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; +import { EventEmitter } from 'stream'; +import { SnackbarCloseButtonComponent } from './snackbar-close-button.component'; + +describe('SnackbarCloseButtonComponent', () => { + let component: SnackbarCloseButtonComponent; + let fixture: ComponentFixture<SnackbarCloseButtonComponent>; + + const closeButton: string = getDataTestIdOf('snackbar-close-button'); + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ + MatIcon, + SnackbarCloseButtonComponent + ] + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(SnackbarCloseButtonComponent); + component = fixture.componentInstance; + component.close = { ...<any>mock(EventEmitter), emit: jest.fn() }; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('click should emit action', () => { + dispatchEventFromFixture(fixture, closeButton, 'click'); + + expect(component.close.emit).toHaveBeenCalled(); + }) +}); diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..5c900fda5a90fde396aec8b66322c6e0fc2c28e9 --- /dev/null +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.ts @@ -0,0 +1,11 @@ +import { Component, EventEmitter, Output } from '@angular/core'; + +@Component({ + selector: 'goofy-client-snackbar-close-button', + templateUrl: './snackbar-close-button.component.html', + styleUrls: ['./snackbar-close-button.component.scss'] +}) +export class SnackbarCloseButtonComponent { + + @Output() close: EventEmitter<void> = new EventEmitter(); +} diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html index c8c31801c567d84bb3da0905aaaf804bd5d15e57..1c87bdc69fac21eb254ec3b12845f862e50bb6cb 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html @@ -1,7 +1,5 @@ <div class="wrapper"> <span data-test-id="snackbar-message" class="message">{{ message }}</span> - <button mat-icon-button (click)="close()" data-test-id="snackbar-close-button"> - <mat-icon data-test-class="icon">clear</mat-icon> - </button> + <goofy-client-snackbar-close-button (close)="close()"></goofy-client-snackbar-close-button> </div> diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts index d0ead57221621e13aac4de1e9df89518b681e003..452e8208aff9c3aa5f9510af797dc2719f4b807b 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts @@ -3,6 +3,8 @@ import { MatIconModule } from '@angular/material/icon'; import { MatSnackBarRef, MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar'; import { mock } from '@goofy-client/test-utils'; import { SnackBarData } from '@goofy-client/ui'; +import { MockComponent } from 'ng-mocks'; +import { SnackbarCloseButtonComponent } from '../snackbar-close-button/snackbar-close-button.component'; import { SnackbarErrorComponent } from './snackbar-error.component'; describe('SnackbarErrorComponent', () => { @@ -18,7 +20,8 @@ describe('SnackbarErrorComponent', () => { MatIconModule ], declarations: [ - SnackbarErrorComponent + SnackbarErrorComponent, + MockComponent(SnackbarCloseButtonComponent) ], providers: [ { @@ -42,4 +45,12 @@ describe('SnackbarErrorComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + describe('close button', () => { + it('should close the snackbar', () => { + component.close(); + + expect(snackBarRef.dismiss).toHaveBeenCalled(); + }) + }) }); diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html index 5aefe84d96b0c8698f29084a2a58becac9a9a507..dae817d661748914e85446df69190ca1c0d3d6a2 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html @@ -7,6 +7,4 @@ Rückgängig </button> -<button mat-icon-button (click)="close()" data-test-id="snackbar-close-button"> - <mat-icon data-test-class="icon">clear</mat-icon> -</button> \ No newline at end of file +<goofy-client-snackbar-close-button (close)="close()"></goofy-client-snackbar-close-button> \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts index 7e295a2c20d40831dc026a57ae107af79a6af03d..cd8a3825c547c18f2ffb7f83f8efeec7754c7b65 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts @@ -4,6 +4,9 @@ import { MatSnackBarModule, MatSnackBarRef, MAT_SNACK_BAR_DATA } from '@angular/ import { mock } from '@goofy-client/test-utils'; import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel'; import { createCommandResource } from 'libs/command-shared/test/command'; +import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; +import { MockComponent } from 'ng-mocks'; +import { SnackbarCloseButtonComponent } from '../snackbar-close-button/snackbar-close-button.component'; import { SnackBarData } from '../snackbar.service'; import { SnackbarInfoComponent } from './snackbar-info.component'; @@ -14,7 +17,7 @@ describe('SnackbarInfoComponent', () => { const snackBarData: SnackBarData = { message: 'Message', commandResource: createCommandResource() }; const snackBarRef = { ...mock(MatSnackBarRef), dissmis: jest.fn(), dismissWithAction: jest.fn() }; - const revokeButton: string = '[data-test-id="snackbar-revoke-button"]'; + const revokeButton: string = getDataTestIdOf('snackbar-revoke-button'); beforeEach(async () => { await TestBed.configureTestingModule({ @@ -22,7 +25,10 @@ describe('SnackbarInfoComponent', () => { MatSnackBarModule, MatIconModule ], - declarations: [SnackbarInfoComponent], + declarations: [ + SnackbarInfoComponent, + MockComponent(SnackbarCloseButtonComponent) + ], providers: [ { provide: MAT_SNACK_BAR_DATA, @@ -46,7 +52,7 @@ describe('SnackbarInfoComponent', () => { expect(component).toBeTruthy(); }); - describe('clear button', () => { + describe('close button', () => { it('should close the snackbar', () => { component.close(); diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts index 29774c23c1fc4365593a112e30c3f871977cc930..9ae931738e196b19d43fd0158c48cc82ed5d2213 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts @@ -21,8 +21,8 @@ describe('SnackBarService', () => { beforeEach(async () => { await TestBed.configureTestingModule({ providers: [ - { provide: MatSnackBar, useValue: mockMatSnackBar }, - ], + { provide: MatSnackBar, useValue: mockMatSnackBar }, + ], }).compileComponents(); service = TestBed.inject(SnackBarService); matSnackBar = TestBed.inject(MatSnackBar); @@ -37,6 +37,13 @@ describe('SnackBarService', () => { beforeEach(() => { service.listenOnRevokeAction = jest.fn(); service.listenOnAfterDismissed = jest.fn(); + service.closeSnackBarIfVisible = jest.fn(); + }) + + it('should close snackbar if exists', () => { + service.show(commandResource, message); + + expect(service.closeSnackBarIfVisible).toHaveBeenCalled(); }) it('should open from component', () => { @@ -73,8 +80,16 @@ describe('SnackBarService', () => { beforeEach(() => { service.listenOnAfterDismissed = jest.fn(); + service.closeSnackBarIfVisible = jest.fn(); }) + it('should close snackbar if exists', () => { + service.showError(message); + + expect(service.closeSnackBarIfVisible).toHaveBeenCalled(); + }) + + it('should open from component', () => { service.showError(message); @@ -89,4 +104,27 @@ describe('SnackBarService', () => { expect(service.listenOnAfterDismissed).toHaveBeenCalled(); }) }) + + describe('close snackbar if visible', () => { + + beforeEach(() => { + service.closeSnackBar = jest.fn(); + }) + + it('should dismiss snack bar if ref exists ', () => { + service.snackBarRef = <any>{}; + + service.closeSnackBarIfVisible(); + + expect(service.closeSnackBar).toHaveBeenCalled(); + }) + + it('should do nothing if ref not exists ', () => { + service.snackBarRef = undefined; + + service.closeSnackBarIfVisible(); + + expect(service.closeSnackBar).not.toHaveBeenCalled(); + }) + }) }) diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts index 6921eaba96738d7df1a2049512b7a93917ee9ee6..f91d60b7cf1522da9ab8f7a954bcb8d4f51aee76 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { MatSnackBar, MatSnackBarRef } from '@angular/material/snack-bar'; import { CommandResource, CommandStatus } from '@goofy-client/command-shared'; +import { isNotNil } from '@goofy-client/tech-shared'; import { isNil } from 'lodash-es'; import { Subscription } from 'rxjs'; import { SnackbarErrorComponent } from './snackbar-error/snackbar-error.component'; @@ -10,12 +11,13 @@ import { SnackbarInfoComponent } from './snackbar-info/snackbar-info.component'; export class SnackBarService { private subscription: Subscription; - private snackBarRef: MatSnackBarRef<SnackbarInfoComponent | SnackbarErrorComponent>; + snackBarRef: MatSnackBarRef<SnackbarInfoComponent | SnackbarErrorComponent>; private durationTime: number = 10000; constructor(private snackBar: MatSnackBar) { } public show(commandResource: CommandResource, message: string, revokeAction?: () => void): void { + this.closeSnackBarIfVisible(); if (commandResource.status === CommandStatus.ERROR) { this.showError(message); } else { @@ -25,10 +27,15 @@ export class SnackBarService { } public showError(message: string): void { + this.closeSnackBarIfVisible(); this.snackBarRef = this.snackBar.openFromComponent(SnackbarErrorComponent, { data: { message }, duration: this.durationTime, panelClass: 'error' }); this.listenOnAfterDismissed(); } + closeSnackBarIfVisible() { + if (isNotNil(this.snackBarRef)) this.closeSnackBar(); + } + private listenToActions(revokeAction: () => void): void { this.listenOnAfterDismissed(); this.listenOnRevokeAction(revokeAction); @@ -45,7 +52,7 @@ export class SnackBarService { this.subscription = this.snackBarRef.afterDismissed().subscribe(() => this.closeSnackBar()); } - private closeSnackBar(): void { + closeSnackBar(): void { this.snackBarRef.dismiss(); this.unsubscribe(); } diff --git a/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.html b/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.html index a55d8825a0d7c2ed79a65982b3f2ff5c4cf82981..5df4f31d06f208fdf8d4c19ba2202b046050b9ec 100644 --- a/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.html +++ b/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.html @@ -1,3 +1,3 @@ -<div class="progressbar-overlay" *ngIf="isVisible" data-test-class="progressbar-overlay"> - <mat-progress-bar mode="indeterminate"></mat-progress-bar> +<div *ngIf="isVisible" class="progressbar-overlay" data-test-class="progressbar-overlay"> + <mat-progress-bar data-test-id="progress-bar" mode="indeterminate"></mat-progress-bar> </div> diff --git a/goofy-client/libs/ui/src/lib/ui/ui.module.ts b/goofy-client/libs/ui/src/lib/ui/ui.module.ts index 06404bf99418f9d86b3ce83af7c10e3d41e756f1..c482f7fc5c5248928f8c0ac3a5b03f48d66ed7fe 100644 --- a/goofy-client/libs/ui/src/lib/ui/ui.module.ts +++ b/goofy-client/libs/ui/src/lib/ui/ui.module.ts @@ -24,6 +24,7 @@ import { TechSharedModule } from '@goofy-client/tech-shared'; import { de } from 'date-fns/locale'; import { HttpConnectionTimeoutInterceptor } from '../interceptor/http-connection-timeout.interceptor'; import { HttpErrorInterceptor } from '../interceptor/http-error.interceptor'; +import { SnackbarCloseButtonComponent } from '../snackbar/snackbar-close-button/snackbar-close-button.component'; import { SnackbarErrorComponent } from '../snackbar/snackbar-error/snackbar-error.component'; import { SnackbarInfoComponent } from '../snackbar/snackbar-info/snackbar-info.component'; import { ButtonWithSpinnerComponent } from './button-with-spinner/button-with-spinner.component'; @@ -102,6 +103,7 @@ const modules = [ InternalServerErrorDialogComponent, ConnectionTimeoutRetryDialogComponent, ConnectionTimeoutRetryFailDialogComponent, + SnackbarCloseButtonComponent ], imports: [ ...modules diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html index 97fc42277eea4729dd3fa51424713417da6a6027..9c2459d066398fccc76b6c80b675274ab1a1951c 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html @@ -12,17 +12,22 @@ </goofy-client-vorgang-detail-meta-data> </mat-tab> <mat-tab label="Datenrepräsentation ({{vorgangWithEingang.eingang.numberOfRepresentations}})" - [disabled]="!(vorgangWithEingang | hasLink:vorgangWithEingangLinkRel.REPRESENTATIONS)"> + [disabled]="vorgangWithEingang | notHasLink:vorgangWithEingangLinkRel.REPRESENTATIONS"> <ng-template matTabContent> <goofy-client-vorgang-detail-representation-list data-test-id="tab-representations-list" [vorgangWithEingang]="vorgangWithEingang"></goofy-client-vorgang-detail-representation-list> </ng-template> </mat-tab> <mat-tab label="Anhänge ({{vorgangWithEingang.eingang.numberOfAttachments}})" - [disabled]="!(vorgangWithEingang | hasLink:vorgangWithEingangLinkRel.ATTACHMENTS)"> + [disabled]="vorgangWithEingang | notHasLink:vorgangWithEingangLinkRel.ATTACHMENTS"> <ng-template matTabContent> <goofy-client-vorgang-detail-attachment-list data-test-id="tab-attachments-list" [vorgangWithEingang]="vorgangWithEingang"></goofy-client-vorgang-detail-attachment-list> </ng-template> </mat-tab> + <mat-tab label="Historie" *ngIf="vorgangWithEingang | hasLink:vorgangWithEingangLinkRel.HISTORIE"> + <ng-template matTabContent> + <goofy-client-vorgang-historie-container data-test-id="tab-historie-container" [vorgangWithEingang]="vorgangWithEingang"></goofy-client-vorgang-historie-container> + </ng-template> + </mat-tab> </mat-tab-group> </goofy-client-expansion-panel> diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts index 0511ec5727b1138a01d3327dddf91f25c386258d..a7694c5a1f8a67302f84f6cc55beb31caef24170 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts @@ -1,9 +1,10 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatTabsModule } from '@angular/material/tabs'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { HasLinkPipe } from '@goofy-client/tech-shared'; +import { HasLinkPipe, NotHasLinkPipe } from '@goofy-client/tech-shared'; import { getElementFromFixture } from '@goofy-client/test-utils'; import { ExpansionPanelComponent } from '@goofy-client/ui'; +import { VorgangHistorieContainerComponent } from '@goofy-client/vorgang-historie'; import { VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@goofy-client/vorgang-shared'; import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; import { MockComponent } from 'ng-mocks'; @@ -20,10 +21,12 @@ describe('VorgangDetailFormularDatenComponent', () => { const tabMetaData: string = 'div[role=tab]:nth-child(2)'; const tabRepresentations: string = 'div[role=tab]:nth-child(3)'; const tabAttachments: string = 'div[role=tab]:nth-child(4)'; + const tabHistorie: string = 'div[role=tab]:nth-child(5)'; const vorgang: VorgangWithEingangResource = createVorgangWithEingangResource(); const vorgangWithAttachments: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.ATTACHMENTS]); const vorgangWithRepresentations: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.REPRESENTATIONS]); + const vorgangWithHistorie: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.HISTORIE]); beforeEach(async () => { await TestBed.configureTestingModule({ @@ -33,12 +36,14 @@ describe('VorgangDetailFormularDatenComponent', () => { ], declarations: [ HasLinkPipe, + NotHasLinkPipe, VorgangDetailFormularDatenComponent, MockComponent(VorgangDetailAntragDataComponent), MockComponent(VorgangDetailMetaDataComponent), MockComponent(VorgangDetailAttachmentListComponent), MockComponent(VorgangDetailRepresentationListComponent), MockComponent(ExpansionPanelComponent), + MockComponent(VorgangHistorieContainerComponent), ] }).compileComponents(); }); @@ -139,4 +144,24 @@ describe('VorgangDetailFormularDatenComponent', () => { }) }) + describe('Tab Historie', () => { + it('should be visible if Link "historie" exists', () => { + component.vorgangWithEingang = vorgangWithHistorie; + + fixture.detectChanges(); + const tab = getElementFromFixture(fixture, tabHistorie); + + expect(tab).toBeInTheDocument(); + }) + + it('should not be visible if no Link "historie"', () => { + component.vorgangWithEingang = vorgang; + + fixture.detectChanges(); + const tab = getElementFromFixture(fixture, tabHistorie); + + expect(tab).not.toBeInTheDocument(); + }) + }) + }); diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html index 5e8ecaaa94dbfd9a031161240945412b77654320..d019a1ac5866afe7234426fd7c62d8f530898a10 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html @@ -11,4 +11,4 @@ </ng-container> -<goofy-client-progress-bar data-test-id="progress-bar" [stateResource]="revokeCommandStateResource$ | async"></goofy-client-progress-bar> \ No newline at end of file +<goofy-client-progress-bar [stateResource]="revokeCommandStateResource$ | async"></goofy-client-progress-bar> \ No newline at end of file diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts index 4ea2a3fedfb8a38e50c2c0c1879bac72b8f830f6..fbb58cedeb0551ee16dbdaee75859f158ae3b8e6 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts @@ -10,6 +10,7 @@ import { TechSharedModule } from '@goofy-client/tech-shared'; import { UiModule } from '@goofy-client/ui'; import { UserProfileModule } from '@goofy-client/user-profile'; import { UserProfileSharedModule } from '@goofy-client/user-profile-shared'; +import { VorgangHistorieModule } from '@goofy-client/vorgang-historie'; import { VorgangSharedModule } from '@goofy-client/vorgang-shared'; import { VorgangSharedUiModule } from '@goofy-client/vorgang-shared-ui'; import { WiedervorlageModule } from '@goofy-client/wiedervorlage'; @@ -59,7 +60,8 @@ const routes: Routes = [ UserProfileModule, UserProfileSharedModule, PostfachSharedModule, - PostfachModule + PostfachModule, + VorgangHistorieModule ], declarations: [ VorgangDetailPageComponent, diff --git a/goofy-client/libs/vorgang-historie/.eslintrc.json b/goofy-client/libs/vorgang-historie/.eslintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..28f19b630511beab4ad3ff61ffce5a45f7430728 --- /dev/null +++ b/goofy-client/libs/vorgang-historie/.eslintrc.json @@ -0,0 +1,36 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts"], + "extends": [ + "plugin:@nrwl/nx/angular", + "plugin:@angular-eslint/template/process-inline-templates" + ], + "rules": { + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "goofyClient", + "style": "camelCase" + } + ], + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": "goofy-client", + "style": "kebab-case" + } + ] + } + }, + { + "files": ["*.html"], + "extends": ["plugin:@nrwl/nx/angular-template"], + "rules": {} + } + ] +} diff --git a/goofy-client/libs/vorgang-historie/README.md b/goofy-client/libs/vorgang-historie/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0412a90d25be161803edbe2751e3635c48dcbc31 --- /dev/null +++ b/goofy-client/libs/vorgang-historie/README.md @@ -0,0 +1,7 @@ +# vorgang-historie + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test vorgang-historie` to execute the unit tests. diff --git a/goofy-client/libs/vorgang-historie/jest.config.js b/goofy-client/libs/vorgang-historie/jest.config.js new file mode 100644 index 0000000000000000000000000000000000000000..707cb488ad0a8db33a85c90c2fab768d9ecac3f5 --- /dev/null +++ b/goofy-client/libs/vorgang-historie/jest.config.js @@ -0,0 +1,21 @@ +module.exports = { + displayName: 'vorgang-historie', + preset: '../../jest.preset.js', + setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'], + globals: { + 'ts-jest': { + tsconfig: '<rootDir>/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + }, + coverageDirectory: '../../coverage/libs/vorgang-historie', + transform: { + '^.+\\.(ts|mjs|js|html)$': 'jest-preset-angular', + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/goofy-client/libs/vorgang-historie/src/index.ts b/goofy-client/libs/vorgang-historie/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..41a6b1400e8baf95216e1d8593b45b0b8faff17d --- /dev/null +++ b/goofy-client/libs/vorgang-historie/src/index.ts @@ -0,0 +1,3 @@ +export * from './lib/vorgang-historie.module'; + +export * from './lib/vorgang-historie-container/vorgang-historie-container.component'; diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.html b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.html new file mode 100644 index 0000000000000000000000000000000000000000..429eccc43389cd64517c4b3bb1998f2ba7ca5037 --- /dev/null +++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.html @@ -0,0 +1 @@ +<goofy-client-vorgang-historie-list data-test-id="tab-historie-list-container" [vorgangWithEingang]="vorgangWithEingang"></goofy-client-vorgang-historie-list> \ No newline at end of file diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.scss b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.spec.ts b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..5fbc53485f39ab439b2bcff922b89ce61a04f872 --- /dev/null +++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.spec.ts @@ -0,0 +1,24 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VorgangHistorieContainerComponent } from './vorgang-historie-container.component'; + +describe('VorgangHistorieContainerComponent', () => { + let component: VorgangHistorieContainerComponent; + let fixture: ComponentFixture<VorgangHistorieContainerComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [VorgangHistorieContainerComponent], + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(VorgangHistorieContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.ts b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..7da65f22da2b3028a257b27b3826bfa7154d4461 --- /dev/null +++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.ts @@ -0,0 +1,13 @@ +import { Component, Input } from '@angular/core'; +import { VorgangWithEingangResource } from '@goofy-client/vorgang-shared'; + +@Component({ + selector: 'goofy-client-vorgang-historie-container', + templateUrl: './vorgang-historie-container.component.html', + styleUrls: ['./vorgang-historie-container.component.scss'], +}) +export class VorgangHistorieContainerComponent { + + @Input() vorgangWithEingang: VorgangWithEingangResource; + +} diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.html b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.html new file mode 100644 index 0000000000000000000000000000000000000000..4ffbccbc10733efb76f1ecaf553a57a727d43d2f --- /dev/null +++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.html @@ -0,0 +1,3 @@ +<ul> + <li data-test-id="created-at">Der Vorgang wurde am {{ vorgangWithEingang.createdAt | formatDateWithTimePipe:false }} erstellt.</li> +</ul> \ No newline at end of file diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.scss b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..72a25c5cf822d4d8165725a12287832f6269080d --- /dev/null +++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.scss @@ -0,0 +1,12 @@ +@import "variables"; + +ul { + margin-top: 0; + padding-left: 0; + width: 100%; + + li { + border-bottom: 1px solid $greyLight; + padding: 0.75rem 0; + } +} \ No newline at end of file diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.spec.ts b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..1908346811cd19a353c854de26805f98f5ad4073 --- /dev/null +++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.spec.ts @@ -0,0 +1,48 @@ +import { registerLocaleData } from '@angular/common'; +import localeDe from '@angular/common/locales/de'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { FormatDateWithTimePipe } from '@goofy-client/tech-shared'; +import { getElementFromFixture } from '@goofy-client/test-utils'; +import { VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@goofy-client/vorgang-shared'; +import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; +import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; +import { VorgangHistorieListComponent } from './vorgang-historie-list.component'; + +registerLocaleData(localeDe); + +describe('VorgangHistorieListComponent', () => { + let component: VorgangHistorieListComponent; + let fixture: ComponentFixture<VorgangHistorieListComponent>; + + const vorgangWithHistorie: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.HISTORIE]); + const createdAtElement: string = getDataTestIdOf('created-at'); + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ + FormatDateWithTimePipe, + VorgangHistorieListComponent + ], + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(VorgangHistorieListComponent); + component = fixture.componentInstance; + component.vorgangWithEingang = vorgangWithHistorie; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('on vorgang', () => { + + it('should have Historie list', () => { + const element = getElementFromFixture(fixture, createdAtElement); + + expect(element).toBeInstanceOf(HTMLLIElement); + }); + }); +}); diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.ts b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..bd015726a6fe0a1979b9fdd5d83bff0d87d72670 --- /dev/null +++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.ts @@ -0,0 +1,13 @@ +import { Component, Input } from '@angular/core'; +import { VorgangWithEingangResource } from '@goofy-client/vorgang-shared'; + +@Component({ + selector: 'goofy-client-vorgang-historie-list', + templateUrl: './vorgang-historie-list.component.html', + styleUrls: ['./vorgang-historie-list.component.scss'], +}) +export class VorgangHistorieListComponent { + + @Input() vorgangWithEingang: VorgangWithEingangResource; + +} diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie.module.ts b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..41f06719072483d05854a282803e6dc699e8f779 --- /dev/null +++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie.module.ts @@ -0,0 +1,20 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { TechSharedModule } from '@goofy-client/tech-shared'; +import { VorgangHistorieContainerComponent } from './vorgang-historie-container/vorgang-historie-container.component'; +import { VorgangHistorieListComponent } from './vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component'; + +@NgModule({ + imports: [ + CommonModule, + TechSharedModule + ], + declarations: [ + VorgangHistorieContainerComponent, + VorgangHistorieListComponent, + ], + exports: [ + VorgangHistorieContainerComponent, + ], +}) +export class VorgangHistorieModule {} diff --git a/goofy-client/libs/vorgang-historie/src/test-setup.ts b/goofy-client/libs/vorgang-historie/src/test-setup.ts new file mode 100644 index 0000000000000000000000000000000000000000..1100b3e8a6ed08f4b5c27a96471846d57023c320 --- /dev/null +++ b/goofy-client/libs/vorgang-historie/src/test-setup.ts @@ -0,0 +1 @@ +import 'jest-preset-angular/setup-jest'; diff --git a/goofy-client/libs/vorgang-historie/tsconfig.json b/goofy-client/libs/vorgang-historie/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..518abe89089dd06c8c6430da3f5f7c9105c10cd2 --- /dev/null +++ b/goofy-client/libs/vorgang-historie/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/goofy-client/libs/vorgang-historie/tsconfig.lib.json b/goofy-client/libs/vorgang-historie/tsconfig.lib.json new file mode 100644 index 0000000000000000000000000000000000000000..a2a53880f8274e73d8c264e347047cbd8c1f1cf8 --- /dev/null +++ b/goofy-client/libs/vorgang-historie/tsconfig.lib.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [] + }, + "exclude": ["src/test-setup.ts", "**/*.spec.ts", "**/*.test.ts"], + "include": ["**/*.ts"] +} diff --git a/goofy-client/libs/vorgang-historie/tsconfig.spec.json b/goofy-client/libs/vorgang-historie/tsconfig.spec.json new file mode 100644 index 0000000000000000000000000000000000000000..ff36e0edd33bbc39279480063c3c8e62e8be27ef --- /dev/null +++ b/goofy-client/libs/vorgang-historie/tsconfig.spec.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "files": ["src/test-setup.ts"], + "include": ["**/*.test.ts", "**/*.spec.ts", "**/*.d.ts"] +} diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts index aa3c06d5f237beb44245203e769956ba7a26d298..0f7f646640c7cff4edebda7b522e51b1c286e786 100644 --- a/goofy-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts +++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts @@ -28,4 +28,5 @@ export enum VorgangWithEingangLinkRel { PENDING_COMMANDS = 'pending-commands', ASSIGN = 'assign', REPRESENTATIONS = 'representations', + HISTORIE = 'historie', } \ No newline at end of file diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts index dc1f216f7bb4c5205dd12f7e9f7bd843e6656c73..05b8cef25a4727432d96f3806e1f22e4a999e6dc 100644 --- a/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts +++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts @@ -85,7 +85,7 @@ export class VorgangService { setPendingForwardCommand(pendingCommandList: CommandListResource): void { if (!this.pendingForwardCommand$.value.loaded) { - this.setPendingForwardSingleCommand(createStateResource(getPendingCommandByOrder(pendingCommandList, VorgangOrder.FORWARD))); + this.setPendingForwardSingleCommand(createStateResource(getPendingCommandByOrder(pendingCommandList, [VorgangOrder.FORWARD]))); } } @@ -95,7 +95,7 @@ export class VorgangService { handlePendingSendPostfachMailCommand(pendingCommandList: CommandListResource): void { if (!this.pendingSendPostfachMailCommand$.value.loaded) { - this.setPendingSendPostfachMailCommand(createStateResource(getPendingCommandByOrder(pendingCommandList, PostfachOrder.SEND_POSTFACH_MAIL))); + this.setPendingSendPostfachMailCommand(createStateResource(getPendingCommandByOrder(pendingCommandList, [PostfachOrder.SEND_POSTFACH_NACHRICHT]))); } } diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.html b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.html new file mode 100644 index 0000000000000000000000000000000000000000..c244b2559d54624b7c16b7a010ecbef0eddeaa41 --- /dev/null +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.html @@ -0,0 +1 @@ +<goofy-client-vorgang-list-page [apiRootStateResource]="apiRootStateResource$ | async"></goofy-client-vorgang-list-page> \ No newline at end of file diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.scss b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.spec.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..5151bc413161b0ac0029b4efdcb2be2eca0928b8 --- /dev/null +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.spec.ts @@ -0,0 +1,45 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ApiRootService } from '@goofy-client/api-root-shared'; +import { mock } from '@goofy-client/test-utils'; +import { MockComponent } from 'ng-mocks'; +import { VorgangListPageComponent } from '../vorgang-list-page/vorgang-list-page.component'; +import { VorgangListPageContainerComponent } from './vorgang-list-page-container.component'; + +describe('VorgangListPageContainerComponent', () => { + let component: VorgangListPageContainerComponent; + let fixture: ComponentFixture<VorgangListPageContainerComponent>; + + const apiRootService = mock(ApiRootService); + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ + VorgangListPageContainerComponent, + MockComponent(VorgangListPageComponent) + ], + providers: [{ + provide: ApiRootService, + useValue: apiRootService + }] + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(VorgangListPageContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('onInit', () => { + + it('should call apiRootService', () => { + component.ngOnInit(); + + expect(apiRootService.getApiRoot).toHaveBeenCalled(); + }) + }) +}); diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..ecc0ea6837efe767b36e46c08a73ee662d041fc1 --- /dev/null +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.ts @@ -0,0 +1,20 @@ +import { Component, OnInit } from '@angular/core'; +import { ApiRootResource, ApiRootService } from '@goofy-client/api-root-shared'; +import { StateResource } from '@goofy-client/tech-shared'; +import { Observable } from 'rxjs'; + +@Component({ + selector: 'goofy-client-vorgang-list-page-container', + templateUrl: './vorgang-list-page-container.component.html', + styleUrls: ['./vorgang-list-page-container.component.scss'], +}) +export class VorgangListPageContainerComponent implements OnInit { + + apiRootStateResource$: Observable<StateResource<ApiRootResource>>; + + constructor(private apiRootService: ApiRootService) { } + + ngOnInit(): void { + this.apiRootStateResource$ = this.apiRootService.getApiRoot(); + } +} \ No newline at end of file diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.html b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.html index 2bf1a8ddb3fa9fe14514a55299a3034ef1045f33..bafd229827f85b6d530d8b78e524e068ddfccd90 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.html +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.html @@ -1,2 +1,6 @@ <goofy-client-subnavigation class="mat-app-background"></goofy-client-subnavigation> -<goofy-client-vorgang-list-container></goofy-client-vorgang-list-container> + +<goofy-client-vorgang-list-container *ngIf="apiRootStateResource?.resource | hasLink: apiRootLinkRel.VORGAENGE; else showNoRoleMessage" data-test-id="vorgaenge-list"></goofy-client-vorgang-list-container> +<ng-template #showNoRoleMessage> + <h1 data-test-id="user-no-role-message">Die Allgemeine Fachanwendung ist wegen fehlender Rollen nicht benutzbar.</h1> +</ng-template> \ No newline at end of file diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.scss b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.scss index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1f8ba303033ec012306500158c50e3a082bc3ab0 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.scss +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.scss @@ -0,0 +1,13 @@ +@import "variables"; + +h1 { + text-align: center; + margin: 0; + padding: 1rem; +} + +:host-context(.dark) { + h1 { + background-color: $dark-background; + } +} diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.spec.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.spec.ts index 1548673e95fbf1a263d7a20160f9ff5403b8ec56..95184f30ba5b5314c55717c5969569c6bb2af316 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.spec.ts +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.spec.ts @@ -1,18 +1,28 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { VorgangListPageComponent } from './vorgang-list-page.component'; -import { MockComponent } from 'ng-mocks'; -import { SubnavigationComponent } from 'libs/ui/src/lib/ui/subnavigation/subnavigation.component'; +import { ApiRootLinkRel } from '@goofy-client/api-root-shared'; +import { createEmptyStateResource, createStateResource, HasLinkPipe } from '@goofy-client/tech-shared'; +import { getElementFromFixture } from '@goofy-client/test-utils'; +import { SpinnerComponent } from '@goofy-client/ui'; import { VorgangListContainerComponent } from '@goofy-client/vorgang'; +import { createApiRootResource } from 'libs/api-root-shared/test/api-root'; +import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; +import { SubnavigationComponent } from 'libs/ui/src/lib/ui/subnavigation/subnavigation.component'; +import { MockComponent } from 'ng-mocks'; +import { VorgangListPageComponent } from './vorgang-list-page.component'; describe('VorgangListPageComponent', () => { let component: VorgangListPageComponent; let fixture: ComponentFixture<VorgangListPageComponent>; + const userMessage: string = getDataTestIdOf('user-no-role-message'); + const vorgaengeList: string = getDataTestIdOf('vorgaenge-list'); + beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [ VorgangListPageComponent, + HasLinkPipe, + MockComponent(SpinnerComponent), MockComponent(SubnavigationComponent), MockComponent(VorgangListContainerComponent) ] @@ -23,10 +33,32 @@ describe('VorgangListPageComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(VorgangListPageComponent); component = fixture.componentInstance; + component.apiRootStateResource = createEmptyStateResource(); fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + describe('page', () => { + + it('should show vorgaenge if link exists', () => { + component.apiRootStateResource = createStateResource(createApiRootResource([ApiRootLinkRel.VORGAENGE])); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, vorgaengeList); + + expect(element).toBeInstanceOf(HTMLElement); + }) + + it('should show hint message if link not exists', () => { + component.apiRootStateResource = createStateResource(createApiRootResource()); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, userMessage); + + expect(element).toBeInstanceOf(HTMLElement); + }) + }) }); diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.ts index 1f16539089f801cd3d44329020eb290556386ad0..cfe7072d4a20ee7601805bac22084ed1dd197ec2 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.ts +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.ts @@ -1,8 +1,16 @@ -import { Component } from '@angular/core'; +import { Component, Input } from '@angular/core'; +import { ApiRootLinkRel, ApiRootResource } from '@goofy-client/api-root-shared'; +import { StateResource } from '@goofy-client/tech-shared'; +//TODO unter vorgang-list-page-container schieben @Component({ selector: 'goofy-client-vorgang-list-page', templateUrl: './vorgang-list-page.component.html', styleUrls: ['./vorgang-list-page.component.scss'] }) -export class VorgangListPageComponent { } +export class VorgangListPageComponent { + + @Input() apiRootStateResource: StateResource<ApiRootResource>; + + readonly apiRootLinkRel = ApiRootLinkRel; +} \ No newline at end of file diff --git a/goofy-client/libs/vorgang/src/lib/vorgang.module.ts b/goofy-client/libs/vorgang/src/lib/vorgang.module.ts index c300d818a54cdef72982b58b86d7278425a3f905..b9587df7dfb040efd4e874db0a8253fa217109ac 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang.module.ts +++ b/goofy-client/libs/vorgang/src/lib/vorgang.module.ts @@ -13,29 +13,30 @@ import { EmptyListComponent } from './vorgang-list-container/vorgang-list/empty- import { VorgangListItemComponent } from './vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component'; import { VorgangNextFristButton } from './vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-next-frist-button/vorgang-next-frist-button.component'; import { VorgangListComponent } from './vorgang-list-container/vorgang-list/vorgang-list.component'; +import { VorgangListPageContainerComponent } from './vorgang-list-page-container/vorgang-list-page-container.component'; import { VorgangListPageComponent } from './vorgang-list-page/vorgang-list-page.component'; const routes: Routes = [ { path: '', - component: VorgangListPageComponent + component: VorgangListPageContainerComponent, }, { path: 'search/:search', - component: VorgangListPageComponent + component: VorgangListPageContainerComponent, }, { path: 'myVorgaenge', - component: VorgangListPageComponent + component: VorgangListPageContainerComponent, }, { path: 'myVorgaenge/search/:search', - component: VorgangListPageComponent + component: VorgangListPageContainerComponent, }, { path: 'vorgang/:vorgangWithEingangUrl', - loadChildren: () => import('@goofy-client/vorgang-detail').then(m => m.VorgangDetailModule) - } + loadChildren: () => import('@goofy-client/vorgang-detail').then(m => m.VorgangDetailModule), + }, ]; @NgModule({ @@ -48,7 +49,7 @@ const routes: Routes = [ VorgangSharedModule, WiedervorlageModule, VorgangSharedUiModule, - UserProfileModule + UserProfileModule, ], declarations: [ VorgangListComponent, @@ -56,7 +57,8 @@ const routes: Routes = [ VorgangListContainerComponent, VorgangListPageComponent, EmptyListComponent, - VorgangNextFristButton - ] + VorgangNextFristButton, + VorgangListPageContainerComponent + ], }) export class VorgangModule { } diff --git a/goofy-client/tsconfig.base.json b/goofy-client/tsconfig.base.json index b68afb258404cae674d402b8eb66078fa7beab24..b077313028be1be67cf372d6f755f0cf1e126102 100644 --- a/goofy-client/tsconfig.base.json +++ b/goofy-client/tsconfig.base.json @@ -54,6 +54,9 @@ "@goofy-client/vorgang-detail": [ "libs/vorgang-detail/src/index.ts" ], + "@goofy-client/vorgang-historie": [ + "libs/vorgang-historie/src/index.ts" + ], "@goofy-client/vorgang-shared": [ "libs/vorgang-shared/src/index.ts" ], diff --git a/goofy-server/src/main/java/de/itvsh/goofy/JwtTokenUtil.java b/goofy-server/src/main/java/de/itvsh/goofy/JwtTokenUtil.java index 35ff2b41ccd56e82d7f8a2875b075e34d57f9a1f..834e157f26cbfa4bfcdf3bbd369548651447062f 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/JwtTokenUtil.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/JwtTokenUtil.java @@ -1,6 +1,7 @@ package de.itvsh.goofy; import java.util.ArrayList; +import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -31,9 +32,11 @@ public class JwtTokenUtil { public static final String TOKEN_ISSUER = "secure-api"; public static final String TOKEN_AUDIENCE = "secure-app"; public static final String ROLE_CLAIM = "roles"; + public static final String USERID_CLAIM = "userId"; public static final String FIRSTNAME_CLAIM = "firstName"; public static final String LASTNAME_CLAIM = "lastName"; public static final String FILEID_CLAIM = "fileId"; + public static final String ORGANSIATIONSEINHEIT_IDS_CLAIM = "organisationseinheitIds"; @Autowired private DownloadTokenProperties downloadTokenProperties; @@ -72,12 +75,26 @@ public class JwtTokenUtil { .toList(); } + @SuppressWarnings({ "unchecked" }) + public Collection<String> getOrganisationseinheitIdsFromToken(String token) { + List<String> organisationseinheitIds = new ArrayList<>(); + getAllClaimsFromToken(token) + .ifPresent(claims -> { + if (claims.get(ORGANSIATIONSEINHEIT_IDS_CLAIM) != null) { + organisationseinheitIds.addAll((Collection<String>) claims.get(ORGANSIATIONSEINHEIT_IDS_CLAIM)); + } + }); + return organisationseinheitIds; + } + public String generateToken(FileId fileId, GoofyUser user) { var claims = new HashMap<String, Object>(); + claims.put(USERID_CLAIM, user.getId().toString()); claims.put(FIRSTNAME_CLAIM, user.getFirstName()); claims.put(LASTNAME_CLAIM, user.getLastName()); claims.put(ROLE_CLAIM, user.getAuthorities()); claims.put(FILEID_CLAIM, fileId.toString()); + claims.put(ORGANSIATIONSEINHEIT_IDS_CLAIM, user.getOrganisationseinheitIds()); return doGenerateToken(claims, user.getId().toString()); } diff --git a/goofy-server/src/main/java/de/itvsh/goofy/RootController.java b/goofy-server/src/main/java/de/itvsh/goofy/RootController.java index f931023a603f2803a7b465cfc7a6c93181f676a7..f394e86ca7234a76fca635adbb013a6558f16aed 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/RootController.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/RootController.java @@ -18,6 +18,7 @@ import de.itvsh.goofy.common.downloadtoken.DownloadTokenController; import de.itvsh.goofy.common.user.CurrentUserService; import de.itvsh.goofy.common.user.UserId; import de.itvsh.goofy.common.user.UserProfileController; +import de.itvsh.goofy.common.user.UserRole; import de.itvsh.goofy.vorgang.VorgangController; @RestController @@ -39,16 +40,23 @@ public class RootController { @GetMapping public EntityModel<RootResource> getRootResource() { return ModelBuilder.fromEntity(new RootResource()) - .addLink(linkTo(RootController.class).withSelfRel()) - .addLink(linkTo(VorgangController.class).withRel(REL_VORGAENGE)) - .addLink(linkTo(methodOn(UserProfileController.class).findUsers(null)).withRel(REL_SEARCH_USER)) - .addLink(linkTo(DownloadTokenController.class).withRel(REL_DOWNLOAD_TOKEN)) - .addLink(buildVorgangListByPageLink(REL_SEARCH, Optional.empty())) - .addLink(buildVorgangListByPageLink(REL_MY_VORGAENGE, Optional.of(currentUserService.getUserId()))) - .addLink(buildVorgangListByPageLink(REL_SEARCH_MY_VORGAENGE, Optional.of(currentUserService.getUserId()))) + .ifMatch(this::hasRole).addLinks( + linkTo(RootController.class).withSelfRel(), + linkTo(VorgangController.class).withRel(REL_VORGAENGE), + linkTo(methodOn(UserProfileController.class).findUsers(null)).withRel(REL_SEARCH_USER), + linkTo(DownloadTokenController.class).withRel(REL_DOWNLOAD_TOKEN), + buildVorgangListByPageLink(REL_SEARCH, Optional.empty()), + buildVorgangListByPageLink(REL_MY_VORGAENGE, Optional.of(currentUserService.getUserId())), + buildVorgangListByPageLink(REL_SEARCH_MY_VORGAENGE, Optional.of(currentUserService.getUserId()))) .buildModel(); } + private boolean hasRole() { + return currentUserService.hasRole(UserRole.VERWALTUNG_USER) + || currentUserService.hasRole(UserRole.VERWALTUNG_POSTSTELLE) + || currentUserService.hasRole(UserRole.EINHEITLICHER_ANSPRECHPARTNER); + } + private Link buildVorgangListByPageLink(String linkRel, Optional<UserId> assignedTo) { return linkTo(methodOn(VorgangController.class).getVorgangListByPage(0, null, null, assignedTo)).withRel(linkRel); } diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/DownloadGoofyUser.java b/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/DownloadGoofyUser.java index 282f1b74bba6575ac710ef96318c5227484f1887..cf8d3a0506bbadc521974bad0144cd7c42bd6407 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/DownloadGoofyUser.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/DownloadGoofyUser.java @@ -10,6 +10,8 @@ import de.itvsh.goofy.common.user.GoofyUser; import lombok.Builder; import lombok.Getter; +//TODO rename this class - it es not a user, it is a user and a file id + @Builder @Getter public class DownloadGoofyUser { @@ -17,7 +19,7 @@ public class DownloadGoofyUser { private FileId fileId; - public Collection<? extends GrantedAuthority> getAuthorities() { // NOSONAR + public Collection<GrantedAuthority> getAuthorities() { return Objects.nonNull(user) ? user.getAuthorities() : List.of(); } } diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/callcontext/ContextService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/callcontext/ContextService.java index b2b4e4291127c2754b88a8e120c8d190c5f90686..b80ba70fc1822726303a3e23551f91825e0758ee 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/callcontext/ContextService.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/callcontext/ContextService.java @@ -29,7 +29,7 @@ public class ContextService { static final String KEY_CLIENT_NAME = "CLIENT_NAME-bin"; static final String KEY_REQUEST_ID = "REQUEST_ID-bin"; static final String KEY_ACCESS_LIMITED_ORGAID = "ACCESS_LIMITED_TO_ORGANISATORISCHEEINHEITENID-bin"; - static final String KEY_ORGAID_CHECK_NECESSARY = "ORGANISATION_EINHEITEN_ID_CHECK_NECESSARY-bin"; + static final String KEY_ACCESS_LIMITED = "ACCESS_LIMITED-bin"; @Autowired private ApplicationContext context; @@ -79,14 +79,16 @@ public class ContextService { .ifPresentOrElse(bytes -> metadata.put(createKeyOf(KEY_CLIENT_NAME), bytes), () -> LOG.warn("Missing value 'client name'")); user.getOrganisationseinheitIds().stream().map(String::getBytes) .forEach(bytes -> metadata.put(createKeyOf(KEY_ACCESS_LIMITED_ORGAID), bytes)); - metadata.put(createKeyOf(KEY_ORGAID_CHECK_NECESSARY), isOrganisationEinheitenIdCheckNecessary()); + metadata.put(createKeyOf(KEY_ACCESS_LIMITED), isOrganisationEinheitenIdCheckNecessary()); return metadata; } private byte[] isOrganisationEinheitenIdCheckNecessary() { - Boolean doOrgaIdCheck = !userService.hasRole(UserRole.VERWALTUNG_POSTSTELLE); - return doOrgaIdCheck.toString().getBytes(); + var hasRoleWithNoCheckNecessary = userService.hasRole(UserRole.VERWALTUNG_POSTSTELLE) + || userService.hasRole(UserRole.EINHEITLICHER_ANSPRECHPARTNER); + + return Boolean.toString(!hasRoleWithNoCheckNecessary).getBytes(); } private String formatListAsCommaSeperatedString(Collection<String> organisatorischeEinheitenIds) { diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/Command.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/Command.java index a24fc7535ceea1e0e5030a168e18206df6087e6f..661d146cb6ca8ac8fbaf027243d780e8b0b4e61a 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/Command.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/Command.java @@ -40,5 +40,5 @@ public class Command { private RedirectRequest redirectRequest; - private Map<String, String> body; + private Map<String, ?> body; } \ No newline at end of file diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBody.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBody.java index f8e2c4cf1f1bde9745c1a9bac2a2caf4b595777e..c1d7d2c1f5b225bba75aaa7b6a7b9a1d123634dc 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBody.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBody.java @@ -11,6 +11,7 @@ import de.itvsh.goofy.wiedervorlage.Wiedervorlage; @JsonSubTypes({ @Type(value = PostfachMail.class, name = "SEND_POSTFACH_MAIL"), + @Type(value = PostfachMail.class, name = "SEND_POSTFACH_NACHRICHT"), @Type(value = AssignUserCommandBody.class, name = "ASSIGN_USER"), @Type(value = RedirectRequest.class, name = "REDIRECT_VORGANG"), @Type(value = Wiedervorlage.class, name = "WIEDERVORLAGE"), diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java index 18477d9d1fc068ab8472d07c7f04fefd525e8292..703a17d43d415bfcd5d39da8b002796399825f44 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java @@ -3,10 +3,13 @@ package de.itvsh.goofy.common.command; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Objects; +import java.util.function.Predicate; import java.util.stream.Collectors; import org.apache.commons.beanutils.BeanMap; +import org.apache.commons.lang3.StringUtils; import org.mapstruct.Mapper; import de.itvsh.ozg.pluto.grpc.command.GrpcCommandBody; @@ -15,13 +18,31 @@ import de.itvsh.ozg.pluto.grpc.command.GrpcCommandBodyField; @Mapper public interface CommandBodyMapper { + final Predicate<Entry<Object, Object>> HAS_NOT_NULL_VALUE = entry -> Objects.nonNull(entry.getValue()); + final Predicate<Entry<Object, Object>> IS_NOT_CLASS_VALUE = entry -> !StringUtils.equals("class", entry.getKey().toString()); + static final String VORGANG_ID_PROPERTY = "vorgangId"; static final String ITEM_NAME_PROPERTY = "itemName"; static final String ITEM_PROPERTY = "item"; + default Map<String, Object> fromObjectToMap(Object object) { + return new BeanMap(object).entrySet().stream() + .filter(HAS_NOT_NULL_VALUE) + .filter(IS_NOT_CLASS_VALUE) + .collect(Collectors.toMap(entry -> entry.getKey().toString(), this::checkEnumValue)); + } + + private Object checkEnumValue(Entry<Object, Object> entry) { + if (entry.getValue() instanceof Enum<?> enumValue) { + return enumValue.name(); + } + return entry.getValue(); + } + default GrpcCommandBody mapToBody(Map<String, String> bodyMap) { - if (Objects.isNull(bodyMap)) + if (Objects.isNull(bodyMap)) { return GrpcCommandBody.getDefaultInstance(); + } var builder = GrpcCommandBody.newBuilder(); @@ -34,18 +55,21 @@ public interface CommandBodyMapper { } default List<GrpcCommandBodyField> mapToBodyFields(CommandBody body) { - if (Objects.isNull(body)) + if (Objects.isNull(body)) { return Collections.emptyList(); + } return mapToBodyFields(new BeanMap(body)); } default List<GrpcCommandBodyField> mapToBodyFields(Map<Object, Object> bodyMap) { - if (Objects.isNull(bodyMap)) + if (Objects.isNull(bodyMap)) { return Collections.emptyList(); + } return bodyMap.entrySet().stream() - .filter(entry -> Objects.nonNull(entry.getValue())) + .filter(HAS_NOT_NULL_VALUE) + .filter(IS_NOT_CLASS_VALUE) .map(entry -> GrpcCommandBodyField.newBuilder().setName(entry.getKey().toString()).setValue(entry.getValue().toString()).build()) .collect(Collectors.toList()); } diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java index 000c055d46c2c7fd56371fc63a03a617b70260ac..d6c45c11a6021bddc0cb4cbb7ac6b89189c6200f 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java @@ -16,8 +16,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import de.itvsh.goofy.common.binaryfile.FileId; import de.itvsh.goofy.postfach.PostfachMail; -import de.itvsh.goofy.postfach.PostfachMailController; import de.itvsh.goofy.vorgang.VorgangController; import de.itvsh.goofy.vorgang.VorgangWithEingang; import lombok.Getter; @@ -74,55 +74,57 @@ public class CommandController { private CommandService service; @Autowired private VorgangController vorgangController; - @Autowired - private PostfachMailController postfachController; @PostMapping public ResponseEntity<Void> createCommand(@PathVariable String vorgangId, @PathVariable String relationId, @PathVariable long relationVersion, @RequestBody CreateCommand command) { command = command.toBuilder().vorgangId(vorgangId).relationId(relationId).build(); - var created = createCommand(command, relationVersion); if (isSendPostfachMailOrder(command)) { - sendPostfachMail(created.getId(), buildPostfachMail(command)); + command = prepareCommandForPostfachNachricht(command, vorgangId); } + var created = createCommand(command, relationVersion); + return ResponseEntity.created(linkTo(CommandController.class).slash(created.getId()).toUri()).build(); } - public Command createCommand(CreateCommand command, long version) { - return service.createCommand(command, version); + private boolean isSendPostfachMailOrder(CreateCommand command) { + return command.getOrder() == CommandOrder.SEND_POSTFACH_NACHRICHT; } - public Command createCommand(CreateCommand command, String itemName) { - return service.createCommand(command, itemName); + CreateCommand prepareCommandForPostfachNachricht(CreateCommand command, String vorgangId) { + var postfachBody = (PostfachMail) command.getBody(); + var attachments = postfachBody.getAttachments().stream().map(this::stripToFileId).toList(); + postfachBody = postfachBody.toBuilder().postfachId(getPostfachId(vorgangId)) + .clearAttachments().attachments(attachments) + .build(); + return command.toBuilder().body(postfachBody).build(); } - public Command createCommandWithoutValidation(CreateCommand command, String itemName) { - return service.createCommandWithoutValidation(command, itemName); + private FileId stripToFileId(FileId fileUri) { + var fileUriStr = fileUri.toString(); + return FileId.from(fileUriStr.substring(fileUriStr.lastIndexOf("/") + 1, fileUriStr.length())); } - private boolean isSendPostfachMailOrder(CreateCommand command) { - return command.getOrder() == CommandOrder.SEND_POSTFACH_MAIL; + private String getPostfachId(String vorgangId) { + return getVorgang(vorgangId).getEingang().getAntragsteller().getPostfachId(); } - void sendPostfachMail(String commandId, PostfachMail postfachMail) { - postfachController.sendPostfachMail(commandId, postfachMail); + private VorgangWithEingang getVorgang(String vorgangId) { + return vorgangController.getVorgang(vorgangId); } - private PostfachMail buildPostfachMail(CreateCommand command) { - return ((PostfachMail) command.getBody()).toBuilder() - .vorgangId(command.getVorgangId()) - .postfachId(getPostfachId(command.getVorgangId())) - .build(); + public Command createCommand(CreateCommand command, long version) { + return service.createCommand(command, version); } - private String getPostfachId(String vorgangId) { - return getVorgang(vorgangId).getEingang().getAntragsteller().getPostfachId(); + public Command createCommand(CreateCommand command, String itemName) { + return service.createCommand(command, itemName); } - private VorgangWithEingang getVorgang(String vorgangId) { - return vorgangController.getVorgang(vorgangId); + public Command createCommandWithoutValidation(CreateCommand command, String itemName) { + return service.createCommandWithoutValidation(command, itemName); } } } \ No newline at end of file diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandMapper.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandMapper.java index e2b81a1c10ea9b0190034b7c31bd2f26fe52e6ab..cf44ac65b3a9065011f693fce1870bca2c4c1cde 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandMapper.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandMapper.java @@ -1,23 +1,56 @@ package de.itvsh.goofy.common.command; +import java.util.Map; +import java.util.Objects; + +import org.apache.commons.lang3.StringUtils; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.MappingConstants; import org.mapstruct.ValueMapping; +import org.springframework.beans.factory.annotation.Autowired; import de.itvsh.goofy.common.TimeMapper; import de.itvsh.goofy.common.callcontext.CallContextMapper; -import de.itvsh.goofy.common.user.UserId; +import de.itvsh.goofy.common.user.UserIdMapper; import de.itvsh.goofy.vorgang.RedirectRequest; +import de.itvsh.kop.pluto.common.grpc.GrpcObjectMapper; import de.itvsh.ozg.pluto.grpc.command.GrpcCommand; import de.itvsh.ozg.pluto.grpc.command.GrpcRedirectRequest; -@Mapper(uses = { CallContextMapper.class, TimeMapper.class, CommandBodyMapper.class }) -public interface CommandMapper { +@Mapper(uses = { CallContextMapper.class, TimeMapper.class, CommandBodyMapper.class, GrpcObjectMapper.class, UserIdMapper.class }) +public abstract class CommandMapper { + + @Autowired + private GrpcObjectMapper objectMapper; + @Autowired + private CommandBodyMapper bodyMapper; @ValueMapping(source = "UNRECOGNIZED", target = MappingConstants.NULL) @ValueMapping(source = "UNDEFINED", target = MappingConstants.NULL) - Command toCommand(GrpcCommand grpcCommand); + @Mapping(target = "order", expression = "java(mapOrder(grpcCommand))") + @Mapping(target = "body", expression = "java(mapBody(grpcCommand))") + abstract Command toCommand(GrpcCommand grpcCommand); + + Map<String, ?> mapBody(GrpcCommand command) { + if (!Objects.isNull(command.getBodyObj())) { + return objectMapper.mapFromGrpc(command.getBodyObj()); + } else { + return bodyMapper.map(command.getBody()); + } + } + + CommandOrder mapOrder(GrpcCommand command) { + if (StringUtils.isNotBlank(command.getOrderString())) { + return CommandOrder.valueOf(command.getOrderString()); + } else { + return CommandOrder.valueOf(command.getOrder().name()); + } + } + + String mapStringtoNull(String in) { + return StringUtils.trimToNull(in); + } @Mapping(target = "mergeContext", ignore = true) @Mapping(target = "context", ignore = true) @@ -29,9 +62,6 @@ public interface CommandMapper { @Mapping(target = "passwordBytes", ignore = true) @Mapping(target = "unknownFields", ignore = true) @Mapping(target = "allFields", ignore = true) - GrpcRedirectRequest toGrpcRedirectRequest(RedirectRequest request); + abstract GrpcRedirectRequest toGrpcRedirectRequest(RedirectRequest request); - default UserId mapUserId(String userId) { - return UserId.from(userId); - } } diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandOrder.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandOrder.java index 136cf4ea625bb8e60c4cdb2e07b0da5ae29551ab..d486668a566b4d1a64939d5ca114873a81b3888a 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandOrder.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandOrder.java @@ -30,7 +30,9 @@ public enum CommandOrder { WIEDERVORLAGE_ERLEDIGEN(false, Type.WIEDERVORLAGE), WIEDERVORLAGE_WIEDEREROEFFNEN(false, Type.WIEDERVORLAGE), // + @Deprecated SEND_POSTFACH_MAIL(false, Type.POSTFACH), + SEND_POSTFACH_NACHRICHT(false, Type.POSTFACH), RESEND_POSTFACH_MAIL(false, Type.POSTFACH), CREATE_ATTACHED_ITEM(false, Type.VORGANG), diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java index 0185cb89bcfbf21d4288b96a9ce7b093b8510e93..bc35a6d14771b3822737b95cf2efa5d5b2677cf1 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java @@ -21,6 +21,8 @@ import net.devh.boot.grpc.client.inject.GrpcClient; @Service public class CommandRemoteService { + @GrpcClient("pluto") + private CommandServiceBlockingStub commandServiceStub; @Autowired private ContextService contextService; @Autowired @@ -30,9 +32,6 @@ public class CommandRemoteService { @Autowired private GrpcObjectMapper objectMapper; - @GrpcClient("pluto") - private CommandServiceBlockingStub commandServiceStub; - public Command createCommand(CreateCommand command, long version) { return doCreateCommand(buildCreateCommandRequest(command, version)); } @@ -54,7 +53,8 @@ public class CommandRemoteService { .setRelationId(command.getRelationId()) .setRelationVersion(version) .addAllBody(bodyMapper.mapToBodyFields(command.getBody())) - .setOrder(GrpcOrder.valueOf(command.getOrder().name())); + .setBodyObj(objectMapper.fromMap(bodyMapper.fromObjectToMap(command.getBody()))) + .setOrderString(command.getOrder().name()); Optional.ofNullable(command.getRedirectRequest()).map(mapper::toGrpcRedirectRequest).ifPresent(requestBuilder::setRedirectRequest); diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenService.java index dd9ac1f05e25b5cba1a7ad46ea1bfd26bc6a68fd..bc1f6064da1de5322c28bf556679aa838d5d4948 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenService.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenService.java @@ -18,10 +18,11 @@ import com.auth0.jwt.exceptions.JWTVerificationException; import de.itvsh.goofy.JwtTokenUtil; import de.itvsh.goofy.common.binaryfile.DownloadGoofyUser; -import de.itvsh.goofy.common.binaryfile.FileId; import de.itvsh.goofy.common.binaryfile.DownloadGoofyUser.DownloadGoofyUserBuilder; +import de.itvsh.goofy.common.binaryfile.FileId; import de.itvsh.goofy.common.user.CurrentUserService; import de.itvsh.goofy.common.user.GoofyUser; +import de.itvsh.goofy.common.user.UserId; import de.itvsh.kop.common.errorhandling.TechnicalException; import io.jsonwebtoken.Claims; import lombok.extern.log4j.Log4j2; @@ -68,9 +69,11 @@ class DownloadTokenService { final DownloadGoofyUserBuilder downloadUserBuilder = DownloadGoofyUser.builder(); claimsOptional.ifPresent(claims -> downloadUserBuilder.user( GoofyUser.builder() + .id(UserId.from(claims.get(USERID_CLAIM, String.class))) .firstName(claims.get(FIRSTNAME_CLAIM, String.class)) .lastName(claims.get(LASTNAME_CLAIM, String.class)) - .authorities(jwtTokenUtil.getRolesFromToken(token)).build()) + .authorities(jwtTokenUtil.getRolesFromToken(token)) + .organisationseinheitIds(jwtTokenUtil.getOrganisationseinheitIdsFromToken(token)).build()) .fileId(FileId.from(claims.get(FILEID_CLAIM, String.class)))); return downloadUserBuilder.build(); diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/user/CurrentUserService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/user/CurrentUserService.java index 0e1da92e75bbbd21e20b79babb1f58814e7da1c7..58040fd30f13c4f728a4c93ef9fb1b3bd0a2a90b 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/user/CurrentUserService.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/user/CurrentUserService.java @@ -13,6 +13,8 @@ import org.keycloak.representations.AccessToken; import org.springframework.security.core.GrantedAuthority; import org.springframework.stereotype.Service; +import de.itvsh.goofy.common.binaryfile.DownloadGoofyUser; + @Service public class CurrentUserService { @@ -29,6 +31,11 @@ public class CurrentUserService { } public GoofyUser getUser() { + var dlUser = getDownloadUser(); + if (dlUser.isPresent()) { + return dlUser.get(); + } + Optional<AccessToken> token = getCurrentSecurityToken(); var userBuilder = GoofyUser.builder() @@ -53,12 +60,21 @@ public class CurrentUserService { .stream().map(Object::toString).collect(Collectors.toList()); } + private Optional<GoofyUser> getDownloadUser() { + return Optional.of(CurrentUserHelper.getAuthentication().getPrincipal()) + .filter(DownloadGoofyUser.class::isInstance) + .map(DownloadGoofyUser.class::cast) + .map(DownloadGoofyUser::getUser); + + } + private Optional<AccessToken> getCurrentSecurityToken() { Object principal = CurrentUserHelper.getAuthentication().getPrincipal(); if (principal instanceof KeycloakPrincipal) { return Optional.of(((KeycloakPrincipal<?>) principal).getKeycloakSecurityContext().getToken()); } + return Optional.empty(); } } \ No newline at end of file diff --git a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMail.java b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMail.java index a780e3d6883225dd238b908366be172535a96a65..ed84924b41b56f16d30afaf3cf5c259d52ca8c8e 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMail.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMail.java @@ -10,11 +10,9 @@ import javax.validation.constraints.Size; import com.fasterxml.jackson.annotation.JsonIgnore; -import de.itvsh.goofy.common.LinkedResource; import de.itvsh.goofy.common.binaryfile.FileId; import de.itvsh.goofy.common.command.CommandBody; import de.itvsh.goofy.common.user.UserId; -import de.itvsh.goofy.common.user.UserProfileController; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -42,7 +40,7 @@ public class PostfachMail implements CommandBody { private String vorgangId; private ZonedDateTime createdAt; - @LinkedResource(controllerClass = UserProfileController.class) + @JsonIgnore private UserId createdBy; private ZonedDateTime sentAt; diff --git a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java index 2261c99b4463d0cf368c7baaaec0d563505f319c..4bd0a32d73aa3817555633bbc1b936d2a80c6952 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java @@ -46,10 +46,6 @@ public class PostfachMailController { @Autowired private BinaryFileController binaryFileController; - public void sendPostfachMail(String commandId, PostfachMail message) { - service.sendPostfachMail(commandId, message); - } - @GetMapping(params = PARAM_VORGANG_ID) public CollectionModel<EntityModel<PostfachMail>> getAll(@RequestParam String vorgangId) { var vorgang = getVorgang(vorgangId); diff --git a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailModelAssembler.java b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailModelAssembler.java index a323d38ae2e7194e2edfcf8f33fa3b656d9322dd..0b49bcbc606db14e5096b9dea6af58360053a0b6 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailModelAssembler.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailModelAssembler.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Component; import de.itvsh.goofy.common.ModelBuilder; import de.itvsh.goofy.common.binaryfile.BinaryFileController; import de.itvsh.goofy.common.command.CommandController.CommandByRelationController; +import de.itvsh.goofy.common.user.UserProfileController; import de.itvsh.goofy.postfach.PostfachMailController.PostfachMailCommandController; @Component @@ -24,10 +25,15 @@ class PostfachMailModelAssembler implements RepresentationModelAssembler<Postfac public static final String REL_RESEND_POSTFACH_MAIL = "resendPostfachMail"; public static final String REL_ATTACHMENTS = "attachments"; static final String REL_UPLOAD_ATTACHMENT = "uploadAttachment"; + static final String REL_CREATED_BY = "createdBy"; private static final Predicate<PostfachMail> SENT_FAILED = postfachMail -> BooleanUtils.isFalse(postfachMail.getSentSuccessful()); private static final Predicate<PostfachMail> HAS_ATTACHMENTS = nachricht -> !nachricht.getAttachments().isEmpty(); + static final String SYSTEM_USER_IDENTIFIER = "system"; + private static final Predicate<PostfachMail> SENT_BY_CLIENT_USER = postfachNachricht -> Optional.ofNullable(postfachNachricht.getCreatedBy()) + .map(createdBy -> !createdBy.toString().startsWith(SYSTEM_USER_IDENTIFIER)).orElse(false); + public CollectionModel<EntityModel<PostfachMail>> toCollectionModel(Stream<PostfachMail> entities, String vorgangId, long vorgangVersion, Optional<String> postfachId) { CollectionModel<EntityModel<PostfachMail>> model = CollectionModel.of(entities.map(this::toModel).toList(), @@ -49,6 +55,8 @@ class PostfachMailModelAssembler implements RepresentationModelAssembler<Postfac .ifMatch(HAS_ATTACHMENTS) .addLink(linkTo(methodOn(PostfachMailController.class).findAttachments(PostfachNachrichtId.from(postfachMail.getId()))) .withRel(REL_ATTACHMENTS)) + .ifMatch(SENT_BY_CLIENT_USER) + .addLink(linkTo(UserProfileController.class).slash(postfachMail.getCreatedBy()).withRel(REL_CREATED_BY)) .buildModel(); } diff --git a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailRemoteService.java b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailRemoteService.java index be2e440130cb1c4452317a08f4924348d46e65e6..8a48ba36b825d2d51ffbbb4035aac4b427c3cb2e 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailRemoteService.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailRemoteService.java @@ -6,14 +6,12 @@ import java.util.stream.Stream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import de.itvsh.goofy.common.binaryfile.FileId; import de.itvsh.goofy.common.callcontext.ContextService; import de.itvsh.ozg.mail.postfach.GrpcFindPostfachMailRequest; import de.itvsh.ozg.mail.postfach.GrpcFindPostfachMailsRequest; import de.itvsh.ozg.mail.postfach.GrpcFindPostfachMailsResponse; import de.itvsh.ozg.mail.postfach.GrpcIsPostfachConfiguredRequest; import de.itvsh.ozg.mail.postfach.GrpcResendPostfachMailRequest; -import de.itvsh.ozg.mail.postfach.GrpcSendPostfachMailRequest; import de.itvsh.ozg.mail.postfach.PostfachServiceGrpc.PostfachServiceBlockingStub; import net.devh.boot.grpc.client.inject.GrpcClient; @@ -27,29 +25,6 @@ class PostfachMailRemoteService { @Autowired private PostfachMailMapper postfachNachrichtMapper; - public void sendPostfachMail(String commandId, PostfachMail postfachMail) { - serviceStub.sendPostfachMail(buildSendPostfachMailRequest(commandId, postfachMail)); - } - - private GrpcSendPostfachMailRequest buildSendPostfachMailRequest(String commandId, PostfachMail postfachMail) { - var mail = postfachNachrichtMapper.toGrpcPostfachMail(postfachMail); - - // TODO Die Attachments direkt im Mapper setzen - var attachmentStringList = postfachMail.getAttachments().stream().map(this::stripToFileId).toList(); - mail = mail.toBuilder().addAllAttachment(attachmentStringList).build(); - - return GrpcSendPostfachMailRequest.newBuilder() - .setCommandId(commandId) - .setContext(contextService.createCallContext()) - .setMail(mail) - .build(); - } - - private String stripToFileId(FileId fileUri) { - var fileUriStr = fileUri.toString(); - return fileUriStr.substring(fileUriStr.lastIndexOf("/") + 1, fileUriStr.length()); - } - public Stream<PostfachMail> findPostfachMails(String vorgangId) { GrpcFindPostfachMailsResponse response = serviceStub.findPostfachMails(buildFindPostfachMailsRequest(vorgangId)); diff --git a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailService.java b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailService.java index 789ebe855ae3446f964e90868a9ace0def327e1a..445aad6500dc4204f9947b517ff8b4c749689030 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailService.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailService.java @@ -19,16 +19,6 @@ class PostfachMailService { @Autowired private PostfachMailRemoteService remoteService; - @Async - public void sendPostfachMail(String commandId, PostfachMail postfachMail) { - try { - remoteService.sendPostfachMail(commandId, postfachMail); - } catch (RuntimeException e) { - LOG.error("Error sending PostfachNachricht: " + e.getMessage(), e); -// FIXME mark command als error - } - } - public Stream<PostfachMail> getAll(String vorgangId) { return remoteService.findPostfachMails(vorgangId); } @@ -36,7 +26,6 @@ class PostfachMailService { public PostfachMail findById(PostfachNachrichtId nachrichtId) { return remoteService.findById(nachrichtId) .orElseThrow(() -> new ResourceNotFoundException(PostfachMail.class, nachrichtId)); - } @Async diff --git a/goofy-server/src/test/java/de/itvsh/goofy/JwtTokenUtilTest.java b/goofy-server/src/test/java/de/itvsh/goofy/JwtTokenUtilTest.java index 61548e5b6a4d7230b09465260f68ecc7dedf5702..21872772831a98e4addae01feaf3073624b3e7d8 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/JwtTokenUtilTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/JwtTokenUtilTest.java @@ -6,6 +6,7 @@ import static org.mockito.Mockito.*; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.UUID; @@ -72,6 +73,13 @@ class JwtTokenUtilTest { assertThat(expirationDate).isAfter(before).isBefore(after); } + @Test + void organisationseinheitIds() { + var organisationseinheitIds = jwtTokenUtil.getOrganisationseinheitIdsFromToken(generatedToken); + + assertThat(organisationseinheitIds).isEqualTo(List.of(UserTestFactory.ORGANISATORISCHE_EINHEITEN_ID)); + } + private Claims getParsedBody() { return Jwts.parser().setSigningKey(TOKEN_SECRET.getBytes()).parseClaimsJws(generatedToken).getBody(); } @@ -107,6 +115,7 @@ class JwtTokenUtilTest { claims.put(JwtTokenUtil.LASTNAME_CLAIM, SecurityTestFactory.USER_LASTNAME); claims.put(JwtTokenUtil.ROLE_CLAIM, SecurityTestFactory.AUTHORITIES); claims.put(JwtTokenUtil.FILEID_CLAIM, FileId.createNew()); + claims.put(JwtTokenUtil.ORGANSIATIONSEINHEIT_IDS_CLAIM, SecurityTestFactory.ORGANSIATIONSEINHEIT_IDS); return Jwts.builder() .setClaims(claims) diff --git a/goofy-server/src/test/java/de/itvsh/goofy/RootControllerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/RootControllerTest.java index db4a5b8c67f1dab678a0733decd25231ad7f9c8b..778e0dc261ca83baefff24df794e4e346fb7c403 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/RootControllerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/RootControllerTest.java @@ -1,6 +1,6 @@ package de.itvsh.goofy; -import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -9,6 +9,7 @@ import java.time.LocalDateTime; import java.time.ZoneOffset; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -20,6 +21,8 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import static org.assertj.core.api.Assertions.*; + import de.itvsh.goofy.common.user.CurrentUserService; import de.itvsh.goofy.common.user.UserTestFactory; @@ -43,62 +46,90 @@ class RootControllerTest { when(currentUserService.getUserId()).thenReturn(UserTestFactory.ID); } + @DisplayName("Links for user") @Nested class TestLinks { - @Test - void shouldHaveSelfLink() { - var model = controller.getRootResource(); + @DisplayName("with any role") + @Nested + class TestWithAnyRole { - assertThat(model.getLink(IanaLinkRelations.SELF)).isPresent(); - } + @BeforeEach + void mockCurrentUserService() { + when(currentUserService.hasRole(anyString())).thenReturn(true); + } - @Test - void shouldHaveLinkToVorgangList() { - var model = controller.getRootResource(); + @Test + void shouldHaveSelfLink() { + var model = controller.getRootResource(); - assertThat(model.getLink(RootController.REL_VORGAENGE)).isPresent().get() - .extracting(Link::getHref).isEqualTo("/api/vorgangs"); - } + assertThat(model.getLink(IanaLinkRelations.SELF)).isPresent(); + } - @Test - void shouldHaveSearchLinkWithLimit() { - var model = controller.getRootResource(); + @Test + void shouldHaveLinkToVorgangList() { + var model = controller.getRootResource(); - assertThat(model.getLink(RootController.REL_SEARCH)).isPresent().get() - .extracting(Link::getHref).isEqualTo("/api/vorgangs?page=0{&searchBy,limit,assignedTo}"); - } + assertThat(model.getLink(RootController.REL_VORGAENGE)).isPresent().get() + .extracting(Link::getHref).isEqualTo("/api/vorgangs"); + } - @Test - void shouldHaveSearchUserLink() { - var model = controller.getRootResource(); + @Test + void shouldHaveSearchLinkWithLimit() { + var model = controller.getRootResource(); - assertThat(model.getLink(RootController.REL_SEARCH_USER)).isPresent().get().extracting(Link::getHref) - .isEqualTo("/api/userProfiles?searchBy={searchBy}"); - } + assertThat(model.getLink(RootController.REL_SEARCH)).isPresent().get() + .extracting(Link::getHref).isEqualTo("/api/vorgangs?page=0{&searchBy,limit,assignedTo}"); + } - @Test - void shoulHaveMyVorgaengeLink() { - var model = controller.getRootResource(); + @Test + void shouldHaveSearchUserLink() { + var model = controller.getRootResource(); - assertThat(model.getLink(RootController.REL_MY_VORGAENGE)).isPresent().get().extracting(Link::getHref) - .isEqualTo("/api/vorgangs?page=0&assignedTo=" + UserTestFactory.ID.toString() + "{&searchBy,limit}"); - } + assertThat(model.getLink(RootController.REL_SEARCH_USER)).isPresent().get().extracting(Link::getHref) + .isEqualTo("/api/userProfiles?searchBy={searchBy}"); + } + + @Test + void shoulHaveMyVorgaengeLink() { + var model = controller.getRootResource(); + + assertThat(model.getLink(RootController.REL_MY_VORGAENGE)).isPresent().get().extracting(Link::getHref) + .isEqualTo("/api/vorgangs?page=0&assignedTo=" + UserTestFactory.ID.toString() + "{&searchBy,limit}"); + } + + @Test + void shoulHaveSearchMyVorgaengeLink() { + var model = controller.getRootResource(); - @Test - void shoulHaveSearchMyVorgaengeLink() { - var model = controller.getRootResource(); + assertThat(model.getLink(RootController.REL_SEARCH_MY_VORGAENGE)).isPresent().get().extracting(Link::getHref) + .isEqualTo("/api/vorgangs?page=0&assignedTo=" + UserTestFactory.ID.toString() + "{&searchBy,limit}"); + } - assertThat(model.getLink(RootController.REL_SEARCH_MY_VORGAENGE)).isPresent().get().extracting(Link::getHref) - .isEqualTo("/api/vorgangs?page=0&assignedTo=" + UserTestFactory.ID.toString() + "{&searchBy,limit}"); + @Test + void shoulHaveDownloadTokenLink() { + var model = controller.getRootResource(); + + assertThat(model.getLink(RootController.REL_DOWNLOAD_TOKEN)).isPresent().get().extracting(Link::getHref) + .isEqualTo("/api/downloadtoken"); + } } - @Test - void shoulHaveDownloadTokenLink() { - var model = controller.getRootResource(); + @DisplayName("with no role") + @Nested + class TestWithNoRole { + + @BeforeEach + void mockCurrentUserService() { + when(currentUserService.hasRole(anyString())).thenReturn(false); + } + + @Test + void shouldHaveNoLinkAtAll() { + var model = controller.getRootResource(); - assertThat(model.getLink(RootController.REL_DOWNLOAD_TOKEN)).isPresent().get().extracting(Link::getHref) - .isEqualTo("/api/downloadtoken"); + assertThat(model.getLinks()).isEmpty(); + } } } diff --git a/goofy-server/src/test/java/de/itvsh/goofy/SecurityTestFactory.java b/goofy-server/src/test/java/de/itvsh/goofy/SecurityTestFactory.java index 68298120a8b3c8725f65488b6849f024a2fe0f38..50885feffbd1c88f245154f41d16db71bafec558 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/SecurityTestFactory.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/SecurityTestFactory.java @@ -1,6 +1,7 @@ package de.itvsh.goofy; import java.util.Arrays; +import java.util.Collection; import java.util.List; import org.springframework.security.core.authority.SimpleGrantedAuthority; @@ -14,4 +15,5 @@ public class SecurityTestFactory { static final String USER_LASTNAME = "Tester"; static final String ROLE = "Testrolle"; static final List<SimpleGrantedAuthority> AUTHORITIES = Arrays.asList(new SimpleGrantedAuthority(ROLE)); + static final Collection<String> ORGANSIATIONSEINHEIT_IDS = List.of("812546"); } diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/callcontext/ContextServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/callcontext/ContextServiceTest.java index ae80e2f1ae22fdfc26ec5d288f295e65c60bda8f..6a3331f7260afc7f02743a60723632df1e8333d6 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/callcontext/ContextServiceTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/callcontext/ContextServiceTest.java @@ -7,6 +7,7 @@ import static org.mockito.Mockito.*; import java.util.Collection; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -22,6 +23,7 @@ import de.itvsh.goofy.RequestAttributes; import de.itvsh.goofy.RequestAttributesTestFactory; import de.itvsh.goofy.common.GrpcUtil; import de.itvsh.goofy.common.user.CurrentUserService; +import de.itvsh.goofy.common.user.UserRole; import de.itvsh.goofy.common.user.UserTestFactory; import de.itvsh.ozg.pluto.grpc.command.GrpcUser; @@ -45,6 +47,7 @@ class ContextServiceTest { when(userService.getUser()).thenReturn(UserTestFactory.create()); } + @DisplayName("Get context metas") @Nested class TestGetContextMetas { @@ -83,25 +86,36 @@ class ContextServiceTest { .contains(UserTestFactory.ORGANISATORISCHE_EINHEITEN_ID, "orgaid_2"); } + @DisplayName("access limited") @Nested - class CheckAccessByUserRole { + class TestAccessLimitedByUserRole { @Test - void shouldHaveCheckIsNecessaryTrueOnRoleVerwaltungPoststelle() { - when(userService.hasRole(anyString())).thenReturn(Boolean.TRUE); + void shouldHaveTrueOnRoleVerwaltungUser() { + when(userService.hasRole(anyString())).thenReturn(Boolean.FALSE); var metadata = service.buildCallContextMetadata(); - assertThat(GrpcUtil.getFromHeaders(KEY_ORGAID_CHECK_NECESSARY, metadata)).isEqualTo(Boolean.FALSE.toString()); + assertThat(GrpcUtil.getFromHeaders(KEY_ACCESS_LIMITED, metadata)).isEqualTo(Boolean.TRUE.toString()); } @Test - void shouldHaveCheckIsNecessaryFalseOnNoRoleVerwaltungPoststelle() { - when(userService.hasRole(anyString())).thenReturn(Boolean.FALSE); + void shouldHaveFalseOnRoleVerwaltungPoststelle() { + when(userService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)).thenReturn(Boolean.TRUE); + + var metadata = service.buildCallContextMetadata(); + + assertThat(GrpcUtil.getFromHeaders(KEY_ACCESS_LIMITED, metadata)).isEqualTo(Boolean.FALSE.toString()); + } + + @Test + void shouldHaveFalseOnRoleEinheitlicherAnsprechpartner() { + when(userService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)).thenReturn(Boolean.FALSE); + when(userService.hasRole(UserRole.EINHEITLICHER_ANSPRECHPARTNER)).thenReturn(Boolean.TRUE); var metadata = service.buildCallContextMetadata(); - assertThat(GrpcUtil.getFromHeaders(KEY_ORGAID_CHECK_NECESSARY, metadata)).isEqualTo(Boolean.TRUE.toString()); + assertThat(GrpcUtil.getFromHeaders(KEY_ACCESS_LIMITED, metadata)).isEqualTo(Boolean.FALSE.toString()); } } } diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java index 89c4004a925bfbe95f29bce96367f38fb174c470..13d0d22456f477f570a97c73bc50e1991d947272 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java @@ -1,16 +1,22 @@ package de.itvsh.goofy.common.command; -import static org.assertj.core.api.Assertions.*; - import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mapstruct.factory.Mappers; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Spy; + +import static org.assertj.core.api.Assertions.*; import de.itvsh.goofy.common.binaryfile.BinaryFileTestFactory; +import de.itvsh.goofy.postfach.PostfachMailTestFactory; import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; import de.itvsh.goofy.wiedervorlage.WiedervorlageTestFactory; import de.itvsh.ozg.pluto.grpc.command.GrpcCommandBody; @@ -21,8 +27,51 @@ class CommandBodyMapperTest { private static final String FIELD = "FIELD"; private static final String VALUE = "VALUE"; + @Spy private CommandBodyMapper mapper = Mappers.getMapper(CommandBodyMapper.class); + @DisplayName("Map from object to map") + @Nested + class TestFromObjectToMap { + + @Test + void shouldMapAllFieldsExceptClass() { + var commandAsObject = CommandTestFactory.create(); + + var mappedMap = mapper.fromObjectToMap(commandAsObject); + + assertThat(mappedMap).hasSize(5).doesNotContainKey("class"); + } + + @Test + void shouldNotMapNullValue() { + var commandAsObject = CommandTestFactory.createBuilder().status(null).build(); + + var mappedMap = mapper.fromObjectToMap(commandAsObject); + + assertThat(mappedMap) + .hasSize(4) + .doesNotContainKey("status") + .containsEntry("order", CommandTestFactory.ORDER.name()) + .containsEntry("relationId", CommandTestFactory.RELATION_ID) + .containsEntry("vorgangId", CommandTestFactory.VORGANG_ID); + } + + @Test + void shouldMapAllValues() { + var commandAsObject = CommandTestFactory.create(); + + var mappedMap = mapper.fromObjectToMap(commandAsObject); + + assertThat(mappedMap) + .hasSize(5) + .containsEntry("status", CommandTestFactory.STATUS.name()) + .containsEntry("order", CommandTestFactory.ORDER.name()) + .containsEntry("relationId", CommandTestFactory.RELATION_ID) + .containsEntry("vorgangId", CommandTestFactory.VORGANG_ID); + } + } + @Nested class TestMapToBody { @Test @@ -62,6 +111,10 @@ class CommandBodyMapperTest { @Nested class TestMapToBodyFields { + + @Captor + private ArgumentCaptor<Map<Object, Object>> mapCaptor; + @Test void shouldReturnEmptyListOnNull() { var result = mapper.mapToBodyFields((CommandBody) null); @@ -69,6 +122,20 @@ class CommandBodyMapperTest { assertThat(result).isEmpty(); } + @Test + void shouldContainFields() { + var fieldList = mapper.mapToBodyFields(PostfachMailTestFactory.create()); + + assertThat(fieldList).hasSize(13); + } + + @Test + void shouldNOTContainClassEntry() { + var fieldList = mapper.mapToBodyFields(PostfachMailTestFactory.create()); + + assertThat(fieldList).isNotEmpty().allMatch(field -> !StringUtils.equals(field.getName(), "class")); + } + @Test void shouldReturnField() { var result = mapper.mapToBodyFields(buildBodyMap()); diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java index bc28c4d6a83a72d6ff9e8ec8009bdf2aafbee2ec..1d701b2269b468c4d63d4a3f13309c47d7e930af 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java @@ -1,7 +1,6 @@ package de.itvsh.goofy.common.command; import static de.itvsh.goofy.common.command.CommandController.*; -import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; @@ -17,16 +16,20 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import static org.assertj.core.api.Assertions.*; + +import de.itvsh.goofy.common.binaryfile.FileId; import de.itvsh.goofy.common.command.CommandController.CommandByRelationController; import de.itvsh.goofy.common.errorhandling.ExceptionController; import de.itvsh.goofy.postfach.PostfachMail; -import de.itvsh.goofy.postfach.PostfachMailController; import de.itvsh.goofy.postfach.PostfachMailTestFactory; +import de.itvsh.goofy.vorgang.AntragstellerTestFactory; import de.itvsh.goofy.vorgang.VorgangController; import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; import de.itvsh.goofy.vorgang.VorgangWithEingangTestFactory; @@ -40,8 +43,6 @@ class CommandControllerTest { private CommandService service; @Mock private CommandModelAssembler modelAssembler; - @Mock - private VorgangController vorgangController; private MockMvc mockMvc; @@ -119,6 +120,7 @@ class CommandControllerTest { @Nested class TestCommandByRelationController { + @Spy @InjectMocks // NOSONAR private CommandByRelationController controller; @Mock @@ -127,8 +129,6 @@ class CommandControllerTest { private CommandModelAssembler modelAssembler; @Mock private VorgangController vorgangController; - @Mock - private PostfachMailController postfachController; private MockMvc mockMvc; @@ -175,35 +175,13 @@ class CommandControllerTest { @DisplayName("CreateCommand with postfach mail") class WithPostfachMail { - @BeforeEach - void mockVorgangController() { - when(vorgangController.getVorgang(anyString())).thenReturn(VorgangWithEingangTestFactory.create()); - } - @Test - void shouldHavePostfachMail() throws Exception { - doRequest(PostfachMailTestFactory.buildSendPostfachMailContent()); + void shouldPrepareForPostfachNachricht() throws Exception { + doReturn(CommandTestFactory.createCreateCommand()).when(controller).prepareCommandForPostfachNachricht(any(), any()); - verify(service).createCommand(createCommandCaptor.capture(), anyLong()); - assertThat(createCommandCaptor.getValue()).extracting(CreateCommand::getBody).usingRecursiveComparison() - .ignoringFields("id", "vorgangId", "postfachId", "createdAt", "createdBy", "direction", "sentAt", "sentSuccessful", - "messageCode", - "attachments") // TODO remove this when sending attachments - .isEqualTo(PostfachMailTestFactory.create()); - } - - @Test - void shouldCallVorgangController() throws Exception { doRequest(PostfachMailTestFactory.buildSendPostfachMailContent()); - verify(vorgangController).getVorgang(VorgangHeaderTestFactory.ID); - } - - @Test - void shouldCallPostfachController() throws Exception { - doRequest(PostfachMailTestFactory.buildSendPostfachMailContent()); - - verify(postfachController).sendPostfachMail(anyString(), any(PostfachMail.class)); + verify(controller).prepareCommandForPostfachNachricht(any(), eq(VorgangHeaderTestFactory.ID)); } } @@ -223,6 +201,53 @@ class CommandControllerTest { } } + @Nested + class TestPrepareCommandForPostfachNachricht { + + @BeforeEach + void mockVorgangController() { + when(vorgangController.getVorgang(anyString())).thenReturn(VorgangWithEingangTestFactory.create()); + } + + @Test + void shouldCallVorgangController() { + controller.prepareCommandForPostfachNachricht(createPostfachCreateCommand(), + VorgangHeaderTestFactory.ID); + + verify(vorgangController).getVorgang(VorgangHeaderTestFactory.ID); + } + + @Test + void shouldMapAttachments() { + var preparedCommand = controller.prepareCommandForPostfachNachricht(createPostfachCreateCommand(), VorgangHeaderTestFactory.ID); + + assertThat(((PostfachMail) preparedCommand.getBody()).getAttachments()).contains(FileId.from(PostfachMailTestFactory.ID)); + } + + @Test + void shouldAddPostfachId() { + var preparedCommand = controller.prepareCommandForPostfachNachricht(createPostfachCreateCommand(), VorgangHeaderTestFactory.ID); + + assertThat(((PostfachMail) preparedCommand.getBody()).getPostfachId()).isEqualTo(AntragstellerTestFactory.POSTFACH_ID); + } + + @Test + void shouldProceedWithEmptyAttachments() { + var createCommand = CommandTestFactory.createCreateCommandBuilder() + .body(PostfachMailTestFactory.createBuilder().clearAttachments().build()).build(); + + var preparedCommand = controller.prepareCommandForPostfachNachricht(createCommand, VorgangHeaderTestFactory.ID); + + assertThat(((PostfachMail) preparedCommand.getBody()).getAttachments()).isEmpty(); + } + + private CreateCommand createPostfachCreateCommand() { + var postfachNachricht = PostfachMailTestFactory.createBuilder().clearAttachments() + .attachment(FileId.from("api/resource/" + PostfachMailTestFactory.ID)).build(); + return CommandTestFactory.createCreateCommandBuilder().body(postfachNachricht).build(); + } + } + @Nested class CreateByVorgangAndItemName { diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandMapperTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..10ef5468a4fb0ddebedfd17aae38d5da074da314 --- /dev/null +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandMapperTest.java @@ -0,0 +1,41 @@ +package de.itvsh.goofy.common.command; + +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import static org.assertj.core.api.Assertions.*; + +import de.itvsh.goofy.common.TimeMapper; +import de.itvsh.goofy.common.callcontext.CallContextMapper; +import de.itvsh.goofy.common.user.UserIdMapper; +import de.itvsh.kop.pluto.common.grpc.GrpcObjectMapper; +import de.itvsh.ozg.pluto.grpc.command.GrpcOrder; + +class CommandMapperTest { + + @InjectMocks + private CommandMapper mapper = Mappers.getMapper(CommandMapper.class); + @Mock + private UserIdMapper userIdMapper; + @Mock + private GrpcObjectMapper grpcObjectMapper; + @Mock + private CommandBodyMapper bodyMapper; + @Mock + private TimeMapper timeMapper; + @Mock + private CallContextMapper callContextMapper; + + @Test + void shouldMapNonEnumOrder() { + var command = mapper.toCommand(GrpcCommandTestFactory.createBuilder() + .setOrder(GrpcOrder.UNDEFINED) + .setOrderString(CommandOrder.SEND_POSTFACH_NACHRICHT.name()) + .build()); + + assertThat(command.getOrder()).isEqualTo(CommandOrder.SEND_POSTFACH_NACHRICHT); + } + +} diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandModelAssemblerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandModelAssemblerTest.java index 095cd13ee643f93b18fd3669b01818566b0610ec..60795b04bf34f24b95dd21b33faee21bad70d6bd 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandModelAssemblerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandModelAssemblerTest.java @@ -2,7 +2,6 @@ package de.itvsh.goofy.common.command; import static de.itvsh.goofy.common.command.CommandModelAssembler.*; import static de.itvsh.goofy.common.command.CommandTestFactory.*; -import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -15,6 +14,8 @@ import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; +import static org.assertj.core.api.Assertions.*; + import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; class CommandModelAssemblerTest { @@ -160,7 +161,8 @@ class CommandModelAssemblerTest { @ParameterizedTest @EnumSource(mode = Mode.EXCLUDE, names = { "CREATE_WIEDERVORLAGE", "WIEDERVORLAGE_ERLEDIGEN", "EDIT_WIEDERVORLAGE", "WIEDERVORLAGE_WIEDEREROEFFNEN", "CREATE_KOMMENTAR", "EDIT_KOMMENTAR", "REDIRECT_VORGANG", "FORWARD_SUCCESSFULL", - "FORWARD_FAILED", "ASSIGN_USER", "SEND_POSTFACH_MAIL", "RESEND_POSTFACH_MAIL", "CREATE_ATTACHED_ITEM", "UPDATE_ATTACHED_ITEM" }) + "FORWARD_FAILED", "ASSIGN_USER", "SEND_POSTFACH_MAIL", "SEND_POSTFACH_NACHRICHT", "RESEND_POSTFACH_MAIL", "CREATE_ATTACHED_ITEM", + "UPDATE_ATTACHED_ITEM" }) void shouldHaveLink(CommandOrder order) { var model = toModelWithOrder(order); diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java index e187d76d1f402fba6bf262698365cf77221854c4..3b9794b4c12d1a7d2d96c35e805e0c758b02c2b6 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java @@ -1,6 +1,5 @@ package de.itvsh.goofy.common.command; -import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -23,10 +22,13 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; +import static org.assertj.core.api.Assertions.*; + import de.itvsh.goofy.common.callcontext.ContextService; import de.itvsh.goofy.vorgang.RedirectRequestTestFactory; import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; import de.itvsh.kop.pluto.common.grpc.GrpcObjectMapper; +import de.itvsh.kop.pluto.common.grpc.GrpcObjectTestFactory; import de.itvsh.ozg.pluto.common.GrpcObject; import de.itvsh.ozg.pluto.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub; import de.itvsh.ozg.pluto.grpc.command.GrpcCallContext; @@ -111,6 +113,7 @@ class CommandRemoteServiceTest { @BeforeEach void initTest() { when(contextService.createCallContext()).thenReturn(grpcCallContext); + when(grpcObjectMapper.fromMap(any())).thenReturn(GrpcObjectTestFactory.create()); } @Test @@ -124,7 +127,7 @@ class CommandRemoteServiceTest { void shouldHaveOrder() { var request = buildRequest(); - assertThat(request.getOrder().name()).isEqualTo(CommandTestFactory.ORDER.name()); + assertThat(request.getOrderString()).isEqualTo(CommandTestFactory.ORDER.name()); } @Test @@ -148,6 +151,20 @@ class CommandRemoteServiceTest { assertThat(request.getVorgangId()).isEqualTo(CommandTestFactory.VORGANG_ID); } + @Test + void shouldCallBodyMapper() { + buildRequest(); + + verify(bodyMapper).fromObjectToMap(any(CommandBody.class)); + } + + @Test + void shouldCallObjectMapper() { + buildRequest(); + + verify(grpcObjectMapper).fromMap(any()); + } + @Test void shouldHaveVersion() { var request = buildRequest(); @@ -171,11 +188,13 @@ class CommandRemoteServiceTest { var request = service.buildCreateCommandRequest(CommandTestFactory.createCreateCommandBuilder().order(order).build(), CommandTestFactory.VERSION); - assertThat(request.getOrder()).hasToString(order.name()); + assertThat(request.getOrderString()).isEqualTo(order.name()); } private GrpcCreateCommandRequest buildRequest() { - return service.buildCreateCommandRequest(CommandTestFactory.createCreateCommand(), CommandTestFactory.VERSION); + return service.buildCreateCommandRequest( + CommandTestFactory.createCreateCommandBuilder().body(RedirectRequestTestFactory.create()).build(), + CommandTestFactory.VERSION); } } } diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/GrpcCommandTestFactory.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/GrpcCommandTestFactory.java index e974fd071f39dfc6e8366f5455690ee5225a9b92..37a52409f588d74043237f56d6f997923fe1ce45 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/GrpcCommandTestFactory.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/GrpcCommandTestFactory.java @@ -4,15 +4,28 @@ import java.util.UUID; import de.itvsh.goofy.common.GrpcCallContextTestFactory; import de.itvsh.ozg.pluto.grpc.command.GrpcCallContext; +import de.itvsh.ozg.pluto.grpc.command.GrpcCommand; import de.itvsh.ozg.pluto.grpc.command.GrpcCreateCommandRequest; import de.itvsh.ozg.pluto.grpc.command.GrpcOrder; public class GrpcCommandTestFactory { private static final String RELATION_ID = UUID.randomUUID().toString(); + private static final CommandStatus STATUS = CommandStatus.PENDING; private static final GrpcOrder ORDER = GrpcOrder.RESEND_POSTFACH_MAIL; private static final GrpcCallContext CALL_CONTEXT = GrpcCallContextTestFactory.create(); + public static GrpcCommand create() { + return createBuilder().build(); + } + + public static GrpcCommand.Builder createBuilder() { + return GrpcCommand.newBuilder() + .setStatus(STATUS.name()) + .setRelationId(RELATION_ID) + .setOrder(ORDER); + } + public static GrpcCreateCommandRequest createCommandRequest() { return createCommandRequestBuilder().build(); } diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java b/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java index 260ec0db0d19212af471df04315e95f3d70adee9..479e63fb7804e00e7f792bea1c96fdcc2f77f372 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java @@ -45,6 +45,17 @@ class DownloadTokenAuthenticationFilterITCase { verify(filter).doFilterInternal(any(), any(), any()); } + @Test + void shouldCallFilterWhenNoOrganisationseinheitIds() throws Exception { + String token = DownloadTokenTestFactory.createTokenBuilder(downloadTokenProperties.getSecret(), downloadTokenProperties.getValidity()) + .setClaims(DownloadTokenTestFactory.CLAIMS_WITHOUT_ORGANSIATIONSEINHEIT_IDS).compact(); + + performRequest(DownloadTokenController.DOWNLOAD_TOKEN_PATH + "?" + DownloadTokenController.PARAM_TOKEN + "=" + token) + .andExpect(status().isOk()); + + verify(filter).doFilterInternal(any(), any(), any()); + } + @Test void shouldReturnUnauthorised() throws Exception { String token = DownloadTokenTestFactory.createToken("badSecret", downloadTokenProperties.getValidity()); diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenServiceTest.java index d5b9f9e614f9d18d40bb37f267c7cc53928e5e56..d15ad742cb3d2f1fe6b4ee2feff81bc641363e95 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenServiceTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenServiceTest.java @@ -6,6 +6,8 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.util.Collection; +import java.util.List; import java.util.Optional; import javax.servlet.http.HttpServletRequest; @@ -41,6 +43,7 @@ class DownloadTokenServiceTest { private HttpServletResponse response; private final static String FAKE_TOKEN = "xxx"; + private final static Collection<String> ORGE_IDS = List.of("258994"); @Nested class TestCreateToken { @@ -99,10 +102,23 @@ class DownloadTokenServiceTest { assertThat(user).isNotNull(); } + @Test + void shouldGetOrganisationseinheitIdsFromToken() { + mockClaims(FIRSTNAME_CLAIM, LASTNAME_CLAIM); + + GoofyUser user = service.getUserFromToken(FAKE_TOKEN).getUser(); + + assertThat(user.getOrganisationseinheitIds()).isEqualTo(ORGE_IDS); + } + private void mockClaims(String firstnameClaim, String lastnameClaim) { Claims claims = mock(Claims.class); + when(claims.get(FIRSTNAME_CLAIM, String.class)).thenReturn(firstnameClaim); when(claims.get(LASTNAME_CLAIM, String.class)).thenReturn(lastnameClaim); + when(claims.get(USERID_CLAIM, String.class)).thenReturn(UserTestFactory.ID.toString()); + + when(jwtTokenUtil.getOrganisationseinheitIdsFromToken(any())).thenReturn(ORGE_IDS); when(jwtTokenUtil.getAllClaimsFromToken(any())).thenReturn(Optional.of(claims)); } @@ -119,6 +135,7 @@ class DownloadTokenServiceTest { assertThrows(TechnicalException.class, () -> handleToken()); } + } void handleToken() { diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenTestFactory.java b/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenTestFactory.java index 884ec1e1d43a663e2219ae17a6ae7f88242f4752..d549a1e792b12848c51aeb2fa9cb47b074a2d7c5 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenTestFactory.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenTestFactory.java @@ -2,6 +2,7 @@ package de.itvsh.goofy.common.downloadtoken; import static de.itvsh.goofy.JwtTokenUtil.*; +import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -17,9 +18,15 @@ public class DownloadTokenTestFactory { static final String SUBJECT = "subject"; static final String FIRSTNAME_CLAIM_VALUE = UserTestFactory.FIRSTNAME; static final String LASTNAME_CLAIM_VALUE = UserTestFactory.LASTNAME; + final static Collection<String> ORGE_IDS = List.of("258994"); static final List<?> ROLE_CLAIM_VALUE = List.of(); static final long VALIDITY = 5000; static final Map<String, Object> CLAIMS = new HashMap<>(Map.of( + FIRSTNAME_CLAIM, FIRSTNAME_CLAIM_VALUE, + LASTNAME_CLAIM, LASTNAME_CLAIM_VALUE, + ROLE_CLAIM, ROLE_CLAIM_VALUE, + ORGANSIATIONSEINHEIT_IDS_CLAIM, ORGE_IDS)); + static final Map<String, Object> CLAIMS_WITHOUT_ORGANSIATIONSEINHEIT_IDS = new HashMap<>(Map.of( FIRSTNAME_CLAIM, FIRSTNAME_CLAIM_VALUE, LASTNAME_CLAIM, LASTNAME_CLAIM_VALUE, ROLE_CLAIM, ROLE_CLAIM_VALUE)); diff --git a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailControllerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailControllerTest.java index 5698978fca53e1a27a1c11d99859c50781d82b0f..6cc924272be0a555cb5c7edd0911013be87f1ff0 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailControllerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailControllerTest.java @@ -1,6 +1,5 @@ package de.itvsh.goofy.postfach; -import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; @@ -21,8 +20,9 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import static org.assertj.core.api.Assertions.*; + import de.itvsh.goofy.common.binaryfile.BinaryFileController; -import de.itvsh.goofy.common.command.CommandTestFactory; import de.itvsh.goofy.vorgang.Antragsteller; import de.itvsh.goofy.vorgang.EingangTestFactory; import de.itvsh.goofy.vorgang.VorgangController; @@ -50,19 +50,6 @@ class PostfachMailControllerTest { mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); } - @Nested - class TestPostfachSendMessage { - - final PostfachMail postfachMail = PostfachMailTestFactory.create(); - - @Test - void shouldCallService() { - controller.sendPostfachMail(CommandTestFactory.ID, postfachMail); - - verify(service).sendPostfachMail(CommandTestFactory.ID, postfachMail); - } - } - @Nested class TestPostfachMailGetAll { diff --git a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailITCase.java b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailITCase.java index 307738b87ea4cd29579b2845be5be1d0356e9bf6..06c76b268f59f851d66d840cf3e39e20ec3096bb 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailITCase.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailITCase.java @@ -15,7 +15,6 @@ import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.util.ReflectionTestUtils; import de.itvsh.goofy.CallScope; -import de.itvsh.goofy.common.command.CommandTestFactory; import de.itvsh.goofy.vorgang.EingangTestFactory; import de.itvsh.goofy.vorgang.VorgangController; import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; @@ -45,19 +44,6 @@ public class PostfachMailITCase { callScope.startScope(); } - @Nested - @WithMockUser - class TestSendeMail { - - @Test - void shouldCallPostfachGrpc() throws InterruptedException { - - controller.sendPostfachMail(CommandTestFactory.ID, PostfachMailTestFactory.createLikeFromClient()); - - verify(serviceStub, after(2000)).sendPostfachMail(any()); - } - } - @Nested @WithMockUser class TestGetAll { diff --git a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailModelAssemblerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailModelAssemblerTest.java index b3b6db94568ed1eb142301e319d90736495d0709..100b7a73b6827e90dfd9af06f9aca36d7102f202 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailModelAssemblerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailModelAssemblerTest.java @@ -1,8 +1,7 @@ package de.itvsh.goofy.postfach; -import static org.assertj.core.api.Assertions.*; - import java.util.Optional; +import java.util.UUID; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; @@ -14,6 +13,9 @@ import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; +import static org.assertj.core.api.Assertions.*; + +import de.itvsh.goofy.common.user.UserId; import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; class PostfachMailModelAssemblerTest { @@ -78,6 +80,37 @@ class PostfachMailModelAssemblerTest { } } + @DisplayName("created by link") + @Nested + class TestCreatedByLink { + + @Test + void shouldBePresent() { + var link = modelAssembler.toModel(PostfachMailTestFactory.create()).getLink(PostfachMailModelAssembler.REL_CREATED_BY); + + assertThat(link).isPresent().get().extracting(Link::getHref) + .isEqualTo("/api/userProfiles/" + PostfachMailTestFactory.CREATED_BY); + } + + @DisplayName("should not be present if the value of createdBy starts with 'system'") + @Test + void shouldNOTBePresentOnSystemUser() { + var link = modelAssembler + .toModel(PostfachMailTestFactory.createBuilder() + .createdBy(UserId.from(PostfachMailModelAssembler.SYSTEM_USER_IDENTIFIER + UUID.randomUUID().toString())).build()) + .getLink(PostfachMailModelAssembler.REL_CREATED_BY); + + assertThat(link).isNotPresent(); + } + + @Test + void shouldNotBePresentOnNull() { + var link = modelAssembler.toModel(PostfachMailTestFactory.createBuilder().createdBy(null).build()) + .getLink(PostfachMailModelAssembler.REL_CREATED_BY); + + assertThat(link).isNotPresent(); + } + } } @Nested diff --git a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailRemoteServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailRemoteServiceTest.java index fbf48356fa253c97dd4be99dca7630c4aca42cef..ca147f87a6f8d404da513aeb75ade4785f2c80ef 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailRemoteServiceTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailRemoteServiceTest.java @@ -1,6 +1,5 @@ package de.itvsh.goofy.postfach; -import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -15,6 +14,8 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; +import static org.assertj.core.api.Assertions.*; + import de.itvsh.goofy.common.callcontext.ContextService; import de.itvsh.goofy.common.command.CommandTestFactory; import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; @@ -24,7 +25,6 @@ import de.itvsh.ozg.mail.postfach.GrpcIsPostfachConfiguredRequest; import de.itvsh.ozg.mail.postfach.GrpcIsPostfachConfiguredResponse; import de.itvsh.ozg.mail.postfach.GrpcPostfachMail; import de.itvsh.ozg.mail.postfach.GrpcResendPostfachMailRequest; -import de.itvsh.ozg.mail.postfach.GrpcSendPostfachMailRequest; import de.itvsh.ozg.mail.postfach.PostfachServiceGrpc.PostfachServiceBlockingStub; import de.itvsh.ozg.pluto.grpc.command.GrpcCallContext; @@ -46,50 +46,6 @@ class PostfachMailRemoteServiceTest { when(contextService.createCallContext()).thenReturn(callContext); } - @Nested - class TestSendPostfachMail { - - private GrpcPostfachMail postfachMail = GrpcPostfachMail.newBuilder().setPostfachId("42").build(); - - @Captor - private ArgumentCaptor<GrpcSendPostfachMailRequest> requestCaptor; - - @BeforeEach - void initMocks() { - when(postfachNachrichtMapper.toGrpcPostfachMail(any())).thenReturn(postfachMail); - } - - @Test - void shouldCallStub() { - service.sendPostfachMail(CommandTestFactory.ID, PostfachMailTestFactory.create()); - - verify(serviceStub).sendPostfachMail(any(GrpcSendPostfachMailRequest.class)); - } - - @Test - void shouldCallCallContextService() { - service.sendPostfachMail(CommandTestFactory.ID, PostfachMailTestFactory.create()); - - verify(contextService).createCallContext(); - } - - @Test - void shouldCallMapper() { - service.sendPostfachMail(CommandTestFactory.ID, PostfachMailTestFactory.create()); - - verify(postfachNachrichtMapper).toGrpcPostfachMail(any(PostfachMail.class)); - } - - @Test - void shouldAddAttachments() { - service.sendPostfachMail(CommandTestFactory.ID, PostfachMailTestFactory.create()); - - verify(serviceStub).sendPostfachMail(requestCaptor.capture()); - assertThat(requestCaptor.getValue().getMail().getAttachmentList()).hasSize(1); - assertThat(requestCaptor.getValue().getMail().getAttachmentList().get(0)).isEqualTo(PostfachMailTestFactory.ATTACHMENT.toString()); - } - } - @Nested class TestFindPostfachMail { diff --git a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailServiceTest.java index 5690e5c2819effd6bd3cc76ba1aeb034e40fb96d..4e14e58beb7119298c477c241417a81cf375a985 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailServiceTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailServiceTest.java @@ -1,6 +1,5 @@ package de.itvsh.goofy.postfach; -import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -14,6 +13,8 @@ import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; +import static org.assertj.core.api.Assertions.*; + import de.itvsh.goofy.common.command.CommandTestFactory; import de.itvsh.goofy.common.errorhandling.ResourceNotFoundException; import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; @@ -25,19 +26,6 @@ class PostfachMailServiceTest { @Mock private PostfachMailRemoteService remoteService; - @Nested - class TestSendPostfachMail { - - final PostfachMail postfachMail = PostfachMailTestFactory.create(); - - @Test - void shouldCallRemoteService() { - service.sendPostfachMail(CommandTestFactory.ID, postfachMail); - - verify(remoteService).sendPostfachMail(CommandTestFactory.ID, postfachMail); - } - } - @Nested class TestGetAll { diff --git a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailTestFactory.java b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailTestFactory.java index fa99f37a3203f8a084d68ba29457f4e7ac2d9e03..bea7a39b6ed1b1679fde1f939ba50e3af2b06a95 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailTestFactory.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailTestFactory.java @@ -72,10 +72,15 @@ public class PostfachMailTestFactory { } public static String buildSendPostfachMailContent(PostfachMail postfachMail) { - return TestUtils.loadTextFile("jsonTemplates/command/createCommandWithPostfachMail.json.tmpl", CommandOrder.SEND_POSTFACH_MAIL.name(), + return buildSendPostfachMailContent(postfachMail, CommandOrder.SEND_POSTFACH_NACHRICHT); + } + + public static String buildSendPostfachMailContent(PostfachMail postfachMail, CommandOrder order) { + return TestUtils.loadTextFile("jsonTemplates/command/createCommandWithPostfachMail.json.tmpl", order.name(), postfachMail.getReplyOption().name(), TestUtils.addQuote(postfachMail.getSubject()), - TestUtils.addQuote(postfachMail.getMailBody())); + TestUtils.addQuote(postfachMail.getMailBody()), + postfachMail.getAttachments().get(0).toString()); } public static String buildResendPostfachMailContent() { diff --git a/goofy-server/src/test/resources/jsonTemplates/command/createCommandWithPostfachMail.json.tmpl b/goofy-server/src/test/resources/jsonTemplates/command/createCommandWithPostfachMail.json.tmpl index 48616ee6e0851973aca270eeaf5cd3abc864081c..1481e0b8af4c3810e80c70855a01bab4351b59b8 100644 --- a/goofy-server/src/test/resources/jsonTemplates/command/createCommandWithPostfachMail.json.tmpl +++ b/goofy-server/src/test/resources/jsonTemplates/command/createCommandWithPostfachMail.json.tmpl @@ -3,6 +3,7 @@ "body": { "replyOption": "%s", "subject": %s, - "mailBody": %s + "mailBody": %s, + "attachments": ["%s"] } } \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8f2380ad5b37a33247b8a51bcc4724c841cd689f..d777589e440e5c9b114b123c98bd5de9706b6a01 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ <parent> <groupId>de.itvsh.kop.common</groupId> <artifactId>kop-common-parent</artifactId> - <version>1.1.1-SNAPSHOT</version> + <version>1.1.3-SNAPSHOT</version> </parent> <modules> @@ -24,7 +24,7 @@ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <pluto.version>0.25.0</pluto.version> + <pluto.version>0.26.0-SNAPSHOT</pluto.version> </properties> <dependencyManagement>