diff --git a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-subnavigation.ts b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-subnavigation.ts index 826cb6a09e8321d97578db6ddc61f3706874ba1c..40dc7120e89587eca1214c5b2eb673df1450a220 100644 --- a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-subnavigation.ts +++ b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-subnavigation.ts @@ -45,6 +45,10 @@ export class VorgangSubnavigationE2EComponent { return cy.getTestElement(this.backIconButton); } + public back(): void { + this.getBackButton().click(); + } + public getAnnehmenIconButton() { return cy.getTestElement(this.annehmenIconButton); } diff --git a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-views.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-views.e2e.component.ts index 446c287de76ee0c62fd746f6df9241c95ed0ce92..719825fd08a222a32c30f8bafd7c70e260d403b7 100644 --- a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-views.e2e.component.ts +++ b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-views.e2e.component.ts @@ -18,6 +18,9 @@ export class VorgangViewsE2EComponent { private readonly zuLoeschenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent( 'Zu_Loschen', ); + private readonly ungelesenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent( + 'Ungelesen', + ); private readonly wiedervorlagenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent( 'Wiedervorlagen', ); @@ -54,6 +57,10 @@ export class VorgangViewsE2EComponent { return this.zuLoeschenViewItem; } + public getUngelesen(): VorgangViewE2EComponent { + return this.ungelesenViewItem; + } + public getWiedervorlagen(): VorgangViewE2EComponent { return this.wiedervorlagenViewItem; } diff --git a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-zusammenarbeit.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-zusammenarbeit.e2e.component.ts index e8bafb9462c834d331dec872c19a0d2da747c23b..dbd5760dbef9a22d5739ee2e05a7b1c7df37c73b 100644 --- a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-zusammenarbeit.e2e.component.ts +++ b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-zusammenarbeit.e2e.component.ts @@ -2,9 +2,9 @@ import { enterWith } from '../../support/cypress.util'; export class VorgangZusammenarbeitE2EComponent { private readonly anfrageButton: string = 'anfrage-erstellen-button'; - private readonly zustaendigeStelleButton: string = 'zustaendige-stelle-search-button'; + private readonly zustaendigeStelleButton: string = 'organisations-einheit-search-button'; private readonly titelText: string = 'Titel-text-input'; - private readonly nachrichtText: string = 'Nachricht-textarea'; + private readonly messageText: string = 'Nachricht-textarea'; private readonly sendButton: string = 'collaboration-request-send-button'; private readonly cancelButton: string = 'collaboration-request-cancel-button'; @@ -32,12 +32,21 @@ export class VorgangZusammenarbeitE2EComponent { enterWith(this.getStelleTitel(), text); } - public getStelleNachricht(): Cypress.Chainable<JQuery<HTMLElement>> { - return cy.getTestElement(this.nachrichtText); + public getMessageText(): Cypress.Chainable<JQuery<HTMLElement>> { + return cy.getTestElement(this.messageText); } - public enterNachricht(text: string): void { - enterWith(this.getStelleNachricht(), text); + public enterMessage(text: string): void { + enterWith(this.getMessageText(), text); + } + + public messageScrollbarIsPresent(): void { + this.getMessageText().then(($textarea) => { + const scrollHeight = $textarea[0].scrollHeight; + const clientHeight = $textarea[0].clientHeight; + + expect(scrollHeight).to.be.greaterThan(clientHeight); + }); } public getSendButton(): Cypress.Chainable<JQuery<HTMLElement>> { diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-automatisch-erstellen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-automatisch-erstellen.cy.ts index c2a6b888ce2b2bad7055322952440965512d27b5..8f465721f0b67a4a971702d125d5f4bba9df64a9 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-automatisch-erstellen.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-automatisch-erstellen.cy.ts @@ -28,7 +28,7 @@ import { registerLocaleData(localeDe, 'de', localeDeExtra); //TODO: Jenkins konfigurieren -describe.skip('Upload automatic Bescheid', () => { +describe('Upload automatic Bescheid', () => { const mainPage: MainPage = new MainPage(); const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList(); @@ -77,7 +77,7 @@ describe.skip('Upload automatic Bescheid', () => { dropCollections(); }); - describe.skip('Upload automatic Bescheid document', () => { + describe('Upload automatic Bescheid document', () => { it('should show automatic Bescheid button', () => { vorgangList.getListItem(bescheidAutomatik.name).getRoot().click(); waitForSpinnerToDisappear(); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-ungelesen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-ungelesen.cy.ts new file mode 100644 index 0000000000000000000000000000000000000000..323803e5693ea60d476d70aff45717143b624cc4 --- /dev/null +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-ungelesen.cy.ts @@ -0,0 +1,127 @@ +import { + PostfachMailE2EComponent, + PostfachMailListItem, +} from 'apps/alfa-e2e/src/components/postfach/postfach-mail.e2e.component'; +import { VorgangSubnavigationE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-subnavigation'; +import { + VorgangViewE2EComponent, + VorgangViewsE2EComponent, +} from 'apps/alfa-e2e/src/components/vorgang/vorgang-views.e2e.component'; +import { + PostfachMailItemE2E, + VorgangAttachedItemClientE2E, + VorgangAttachedItemE2E, +} from 'apps/alfa-e2e/src/model/vorgang-attached-item'; +import { VorgangPage } from 'apps/alfa-e2e/src/page-objects/vorgang.po'; +import { exist, haveLength } from 'apps/alfa-e2e/src/support/cypress.util'; +import { + createPostfachNachrichtAttachedItem, + createPostfachNachrichtReplyItem, + initVorgangAttachedItem, +} from 'apps/alfa-e2e/src/support/vorgang-attached-item-util'; +import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; +import { ClientAttributeNameE2E, ClientAttributesE2E, VorgangE2E } from '../../../model/vorgang'; +import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; +import { dropCollections } from '../../../support/cypress-helper'; +import { initUsermanagerUsers, loginAsSabine } from '../../../support/user-util'; +import { + buildVorgang, + createHasNewPostfachNachrichtClientAttribute, + createHasPostfachNachrichtClientAttribute, + initVorgaenge, + objectIds, +} from '../../../support/vorgang-util'; + +describe('Ungelesene Nachrichten', () => { + const mainPage: MainPage = new MainPage(); + const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList(); + const vorgangPage: VorgangPage = new VorgangPage(); + const subnavigation: VorgangSubnavigationE2EComponent = vorgangPage.getSubnavigation(); + const views: VorgangViewsE2EComponent = mainPage.getViews(); + const ungelesenView: VorgangViewE2EComponent = views.getUngelesen(); + const postfachMailContainer: PostfachMailE2EComponent = vorgangPage.getPostfachMailcontainer(); + + const clientAttributes: ClientAttributesE2E = { + [VorgangAttachedItemClientE2E.OZGCLOUD_NACHRICHTEN_MANAGER]: { + [ClientAttributeNameE2E.HAS_NEW_POSTFACH_NACHRICHT]: + createHasNewPostfachNachrichtClientAttribute(true), + [ClientAttributeNameE2E.HAS_POSTFACH_NACHRICHT]: + createHasPostfachNachrichtClientAttribute(true), + }, + }; + + const vorgangWithReply1: VorgangE2E = { + ...buildVorgang(objectIds[0], 'VorgangWithReply'), + clientAttributes, + }; + + const vorgangWithReply2: VorgangE2E = { + ...buildVorgang(objectIds[1], 'VorgangWithReply 2'), + clientAttributes, + }; + + const postfachMailReply1: PostfachMailItemE2E = createPostfachNachrichtReplyItem(); + const postfachMailReply2: PostfachMailItemE2E = createPostfachNachrichtReplyItem(); + + const postfachNachrichtAttachedItem1: VorgangAttachedItemE2E = { + ...createPostfachNachrichtAttachedItem(objectIds[0], vorgangWithReply1._id.$oid), + item: postfachMailReply1, + }; + const postfachNachrichtAttachedItem2: VorgangAttachedItemE2E = { + ...createPostfachNachrichtAttachedItem(objectIds[1], vorgangWithReply2._id.$oid), + item: postfachMailReply2, + }; + + before(() => { + initVorgaenge([vorgangWithReply1, vorgangWithReply2]); + initVorgangAttachedItem([postfachNachrichtAttachedItem1]); + initVorgangAttachedItem([postfachNachrichtAttachedItem2]); + initUsermanagerUsers(); + + loginAsSabine(); + + waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); + }); + + after(() => { + dropCollections(); + }); + + describe('Show number of unread messages', () => { + it('should show 2 unread messages in filter', () => { + ungelesenView.getRoot().click(); + waitForSpinnerToDisappear(); + + haveLength(vorgangList.getItems(), 2); + }); + + it('should show 1 unread message after viewing first message', () => { + vorgangList.getListItem(vorgangWithReply1.name).getRoot().click(); + waitForSpinnerToDisappear(); + + const postfachMailItem: PostfachMailListItem = postfachMailContainer.getListItem('Subject'); + postfachMailItem.getRoot().click(); + waitForSpinnerToDisappear(); + + subnavigation.back(); + subnavigation.back(); + + haveLength(vorgangList.getItems(), 1); + }); + + it('should show 0 unread messages after viewing second message', () => { + vorgangList.getListItem(vorgangWithReply2.name).getRoot().click(); + waitForSpinnerToDisappear(); + + const postfachMailItem: PostfachMailListItem = postfachMailContainer.getListItem('Subject'); + postfachMailItem.getRoot().click(); + waitForSpinnerToDisappear(); + + subnavigation.back(); + subnavigation.back(); + + haveLength(vorgangList.getItems(), 0); + }); + }); +}); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-zusammenarbeit/vorgang-zusammenarbeit-anfragen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-zusammenarbeit/vorgang-zusammenarbeit-anfragen.cy.ts index ce31b02a2e37104d05b65ec5d3f917969c5ab305..e02c7bed2c4080d6b8fa7d227f826722c67699ce 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-zusammenarbeit/vorgang-zusammenarbeit-anfragen.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-zusammenarbeit/vorgang-zusammenarbeit-anfragen.cy.ts @@ -27,6 +27,10 @@ describe('Vorgang Zusammenarbeit anfragen', () => { status: VorgangStatusE2E.IN_BEARBEITUNG, }; + const titleText: string = 'Dies ist ein Test-Titel !"§$%&'; + const messageText: string = + 'Sehr geehrter Tester\n\n Dies ist ein !"§$%& Test\n zum Testen der Nachricht.\n\n\n\nhier sollte eine \nScrollbar\nangezeigt\nwerden!\n\nMfG!'; + before(() => { initVorgaenge([zusammenarbeitVorgang]); initUsermanagerUsers(); @@ -54,7 +58,7 @@ describe('Vorgang Zusammenarbeit anfragen', () => { exist(zusammenarbeitContainer.getZustaendigeStelleButton()); exist(zusammenarbeitContainer.getStelleTitel()); - exist(zusammenarbeitContainer.getStelleNachricht()); + exist(zusammenarbeitContainer.getMessageText()); exist(zusammenarbeitContainer.getSendButton()); exist(zusammenarbeitContainer.getCancelButton()); }); @@ -64,13 +68,14 @@ describe('Vorgang Zusammenarbeit anfragen', () => { notExist(zusammenarbeitContainer.getZustaendigeStelleButton()); notExist(zusammenarbeitContainer.getStelleTitel()); - notExist(zusammenarbeitContainer.getStelleNachricht()); + notExist(zusammenarbeitContainer.getMessageText()); notExist(zusammenarbeitContainer.getSendButton()); notExist(zusammenarbeitContainer.getCancelButton()); exist(zusammenarbeitContainer.getAnfrageButton()); }); it('should open new search label for Zustaendige Stelle', () => { + zusammenarbeitContainer.createAnfrage(); //button click //Layer wird angezeigt }); @@ -101,9 +106,14 @@ describe('Vorgang Zusammenarbeit anfragen', () => { //Layer ist geschlossen }); + it('should be able to enter title and message, and show scrollbar on long text', () => { + zusammenarbeitContainer.enterTitel(titleText); + zusammenarbeitContainer.enterMessage(messageText); + + zusammenarbeitContainer.messageScrollbarIsPresent(); + }); + it('should show title and message read-only and remove buttons after sending', () => { - //Titel eingeben - //Nachricht eingeben //Button klicken //Titel und Datum werden angezeigt //Nachricht wird angezeigt diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.erledigen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.erledigen.cy.ts index b20cea9b1d2b31d36db3535b7526a8032f1b88ed..c9ea833a1b6086cabc8286b7821531d0b8aac9bb 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.erledigen.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.erledigen.cy.ts @@ -158,6 +158,8 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { waitforSpinnerToAppear(); waitForSpinnerToDisappear(); + wait(1000, 'Wait for async BE to complete'); + containClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); contains( snackBar.getMessage(), @@ -199,6 +201,8 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { waitforSpinnerToAppear(); waitForSpinnerToDisappear(); + wait(1000, 'Wait for async BE to complete'); + notContainClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); contains( snackBar.getMessage(), @@ -229,6 +233,7 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { const locatorIconDefault: string = 'wiedervorlage-icon-default'; it('back to vorgang list', () => { + wait(1000, 'Wait for async BE to complete'); vorgangPage.getSubnavigation().getBackButton().click(); waitForSpinnerToDisappear(); }); @@ -249,6 +254,8 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { subnavigation.erledigen(); waitForSpinnerToDisappear(); + wait(1000, 'Wait for async BE to complete'); + subnavigation.navigateBack(); waitForSpinnerToDisappear(); }); diff --git a/alfa-client/apps/alfa-e2e/src/fixtures/argocd/by-main-dev.yaml b/alfa-client/apps/alfa-e2e/src/fixtures/argocd/by-main-dev.yaml index c73587a0b07ff1fb36e484323bd8f5ea31a19300..00e4ac5efb4577ca7cec3289756e6a85b464340d 100644 --- a/alfa-client/apps/alfa-e2e/src/fixtures/argocd/by-main-dev.yaml +++ b/alfa-client/apps/alfa-e2e/src/fixtures/argocd/by-main-dev.yaml @@ -9,6 +9,8 @@ project: alfa: env: overrideSpringProfiles: "oc,e2e,dev" + customList: + ozgcloud_feature_bescheid-wizard: "true" ingress: use_staging_cert: true ozgcloud: @@ -20,11 +22,12 @@ alfa: vorgang_manager: env: overrideSpringProfiles: "oc,e2e,dev" - ozgcloud_bescheid_smart_documents_url: http://smocker:8080/smartdocuments - ozgcloud_bescheid_smart_documents_basic_auth_username: MGM - ozgcloud_bescheid_smart_documents_basic_auth_password: MGM - ozgcloud_bescheid_smart_documents_template_group: OzgCloudTest - ozgcloud_bescheid_smart_documents_template: Halteverbot + customList: + ozgcloud_bescheid_smart_documents_url: http://smocker:8080/smartdocuments + ozgcloud_bescheid_smart_documents_basic_auth_username: MGM + ozgcloud_bescheid_smart_documents_basic_auth_password: MGM + ozgcloud_bescheid_smart_documents_template_group: OzgCloudTest + ozgcloud_bescheid_smart_documents_template: Halteverbot elasticsearch: enabled: true replicaCount: 1 diff --git a/alfa-client/apps/alfa-e2e/src/fixtures/user-main/user_zelda.json b/alfa-client/apps/alfa-e2e/src/fixtures/user-main/user_zelda.json new file mode 100644 index 0000000000000000000000000000000000000000..a283f68b0934c9f7b991b4ca08ba36caefa20853 --- /dev/null +++ b/alfa-client/apps/alfa-e2e/src/fixtures/user-main/user_zelda.json @@ -0,0 +1,12 @@ +{ + "name": "zelda", + "password": "Y9nk43yrQ_zzIPpfFU-I", + "firstName": "Zelda", + "lastName": "Zusammen", + "fullName": "Zelda Zusammen", + "email": "zelda.z@ozg-sh.de", + "initials": "ZZ", + "dataTestId": "Zelda_Zusammen", + "clientRoles": ["VERWALTUNG_USER"], + "groups": ["E2E Tests"] +} diff --git a/alfa-client/apps/alfa-e2e/src/fixtures/usermanager/usermanager_user_zelda.json b/alfa-client/apps/alfa-e2e/src/fixtures/usermanager/usermanager_user_zelda.json new file mode 100644 index 0000000000000000000000000000000000000000..f41f879cb6fdddb220a07c880ebc5fba946a7da0 --- /dev/null +++ b/alfa-client/apps/alfa-e2e/src/fixtures/usermanager/usermanager_user_zelda.json @@ -0,0 +1,18 @@ +{ + "_id": { + "$oid": "63284e55c39b316b2ad02e2z" + }, + "createdAt": { + "$date": "2024-08-14T13:11:56.489Z" + }, + "deleted": false, + "keycloakUserId": "2ccf0c13-da74-4516-ae3d-f46d30e8ec0c", + "firstName": "Zelda", + "fullName": "Zelda Zusammen", + "lastName": "Zusammen", + "email": "zelda-z@ozg-sh.de", + "lastSyncTimestamp": 1663585874687, + "organisationsEinheitIds": ["9797773", "9093371"], + "roles": ["VERWALTUNG_USER"], + "username": "zelda" +} diff --git a/alfa-client/apps/alfa-e2e/src/support/user-util.ts b/alfa-client/apps/alfa-e2e/src/support/user-util.ts index cf437c63163898a88410f7bbb47143774a312967..a89ac2641cc41863bbce0534b308f3c6cc24ad85 100644 --- a/alfa-client/apps/alfa-e2e/src/support/user-util.ts +++ b/alfa-client/apps/alfa-e2e/src/support/user-util.ts @@ -27,11 +27,13 @@ import { initUsermanagerData, login } from './cypress-helper'; const sabineFixture: UserE2E = require('../fixtures/user-main/user_sabine.json'); const dorotheaFixture: UserE2E = require('../fixtures/user-main/user_dorothea.json'); +const zeldaFixture: UserE2E = require('../fixtures/user-main/user_zelda.json'); const userManagerSabineFixture: UsermanagerUserE2E = require('../fixtures/usermanager/usermanager_user_sabine.json'); const userManagerPeterFixture: UsermanagerUserE2E = require('../fixtures/usermanager/usermanager_user_peter.json'); const userManagerEmilFixture: UsermanagerUserE2E = require('../fixtures/usermanager/usermanager_user_emil.json'); const userManagerDorotheaFixture: UsermanagerUserE2E = require('../fixtures/usermanager/usermanager_user_dorothea.json'); +const userManagerZeldaFixture: UsermanagerUserE2E = require('../fixtures/usermanager/usermanager_user_zelda.json'); export function initUsermanagerUsers() { initUsermanagerData([ @@ -39,6 +41,7 @@ export function initUsermanagerUsers() { getUserManagerUserPeter(), getUserManagerUserEmil(), getUserManagerUserDorothea(), + //getUserManagerUserZelda(), ]); } @@ -50,6 +53,10 @@ export function getUserDorothea(): UserE2E { return dorotheaFixture; } +export function getUserZelda(): UserE2E { + return zeldaFixture; +} + export function getUserManagerUserSabine(): UsermanagerUserE2E { return userManagerSabineFixture; } @@ -66,6 +73,10 @@ export function getUserManagerUserDorothea(): UsermanagerUserE2E { return userManagerDorotheaFixture; } +export function getUserManagerUserZelda(): UsermanagerUserE2E { + return userManagerZeldaFixture; +} + export function getUserSabineId(): string { return getUserManagerUserSabine()._id.$oid; } @@ -77,6 +88,7 @@ enum DatabaseUser { PETER = 'user-main/user_peter.json', RICHARD = 'user-main/user_richard.json', SABINE = 'user-main/user_sabine.json', + ZELDA = 'user-main/user_zelda.json', ZONK = 'user-main/user_zonk.json', } @@ -96,6 +108,10 @@ export function loginAsRichard(): void { login(DatabaseUser.RICHARD); } +export function loginAsZelda(): void { + login(DatabaseUser.ZELDA); +} + export function loginAsSabine(): void { login(DatabaseUser.SABINE); } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/Command.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/Command.java index 1a5d2ac5fda7dc714f9f2b13514dc22705159219..9e862c4756eb06bfa8aa47591b7d390de442d865 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/Command.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/Command.java @@ -26,8 +26,6 @@ package de.ozgcloud.alfa.common.command; import java.time.ZonedDateTime; import java.util.Map; -import org.apache.commons.lang3.StringUtils; - import com.fasterxml.jackson.annotation.JsonIgnore; import de.ozgcloud.alfa.common.LinkedUserProfileResource; @@ -76,14 +74,4 @@ public class Command { public CommandOrder getCommandOrder() { return CommandOrder.fromOrder(order); } - - @JsonIgnore - public boolean isFinishedSuccessfully() { - return status == CommandStatus.FINISHED && StringUtils.isEmpty(errorMessage); - } - - @JsonIgnore - public boolean isNotDone() { - return status.isNotDone(); - } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java index da98c4e572fda1d5c7175040bd88eace508555f6..dc573993c67ac660e97502ae4087e66d43ed3928 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java @@ -23,7 +23,6 @@ */ package de.ozgcloud.alfa.common.command; -import java.util.Calendar; import java.util.Optional; import java.util.stream.Stream; @@ -43,8 +42,6 @@ import lombok.RequiredArgsConstructor; public class CommandService { static final long NO_RELATION_VERSION = -1; - private static final int WAIT_TIME_MS = 500; - private static final int COMMAND_REQUEST_THRESHOLD_MILLIS = 10000; private final CommandRemoteService remoteService; @@ -114,25 +111,4 @@ public class CommandService { return remoteService.findCommands(vorgangId, Optional.of(CommandStatus.FINISHED), Optional.empty()); } - public Command waitUntilDone(Command commandToWaitFor) { - var command = commandToWaitFor; - var calendar = Calendar.getInstance(); - var timeout = calendar.getTimeInMillis() + COMMAND_REQUEST_THRESHOLD_MILLIS; - while (command.isNotDone() && calendar.getTimeInMillis() < timeout) { - synchronized (this) { - try { - wait(WAIT_TIME_MS); - command = reloadCommand(command.getId()); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - } - return command; - } - - public Command reloadCommand(String commandId) { - return remoteService.getCommand(commandId); - } - } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandStatus.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandStatus.java index 548107b825bca6aaed64a50f6f24611c9d7a8174..285ebdaae3817652aa5c80b1d9817628fd044e6c 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandStatus.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandStatus.java @@ -23,14 +23,6 @@ */ package de.ozgcloud.alfa.common.command; -import java.util.Set; - public enum CommandStatus { PENDING, FINISHED, ERROR, REVOKE_PENDING, REVOKED; - - private static final Set<CommandStatus> FINAL_STATES = Set.of(FINISHED, ERROR, REVOKED); - - public boolean isNotDone() { - return !FINAL_STATES.contains(this); - } } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandController.java index 2cc413979da3622e47fc9d0d5677b804f001cf23..7f068905ec5b2f0c464fe677dc4cfa10634847c2 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandController.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandController.java @@ -53,23 +53,26 @@ public class WiedervorlageCommandController { @PathVariable long wiedervorlageVersion) { var wiedervorlage = service.getById(wiedervorlageId); var createdCommand = createCommand(wiedervorlage, command); - var doneCommand = service.updateNextFrist(createdCommand, wiedervorlage.getVorgangId()); - return ResponseEntity.created(linkTo(CommandController.class).slash(doneCommand.getId()).toUri()).build(); + return ResponseEntity.created(linkTo(CommandController.class).slash(createdCommand.getId()).toUri()).build(); } Command createCommand(Wiedervorlage wiedervorlage, CreateCommand command) { switch (command.getOrder()) { case LegacyOrder.WIEDERVORLAGE_ERLEDIGEN: { - return service.erledigen(wiedervorlage); + var changed = wiedervorlage.toBuilder().done(true).build(); + service.updateNextFrist(wiedervorlage.getVorgangId(), changed); + return service.erledigen(changed); } case LegacyOrder.WIEDERVORLAGE_WIEDEREROEFFNEN: { - return service.wiedereroeffnen(wiedervorlage); + var changed = wiedervorlage.toBuilder().done(false).build(); + service.updateNextFrist(wiedervorlage.getVorgangId(), changed); + return service.wiedereroeffnen(changed); } case LegacyOrder.EDIT_WIEDERVORLAGE: { - return service.editWiedervorlage(updateWiedervorlageByCommand(wiedervorlage, (Wiedervorlage) command.getBody()), - wiedervorlage.getId(), - wiedervorlage.getVersion()); + var changed = updateWiedervorlageByCommand(wiedervorlage, (Wiedervorlage) command.getBody()); + service.updateNextFrist(wiedervorlage.getVorgangId(), changed); + return service.editWiedervorlage(changed, wiedervorlage.getId(), wiedervorlage.getVersion()); } default: throw new TechnicalException("Unsupported order " + command.getOrder()); @@ -95,10 +98,12 @@ public class WiedervorlageCommandController { @PostMapping public ResponseEntity<Void> createWiedervorlage(@RequestBody CreateCommand command, @PathVariable String vorgangId) { - var createdCommand = service.createWiedervorlage((Wiedervorlage) command.getBody(), vorgangId); - var doneCommand = service.updateNextFrist(createdCommand, createdCommand.getVorgangId()); + var wiedervorlage = (Wiedervorlage) command.getBody(); + var createdCommand = service.createWiedervorlage(wiedervorlage, vorgangId); - return ResponseEntity.created(linkTo(CommandController.class).slash(doneCommand.getId()).toUri()).build(); + service.updateNextFrist(vorgangId, wiedervorlage); + + return ResponseEntity.created(linkTo(CommandController.class).slash(createdCommand.getId()).toUri()).build(); } } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java index 28f4795c3695c12aa76981ebcb01c2f807fbbbde..c61984151d2b6dd72de917a16391c28aedad325c 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java @@ -33,12 +33,12 @@ import java.util.stream.Stream; import jakarta.validation.Valid; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItemService; import de.ozgcloud.alfa.common.command.Command; -import de.ozgcloud.alfa.common.command.CommandService; import de.ozgcloud.alfa.common.user.CurrentUserService; import lombok.RequiredArgsConstructor; @@ -52,7 +52,6 @@ class WiedervorlageService { private final WiedervorlageRemoteService remoteService; private final VorgangAttachedItemService vorgangAttachedItemService; private final CurrentUserService currentUserService; - private final CommandService commandService; public Command createWiedervorlage(@Valid Wiedervorlage wiedervorlage, String vorgangId) { return vorgangAttachedItemService.createNewWiedervorlage(addCreated(wiedervorlage), vorgangId); @@ -73,18 +72,14 @@ class WiedervorlageService { return remoteService.getById(wiedervorlageId); } - public Command updateNextFrist(Command command, String vorgangId) { - var doneCommand = commandService.waitUntilDone(command); - if (doneCommand.isFinishedSuccessfully()) { - doUpdateNextFrist(vorgangId); - } - return doneCommand; - } - - void doUpdateNextFrist(String vorgangId) { - var allWiedervorlagen = findByVorgangId(vorgangId); + @Async + public void updateNextFrist(String vorgangId, Wiedervorlage changedOrNewWiedervorlage) { + var persistedWiedervorlagen = findByVorgangId(vorgangId); + var persistedWiedervorlagenExcludingChanged = persistedWiedervorlagen.filter( + wiedervorlage -> !wiedervorlage.getId().equals(changedOrNewWiedervorlage.getId())); - remoteService.updateNextFrist(vorgangId, calculateNextFrist(allWiedervorlagen)); + var wiedervorlagen = Stream.concat(persistedWiedervorlagenExcludingChanged, Stream.of(changedOrNewWiedervorlage)); + remoteService.updateNextFrist(vorgangId, calculateNextFrist(wiedervorlagen)); } Optional<LocalDate> calculateNextFrist(Stream<Wiedervorlage> wiedervorlagen) { @@ -100,11 +95,11 @@ class WiedervorlageService { return remoteService.findByVorgangId(vorgangId); } - Command erledigen(Wiedervorlage wiedervorlage) { + public Command erledigen(Wiedervorlage wiedervorlage) { return vorgangAttachedItemService.setWiedervorlageDone(wiedervorlage, true); } - Command wiedereroeffnen(Wiedervorlage wiedervorlage) { + public Command wiedereroeffnen(Wiedervorlage wiedervorlage) { return vorgangAttachedItemService.setWiedervorlageDone(wiedervorlage, false); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandServiceTest.java index 2bf962ce6cb343babed90d058cbe4549f6acb1b5..95b37ba1901cbd62a954642ee61d4daf09fe4954 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandServiceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandServiceTest.java @@ -27,7 +27,6 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -import java.util.Calendar; import java.util.Map; import java.util.Optional; import java.util.UUID; @@ -40,7 +39,6 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.MockedStatic; import org.mockito.Spy; import de.ozgcloud.alfa.loeschanforderung.DeleteLoeschAnforderung; @@ -299,99 +297,4 @@ class CommandServiceTest { verify(remoteService).findCommands(VorgangHeaderTestFactory.ID, Optional.of(CommandStatus.FINISHED), Optional.empty()); } } - - @Nested - class TestWaitUntilDone { - - private final Command pendingCommand = CommandTestFactory.createBuilder().status(CommandStatus.PENDING).build(); - private final Command finishedCommand = pendingCommand.toBuilder().status(CommandStatus.FINISHED).build(); - - @Nested - class OnFinishedCommand { - - @Test - void shouldReturnFinishedCommand() { - var resultCommand = service.waitUntilDone(finishedCommand); - - assertThat(resultCommand).isEqualTo(finishedCommand); - } - - @Test - void shouldNotReloadCommand() { - service.waitUntilDone(finishedCommand); - - verify(service, never()).reloadCommand(any()); - } - } - - @Nested - class OnPendingCommand { - - @BeforeEach - void setUp() { - doReturn(finishedCommand).when(service).reloadCommand(pendingCommand.getId()); - } - - @Test - void shouldReloadCommand() { - service.waitUntilDone(pendingCommand); - - verify(service).reloadCommand(pendingCommand.getId()); - } - - @Test - void shouldReturnDoneCommand() { - var resultCommand = service.waitUntilDone(pendingCommand); - - assertThat(resultCommand).isEqualTo(finishedCommand); - } - } - - @Nested - class OnTimeoutExceeded { - - @Mock - private Calendar calendar; - - @Test - void shouldReturnPendingCommand() { - try (MockedStatic<Calendar> calendarMockedStatic = mockStatic(Calendar.class)) { - calendarMockedStatic.when(Calendar::getInstance).thenReturn(calendar); - when(calendar.getTimeInMillis()).thenReturn(0L, 15000L); - - var resultCommand = service.waitUntilDone(pendingCommand); - - assertThat(resultCommand).isEqualTo(pendingCommand); - } - } - - @Test - void shouldReloadPendingCommand() { - doReturn(pendingCommand).when(service).reloadCommand(pendingCommand.getId()); - - try (MockedStatic<Calendar> calendarMockedStatic = mockStatic(Calendar.class)) { - calendarMockedStatic.when(Calendar::getInstance).thenReturn(calendar); - when(calendar.getTimeInMillis()).thenReturn(0L, 0L, 15000L); - - service.waitUntilDone(pendingCommand); - - verify(service).reloadCommand(pendingCommand.getId()); - } - } - - @Test - void shouldReturnPendingCommandAfterReload() { - doReturn(pendingCommand).when(service).reloadCommand(pendingCommand.getId()); - - try (MockedStatic<Calendar> calendarMockedStatic = mockStatic(Calendar.class)) { - calendarMockedStatic.when(Calendar::getInstance).thenReturn(calendar); - when(calendar.getTimeInMillis()).thenReturn(0L, 0L, 15000L); - - var resultCommand = service.waitUntilDone(pendingCommand); - - assertThat(resultCommand).isEqualTo(pendingCommand); - } - } - } - } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandStatusTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandStatusTest.java deleted file mode 100644 index f91dc7028af4ca954d1dfc9fae1e70affbdcc066..0000000000000000000000000000000000000000 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandStatusTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package de.ozgcloud.alfa.common.command; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; -import org.junit.jupiter.params.provider.EnumSource.Mode; - -class CommandStatusTest { - - @Nested - class TestIsNotDone { - - @ParameterizedTest - @EnumSource(names = { "PENDING", "REVOKE_PENDING" }) - void shouldReturnTrue(CommandStatus status) { - var istNotDone = status.isNotDone(); - - assertThat(istNotDone).isTrue(); - - } - - @ParameterizedTest - @EnumSource(names = { "PENDING", "REVOKE_PENDING" }, mode = Mode.EXCLUDE) - void shouldReturnFalse(CommandStatus status) { - var istNotDone = status.isNotDone(); - - assertThat(istNotDone).isFalse(); - } - - } - -} \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandTest.java deleted file mode 100644 index c838d402226703a6133dc5f8a65b79e7d911373e..0000000000000000000000000000000000000000 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package de.ozgcloud.alfa.common.command; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; -import org.junit.jupiter.params.provider.EnumSource.Mode; -import org.junit.jupiter.params.provider.ValueSource; -import org.mockito.Mock; - -import com.thedeanda.lorem.LoremIpsum; - -class CommandTest { - - @Nested - class TestIsFinishedSuccessfully { - - @Test - void shouldReturnTrue() { - var command = CommandTestFactory.createBuilder().status(CommandStatus.FINISHED).build(); - - var isDoneSuccessfully = command.isFinishedSuccessfully(); - - assertThat(isDoneSuccessfully).isTrue(); - } - - @ParameterizedTest - @EnumSource(names = "FINISHED", mode = Mode.EXCLUDE) - void shouldReturnFalseOnStatusNotFinished(CommandStatus commandStatus) { - var command = CommandTestFactory.createBuilder().status(commandStatus).build(); - - var isDoneSuccessfully = command.isFinishedSuccessfully(); - - assertThat(isDoneSuccessfully).isFalse(); - } - - @ParameterizedTest - @EnumSource - void shouldReturnFalseOnErrorMessage(CommandStatus commandStatus) { - var command = CommandTestFactory.createBuilder().status(commandStatus).errorMessage(LoremIpsum.getInstance().getWords(1)).build(); - - var isDoneSuccessfully = command.isFinishedSuccessfully(); - - assertThat(isDoneSuccessfully).isFalse(); - } - - } - - @Nested - class TestIsNotDone { - - @Mock - private CommandStatus commandStatus; - private Command command; - - @BeforeEach - void setUp() { - command = CommandTestFactory.createBuilder().status(commandStatus).build(); - } - - @Test - void shouldCallIsNotDone() { - command.isNotDone(); - - verify(commandStatus).isNotDone(); - } - - @ParameterizedTest - @ValueSource(booleans = { true, false }) - void shouldReturnIsNotDone(boolean isNotDone) { - when(commandStatus.isNotDone()).thenReturn(isNotDone); - - var result = command.isNotDone(); - - assertThat(result).isEqualTo(isNotDone); - } - - } - -} \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandByVorgangControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandByVorgangControllerTest.java index ef4a43f95f4ed8458d9be2f37bb190e32bd87e84..f8b56e2cb33333ee2e01cd40d411f201632f79d4 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandByVorgangControllerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandByVorgangControllerTest.java @@ -44,13 +44,8 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import de.ozgcloud.alfa.common.binaryfile.BinaryFileTestFactory; -import de.ozgcloud.alfa.common.command.Command; -import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; -import de.ozgcloud.alfa.common.command.CommandStatus; import de.ozgcloud.alfa.common.command.CommandTestFactory; -import de.ozgcloud.alfa.common.command.CreateCommand; import de.ozgcloud.alfa.common.command.LegacyOrder; -import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; import de.ozgcloud.alfa.wiedervorlage.WiedervorlageCommandController.WiedervorlageCommandByVorgangController; import lombok.SneakyThrows; @@ -60,15 +55,10 @@ class WiedervorlageCommandByVorgangControllerTest { @Spy @InjectMocks private WiedervorlageCommandByVorgangController controller; - @Mock - private CommandByRelationController commandByRelationController; - @Mock - private CurrentUserService userService; + @Mock private WiedervorlageService service; - @Captor - private ArgumentCaptor<CreateCommand> createCommandCaptor; private MockMvc mockMvc; @BeforeEach @@ -82,15 +72,10 @@ class WiedervorlageCommandByVorgangControllerTest { @Captor private ArgumentCaptor<Wiedervorlage> wiedervorlageCaptor; - private Command createCommand; - private Command doneCommand; @BeforeEach void mockUserService() { - createCommand = CommandTestFactory.create(); - doneCommand = createCommand.toBuilder().status(CommandStatus.FINISHED).build(); - when(service.createWiedervorlage(any(), any())).thenReturn(createCommand); - when(service.updateNextFrist(createCommand, VorgangHeaderTestFactory.ID)).thenReturn(doneCommand); + when(service.createWiedervorlage(any(), any())).thenReturn(CommandTestFactory.create()); } @Nested @@ -105,10 +90,14 @@ class WiedervorlageCommandByVorgangControllerTest { } @Test - void shouldUpdateNextFristOnSuccessfullyDoneCommand() { + void shouldCallServiceToUpdateNextFrist() { doRequest(); - verify(service).updateNextFrist(createCommand, VorgangHeaderTestFactory.ID); + verify(service).updateNextFrist(eq(VorgangHeaderTestFactory.ID), wiedervorlageCaptor.capture()); + assertThat(wiedervorlageCaptor.getValue()) + .usingRecursiveComparison() + .comparingOnlyFields("betreff", "beschreibung", "frist", "attachments") + .isEqualTo(WiedervorlageTestFactory.create()); } @SneakyThrows diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandControllerTest.java index 198f7a00535cfc7dbcc73c53fa65f3d826a2225d..4ab1dcc715ab7ea4234a59cf2cd79dc30f9d57bb 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandControllerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandControllerTest.java @@ -35,6 +35,8 @@ 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.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; @@ -46,7 +48,6 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; import de.ozgcloud.alfa.common.binaryfile.FileId; import de.ozgcloud.alfa.common.command.Command; import de.ozgcloud.alfa.common.command.CommandOrder; -import de.ozgcloud.alfa.common.command.CommandStatus; import de.ozgcloud.alfa.common.command.CommandTestFactory; import de.ozgcloud.alfa.common.command.CreateCommand; import de.ozgcloud.alfa.common.command.LegacyOrder; @@ -78,18 +79,15 @@ class WiedervorlageCommandControllerTest { @Nested class ControllerMethods { - private Command createCommand; - private Command doneCommand; + @Captor + private ArgumentCaptor<Wiedervorlage> wiedervorlageCaptor; @BeforeEach void init() { when(service.getById(any())).thenReturn(WiedervorlageTestFactory.create()); - createCommand = CommandTestFactory.createBuilder() + when(service.editWiedervorlage(any(), any(), anyLong())).thenReturn(CommandTestFactory.createBuilder() .order(CommandOrder.UPDATE_ATTACHED_ITEM.name()) - .body(WiedervorlageTestFactory.createAsMap()).build(); - doneCommand = createCommand.toBuilder().status(CommandStatus.FINISHED).build(); - when(service.editWiedervorlage(any(), any(), anyLong())).thenReturn(createCommand); - when(service.updateNextFrist(createCommand, VorgangHeaderTestFactory.ID)).thenReturn(doneCommand); + .body(WiedervorlageTestFactory.createAsMap()).build()); } @SneakyThrows @@ -101,10 +99,14 @@ class WiedervorlageCommandControllerTest { } @Test - void shouldUpdateNextFristOnSuccessfullyDoneCommand() { + void shouldCallServiceUpdateNextFrist() { doRequest(); - verify(service).updateNextFrist(createCommand, VorgangHeaderTestFactory.ID); + verify(service).updateNextFrist(eq(VorgangHeaderTestFactory.ID), wiedervorlageCaptor.capture()); + assertThat(wiedervorlageCaptor.getValue()) + .usingRecursiveComparison() + .comparingOnlyFields("betreff", "beschreibung", "frist", "attachments") + .isEqualTo(WiedervorlageTestFactory.create()); } @SneakyThrows @@ -152,6 +154,9 @@ class WiedervorlageCommandControllerTest { @Nested class TestCreateCommand { + @Captor + private ArgumentCaptor<Wiedervorlage> wiedervorlageArgumentCaptor; + @DisplayName("for order 'erledigen'") @Nested class TestOnErledigenOrder { @@ -162,6 +167,23 @@ class WiedervorlageCommandControllerTest { verify(service).erledigen(any(Wiedervorlage.class)); } + + @Test + void shouldUpdateNextFrist() { + callCreateCommand(LegacyOrder.WIEDERVORLAGE_ERLEDIGEN); + + verify(service).updateNextFrist(eq(VorgangHeaderTestFactory.ID), any(Wiedervorlage.class)); + } + + @Test + void shouldSetWiedervorlageAsDone() { + callCreateCommand(LegacyOrder.WIEDERVORLAGE_ERLEDIGEN); + + verify(service).updateNextFrist(eq(VorgangHeaderTestFactory.ID), wiedervorlageArgumentCaptor.capture()); + assertThat(wiedervorlageArgumentCaptor.getValue()) + .usingRecursiveComparison() + .isEqualTo(WiedervorlageTestFactory.createBuilder().done(true).build()); + } } @DisplayName("for order 'wiedereroeffnen'") @@ -174,6 +196,23 @@ class WiedervorlageCommandControllerTest { verify(service).wiedereroeffnen(any(Wiedervorlage.class)); } + + @Test + void shouldUpdateNextFrist() { + callCreateCommand(LegacyOrder.WIEDERVORLAGE_WIEDEREROEFFNEN); + + verify(service).updateNextFrist(eq(VorgangHeaderTestFactory.ID), any(Wiedervorlage.class)); + } + + @Test + void shouldSetWiedervorlageAsOpen() { + callCreateCommand(LegacyOrder.WIEDERVORLAGE_WIEDEREROEFFNEN); + + verify(service).updateNextFrist(eq(VorgangHeaderTestFactory.ID), wiedervorlageArgumentCaptor.capture()); + assertThat(wiedervorlageArgumentCaptor.getValue()) + .usingRecursiveComparison() + .isEqualTo(WiedervorlageTestFactory.createBuilder().done(false).build()); + } } @DisplayName("for order 'edit'") @@ -188,6 +227,16 @@ class WiedervorlageCommandControllerTest { eq(WiedervorlageTestFactory.VERSION)); } + @Test + void shouldUpdateNextFrist() { + var wiedervorlage = WiedervorlageTestFactory.create(); + doReturn(wiedervorlage).when(controller).updateWiedervorlageByCommand(any(), any()); + + callCreateCommand(LegacyOrder.EDIT_WIEDERVORLAGE); + + verify(service).updateNextFrist(VorgangHeaderTestFactory.ID, wiedervorlage); + } + @DisplayName("update wiedervorlage by given command") @Nested class TestUpdateWiedervorlageByCommand { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageServiceTest.java index ae7f2e55675bd0ee63bb76f7a1b175b3bec39534..b8ab4843ea90a7148c175f4349f6a23ba62a6d39 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageServiceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageServiceTest.java @@ -38,7 +38,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; -import org.mockito.ArgumentMatchers; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; @@ -47,7 +46,6 @@ import org.mockito.Spy; import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItemService; import de.ozgcloud.alfa.common.command.Command; import de.ozgcloud.alfa.common.command.CommandService; -import de.ozgcloud.alfa.common.command.CommandStatus; import de.ozgcloud.alfa.common.command.CommandTestFactory; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; @@ -108,14 +106,14 @@ class WiedervorlageServiceTest { } @Test - void shouldSetCreatedAt() { + void shouldSetCreatedAt() throws Exception { var wiedervorlage = callAddCreated(); assertThat(wiedervorlage.getCreatedAt()).isNotNull().isCloseTo(ZonedDateTime.now(), within(2, ChronoUnit.SECONDS)); } @Test - void shouldSetCreatedBy() { + void shouldSetCreatedBy() throws Exception { var wiedervorlage = callAddCreated(); assertThat(wiedervorlage.getCreatedBy()).isEqualTo(UserProfileTestFactory.ID.toString()); @@ -173,150 +171,95 @@ class WiedervorlageServiceTest { } @Nested - class TestDoUpdateNextFrist { - - @Nested - class ServiceMethod { - - @BeforeEach - void mockService() { - when(remoteService.findByVorgangId(any())).thenReturn(Stream.of(WiedervorlageTestFactory.create())); - } - - @Test - void shoulDoCalculation() { - callUpdateNextFrist(); - - verify(service).calculateNextFrist(ArgumentMatchers.<Stream<Wiedervorlage>>any()); - } - - @Test - void shouldCallFindByVorgangId() { - callUpdateNextFrist(); - - verify(service).findByVorgangId(VorgangHeaderTestFactory.ID); - } - - @Test - void shouldCallRemoteService() { - doReturn(Optional.of(WiedervorlageTestFactory.FRIST)).when(service).calculateNextFrist(any()); + class TestUpdateNextFrist { - callUpdateNextFrist(); + private final Wiedervorlage wiedervorlage = WiedervorlageTestFactory.create(); + private final Wiedervorlage foundWiedervorlage = WiedervorlageTestFactory.create(); - verify(remoteService).updateNextFrist(VorgangHeaderTestFactory.ID, Optional.of(WiedervorlageTestFactory.FRIST)); - } + @Captor + private ArgumentCaptor<Stream<Wiedervorlage>> allWiedervorlagen; - private void callUpdateNextFrist() { - service.doUpdateNextFrist(VorgangHeaderTestFactory.ID); - } + @BeforeEach + void mockService() { + when(remoteService.findByVorgangId(VorgangHeaderTestFactory.ID)).thenReturn(Stream.of(foundWiedervorlage)); + doReturn(Optional.of(WiedervorlageTestFactory.FRIST)).when(service).calculateNextFrist(any()); } - @Nested - class Calculation { + @Test + void shouldDoCalculation() { + callUpdateNextFrist(); - @Test - void shouldReturnNullOnAllDone() { - var wiedervorlage = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(1, ChronoUnit.DAYS)).done(true).build(); + verify(service).calculateNextFrist(any()); + } - var nextFrist = calculateNextFrist(Stream.of(wiedervorlage)); + @Test + void shouldAddWiedervorlageToFoundWiedervorlagen() { + callUpdateNextFrist(); - assertThat(nextFrist).isEmpty(); - } + verify(service).calculateNextFrist(allWiedervorlagen.capture()); + assertThat(allWiedervorlagen.getValue()).containsExactly(wiedervorlage); + } - @Test - void shouldReturnEarliestFrist() { - var fristPast2Days = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().minus(2, ChronoUnit.DAYS)).done(false) - .build(); - var fristPast1Day = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().minus(1, ChronoUnit.DAYS)).done(false).build(); - var fristFuture1Day = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(1, ChronoUnit.DAYS)).done(false) - .build(); - var fristFuture2Days = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(2, ChronoUnit.DAYS)).done(false) - .build(); - - var nextFrist = calculateNextFrist(Stream.of(fristPast2Days, fristPast1Day, fristFuture1Day, fristFuture2Days)); - - assertThat(nextFrist).contains(LocalDate.now().minus(2, ChronoUnit.DAYS)); - } + @Test + void shouldCallFindByVorgangId() { + callUpdateNextFrist(); - @Test - void shouldReturnFristIgnoringDone() { - var fristPast1DayNotDone = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(1, ChronoUnit.DAYS)).done(false) - .build(); - var fristPast1DayDone = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().minus(1, ChronoUnit.DAYS)).done(true) - .build(); + verify(service).findByVorgangId(VorgangHeaderTestFactory.ID); + } - var nextFrist = calculateNextFrist(Stream.of(fristPast1DayNotDone, fristPast1DayDone)); + @Test + void shouldCallRemoteService() { + callUpdateNextFrist(); - assertThat(nextFrist).contains(LocalDate.now().plus(1, ChronoUnit.DAYS)); - } + verify(remoteService).updateNextFrist(VorgangHeaderTestFactory.ID, Optional.of(WiedervorlageTestFactory.FRIST)); + } - private Optional<LocalDate> calculateNextFrist(Stream<Wiedervorlage> wiedervorlagen) { - return service.calculateNextFrist(wiedervorlagen); - } + private void callUpdateNextFrist() { + service.updateNextFrist(VorgangHeaderTestFactory.ID, wiedervorlage); } } @Nested - class TestUpdateNextFrist { + class TestCalculateNextFrist { @Test - void shouldWaitUntilCommandDone() { - var pendingCommand = CommandTestFactory.createBuilder().status(CommandStatus.PENDING).build(); - var command = CommandTestFactory.create(); - when(commandService.waitUntilDone(command)).thenReturn(pendingCommand); + void shouldReturnNullOnAllDone() { + var wiedervorlage = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(1, ChronoUnit.DAYS)).done(true).build(); - service.updateNextFrist(command, VorgangHeaderTestFactory.ID); + var nextFrist = calculateNextFrist(Stream.of(wiedervorlage)); - verify(commandService).waitUntilDone(command); + assertThat(nextFrist).isEmpty(); } @Test - void shouldReturnDoneCommand() { - var doneCommand = CommandTestFactory.createBuilder().status(CommandStatus.FINISHED).build(); - var command = CommandTestFactory.create(); - when(commandService.waitUntilDone(command)).thenReturn(doneCommand); - - var result = service.updateNextFrist(command, VorgangHeaderTestFactory.ID); - - assertThat(result).isEqualTo(doneCommand); + void shouldReturnEarliestFrist() { + var fristPast2Days = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().minus(2, ChronoUnit.DAYS)).done(false) + .build(); + var fristPast1Day = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().minus(1, ChronoUnit.DAYS)).done(false).build(); + var fristFuture1Day = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(1, ChronoUnit.DAYS)).done(false) + .build(); + var fristFuture2Days = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(2, ChronoUnit.DAYS)).done(false) + .build(); + + var nextFrist = calculateNextFrist(Stream.of(fristPast2Days, fristPast1Day, fristFuture1Day, fristFuture2Days)); + + assertThat(nextFrist).contains(LocalDate.now().minus(2, ChronoUnit.DAYS)); } - @Nested - class OnDoneSuccessfullyCommand { - private final Command command = CommandTestFactory.create(); - private final Command doneCommand = CommandTestFactory.createBuilder().status(CommandStatus.FINISHED).build(); - - @BeforeEach - void setUp() { - when(commandService.waitUntilDone(command)).thenReturn(doneCommand); - } + @Test + void shouldReturnFristIgnoringDone() { + var fristPast1DayNotDone = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(1, ChronoUnit.DAYS)).done(false) + .build(); + var fristPast1DayDone = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().minus(1, ChronoUnit.DAYS)).done(true) + .build(); - @Test - void shouldUpdateNextFrist() { - service.updateNextFrist(command, VorgangHeaderTestFactory.ID); + var nextFrist = calculateNextFrist(Stream.of(fristPast1DayNotDone, fristPast1DayDone)); - verify(service).doUpdateNextFrist(VorgangHeaderTestFactory.ID); - } + assertThat(nextFrist).contains(LocalDate.now().plus(1, ChronoUnit.DAYS)); } - @Nested - class OnNotDoneSuccessfullyCommand { - private final Command command = CommandTestFactory.create(); - private final Command pendingCommand = CommandTestFactory.createBuilder().status(CommandStatus.PENDING).build(); - - @BeforeEach - void setUp() { - when(commandService.waitUntilDone(command)).thenReturn(pendingCommand); - } - - @Test - void shouldNotUpdateNextFrist() { - service.updateNextFrist(command, VorgangHeaderTestFactory.ID); - - verify(service, never()).doUpdateNextFrist(VorgangHeaderTestFactory.ID); - } + private Optional<LocalDate> calculateNextFrist(Stream<Wiedervorlage> wiedervorlagen) { + return service.calculateNextFrist(wiedervorlagen); } - } - } \ No newline at end of file diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml index c21b9c17e45df3527a4550c51caffadb2295c26c..ebb2209b25b2a4b922e0bf2c6d223c218bbb4516 100644 --- a/src/main/helm/templates/deployment.yaml +++ b/src/main/helm/templates/deployment.yaml @@ -109,6 +109,8 @@ spec: value: {{ ((.Values.ozgcloud).xdomea).behoerdenschluesselUri}} - name: ozgcloud_xdomea_behoerdenschluesselVersion value: {{ ((.Values.ozgcloud).xdomea).behoerdenschluesselVersion | quote }} + - name: grpc_client_zufi-manager_address + value: {{ .Values.zufiManager.address }} {{- if ((.Values.ozgcloud).feature).collaborationEnabled }} - name: ozgcloud_feature_collaborationEnabled value: {{ ((.Values.ozgcloud).feature).collaborationEnabled | quote }} diff --git a/src/main/helm/values.yaml b/src/main/helm/values.yaml index 0e84c312bbfbcf0e243f8b32f2da91f815f353fe..6266e01c7cf25030561b131e411dbc5198f9d93a 100644 --- a/src/main/helm/values.yaml +++ b/src/main/helm/values.yaml @@ -31,7 +31,8 @@ replicaCount: 2 # [default: 2] usermanagerName: user-manager - +zufiManager: + address: dns://zufi-server.zufi:9090 # env: # overrideSpringProfiles: "oc,prod" diff --git a/src/test/helm-linter-values.yaml b/src/test/helm-linter-values.yaml index 51a5840b198286e9e6f323503971c3e56981900f..18f72b2662390d78c5e547e1f7b90d403f8edf7d 100644 --- a/src/test/helm-linter-values.yaml +++ b/src/test/helm-linter-values.yaml @@ -37,3 +37,6 @@ sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret + +zufiManager: + address: https://url.url \ No newline at end of file diff --git a/src/test/helm/deployment_collaboration_env_test.yaml b/src/test/helm/deployment_collaboration_env_test.yaml index 21ca8ba4550390d89e333fb62a3110e389615f81..598d4d9d6efdda176eb76ca35a3fc8e5b9221d8a 100644 --- a/src/test/helm/deployment_collaboration_env_test.yaml +++ b/src/test/helm/deployment_collaboration_env_test.yaml @@ -14,6 +14,16 @@ set: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret tests: + - it: should have set zufi server address + set: + zufiManager: + address: url://url.url + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: grpc_client_zufi-manager_address + value: url://url.url - it: should enable collaboration set: ozgcloud: