From 4d43889bb6dab5c0dc36c858f0b5fa4f64be2366 Mon Sep 17 00:00:00 2001 From: Florent POITTEVIN <poittevin.florent@gmail.com> Date: Tue, 2 Jun 2020 17:14:23 +0200 Subject: [PATCH] feat: add cypress test for preservation space depending of roles --- cypress.json | 1 - cypress/integration/admin.spec.ts | 2 + cypress/integration/deposit.spec.ts | 1 + cypress/integration/orgunit-helper.ts | 57 ++++++++++++++++--- .../preservation-space-manager.spec.ts | 26 --------- .../preservation-space-approver.spec.ts | 19 +++++++ .../preservation-space-common.helper.ts | 33 +++++++++++ .../preservation-space-common.spec.ts | 34 +++++++++++ .../preservation-space-creator.spec.ts | 19 +++++++ .../preservation-space-manager.spec.ts | 34 +++++++++++ .../preservation-space-not-member.spec.ts | 35 ++++++++++++ .../preservation-space-steward.spec.ts | 19 +++++++ .../preservation-space-visitor.spec.ts | 22 +++++++ cypress/integration/test-helper.ts | 2 +- debug.log | 5 ++ .../abstract-main-toolbar.presentational.ts | 9 ++- .../admin-orgunit-list.routable.ts | 2 + .../admin/orgunit/orgunit-routing.module.ts | 4 ++ .../preservation-space-home.routable.ts | 5 ++ .../orgunit-request-access.dialog.html | 3 + .../orgunit-request-creation.dialog.html | 3 + .../orgunit-form.presentational.html | 4 ++ .../orgunit-list/orgunit-list.routable.ts | 3 + .../organizational-unit.module.ts | 4 ++ .../preservation-space.module.ts | 8 ++- .../aip-form/aip-form.presentational.ts | 2 +- .../shared-tabs/shared-tabs.container.html | 1 + .../shared-tabs/shared-tabs.container.ts | 2 + .../shared-data-table.presentational.html | 3 + .../shared-data-table.presentational.ts | 10 +++- src/app/shared/enums/data-test.enum.ts | 23 ++++++++ src/app/shared/enums/module-loaded.enum.ts | 3 + .../shared/models/data-table-columns.model.ts | 2 + 33 files changed, 357 insertions(+), 43 deletions(-) delete mode 100644 cypress/integration/preservation-space-manager.spec.ts create mode 100644 cypress/integration/preservation-space/preservation-space-approver.spec.ts create mode 100644 cypress/integration/preservation-space/preservation-space-common.helper.ts create mode 100644 cypress/integration/preservation-space/preservation-space-common.spec.ts create mode 100644 cypress/integration/preservation-space/preservation-space-creator.spec.ts create mode 100644 cypress/integration/preservation-space/preservation-space-manager.spec.ts create mode 100644 cypress/integration/preservation-space/preservation-space-not-member.spec.ts create mode 100644 cypress/integration/preservation-space/preservation-space-steward.spec.ts create mode 100644 cypress/integration/preservation-space/preservation-space-visitor.spec.ts create mode 100644 debug.log diff --git a/cypress.json b/cypress.json index 5b533694a..69dddfb9d 100644 --- a/cypress.json +++ b/cypress.json @@ -2,7 +2,6 @@ "projectId": "xt5fd6", "requestTimeout": 10000, "ignoreTestFiles": "*.js", - "baseUrl": "http://localhost:4200", "chromeWebSecurity": false, "defaultCommandTimeout": 10000 } diff --git a/cypress/integration/admin.spec.ts b/cypress/integration/admin.spec.ts index d3bd6a481..bd1696819 100644 --- a/cypress/integration/admin.spec.ts +++ b/cypress/integration/admin.spec.ts @@ -8,7 +8,9 @@ describe("Admin Page", () => { beforeEach(() => { TestHelper.login(ApplicationRoleEnum.root); cy.get(".avatar-wrapper").first().click(); + cy.wait(1000); // MANDATORY FOR NOT RANDOM ERROR... TestHelper.getTestData(DataTestEnum.linkMenuAdmin).click(); + cy.wait(1000); // MANDATORY FOR NOT RANDOM ERROR... TestHelper.waitModuleLoaded(ModuleLoadedEnum.adminModuleLoaded); }); diff --git a/cypress/integration/deposit.spec.ts b/cypress/integration/deposit.spec.ts index 86f86efba..4a1b0c0a2 100644 --- a/cypress/integration/deposit.spec.ts +++ b/cypress/integration/deposit.spec.ts @@ -9,6 +9,7 @@ describe("Deposit Page", () => { beforeEach(() => { TestHelper.login(ApplicationRoleEnum.root); TestHelper.waitXhr("preingest/deposits?*", () => { + cy.wait(2000); // MANDATORY FOR NOT RANDOM ERROR... TestHelper.getTestData(DataTestEnum.linkMenuDeposit).click(); }, { expectedHttpCode: undefined, diff --git a/cypress/integration/orgunit-helper.ts b/cypress/integration/orgunit-helper.ts index b6e3c2b4a..6464def94 100644 --- a/cypress/integration/orgunit-helper.ts +++ b/cypress/integration/orgunit-helper.ts @@ -11,8 +11,54 @@ import { import {TestHelper} from "./test-helper"; export class OrgunitHelper { - static createOrgUnit(role: RoleEnum | undefined): string { - // const createOrgUnit = + static orgUnitBaseNamePermanent: string = "[Cypress Permanent Test Data] Org Unit"; + static orgUnitBaseNameTemporary: string = "[Cypress Temporary Test Data] Org Unit"; + + private static _generateOrgUnitName(role: RoleEnum | undefined, forPrerequisiteTest: boolean): string { + let orgUnitName = forPrerequisiteTest ? this.orgUnitBaseNamePermanent : this.orgUnitBaseNameTemporary; + let forRoleText = ""; + if (isNotNullNorUndefined(role)) { + forRoleText = " for " + role; + } else { + forRoleText = " for " + "NOBODY"; + } + orgUnitName = orgUnitName + forRoleText; + if (!forPrerequisiteTest) { + orgUnitName = orgUnitName + " " + Guid.MakeNew().ToString().toLowerCase(); + } + return orgUnitName; + } + + static createIfNotExistOrgUnitForPrerequisiteTest(role: RoleEnum | undefined): string { + const orgUnitName = this._generateOrgUnitName(role, true); + TestHelper.login(ApplicationRoleEnum.root); + + // Go to admin page + cy.get(".avatar-wrapper").first().click(); + TestHelper.getTestData(DataTestEnum.linkMenuAdmin).click(); + TestHelper.waitModuleLoaded(ModuleLoadedEnum.adminModuleLoaded); + + // Go to org unit list page + TestHelper.getTestData(DataTestEnum.adminTileOrganizationalUnit).click(); + TestHelper.waitModuleLoaded(ModuleLoadedEnum.adminOrgUnitModuleLoaded); + + TestHelper.getTestData(DataTestEnum.adminOrgUnitListSearchName).type(orgUnitName, {delay: 0, release: false}); + + cy.get("dlcm-shared-data-table").should("attr", "data-test-info-number-line").then((numberElement: number | any) => { + if (numberElement === "1") { + return; + } else if (numberElement === "0") { + this.createOrgUnit(role, true); + } else { + expect(+numberElement).to.be.lte(1); + } + }); + + return orgUnitName; + } + + static createOrgUnit(role: RoleEnum | undefined, forPrerequisiteTest: boolean = false): string { + const orgUnitName = this._generateOrgUnitName(role, forPrerequisiteTest); TestHelper.login(ApplicationRoleEnum.root); // Go to admin page @@ -31,11 +77,6 @@ export class OrgunitHelper { "admin/roles?*", ], () => TestHelper.getTestData(DataTestEnum.create).click()); - let forRoleText = ""; - if (isNotNullNorUndefined(role)) { - forRoleText = " for " + role; - } - const orgUnitName = "Org unit cypress" + forRoleText + " " + Guid.MakeNew().ToString().toLowerCase(); TestHelper.getTestData(DataTestEnum.adminOrgUnitName).type(orgUnitName); TestHelper.getTestData(DataTestEnum.adminOrgUnitSubmissionPolicy) @@ -76,12 +117,12 @@ export class OrgunitHelper { .last() .click(); TestHelper.getTestData(role as any).click(); - return orgUnitName; } TestHelper.waitXhr("admin/organizational-units/*", () => TestHelper.getTestData(DataTestEnum.save).click(), { expectedHttpCode: HttpStatus.OK, method: HttpVerbEnum.GET, }); + return orgUnitName; } } diff --git a/cypress/integration/preservation-space-manager.spec.ts b/cypress/integration/preservation-space-manager.spec.ts deleted file mode 100644 index 94d9afe90..000000000 --- a/cypress/integration/preservation-space-manager.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import {RoleEnum} from "@shared/enums/role.enum"; -import {ApplicationRoleEnum} from "@src/app/shared/enums/application-role.enum"; -import {OrgunitHelper} from "./orgunit-helper"; -import {TestHelper} from "./test-helper"; - -describe("Admin Page", () => { - beforeEach(() => { - OrgunitHelper.createOrgUnit(RoleEnum.MANAGER); - TestHelper.login(ApplicationRoleEnum.user); - }); - - it("Can see org unit", () => { - }); - - it("Can ask creation of org unit", () => { - - }); - - it("Can edit org unit", () => { - - }); - - it("Can display contributor", () => { - - }); -}); diff --git a/cypress/integration/preservation-space/preservation-space-approver.spec.ts b/cypress/integration/preservation-space/preservation-space-approver.spec.ts new file mode 100644 index 000000000..417804c8a --- /dev/null +++ b/cypress/integration/preservation-space/preservation-space-approver.spec.ts @@ -0,0 +1,19 @@ +import {RoleEnum} from "@shared/enums/role.enum"; +import {OrgunitHelper} from "../orgunit-helper"; +import {PreservationSpaceCommonHelper} from "./preservation-space-common.helper"; + +describe("Preservation Space for Approver", () => { + let orgUnitName; + + before(() => { + orgUnitName = OrgunitHelper.createIfNotExistOrgUnitForPrerequisiteTest(RoleEnum.APPROVER); + }); + + beforeEach(() => { + PreservationSpaceCommonHelper.goToPreservationSpaceMenu(); + }); + + it("Can't edit org unit", () => { + PreservationSpaceCommonHelper.shouldNotEditOrgUnit(orgUnitName); + }); +}); diff --git a/cypress/integration/preservation-space/preservation-space-common.helper.ts b/cypress/integration/preservation-space/preservation-space-common.helper.ts new file mode 100644 index 000000000..1e64ddb69 --- /dev/null +++ b/cypress/integration/preservation-space/preservation-space-common.helper.ts @@ -0,0 +1,33 @@ +import {ApplicationRoleEnum} from "@shared/enums/application-role.enum"; +import {DataTestEnum} from "@shared/enums/data-test.enum"; +import {ModuleLoadedEnum} from "@shared/enums/module-loaded.enum"; +import {TestHelper} from "../test-helper"; + +export class PreservationSpaceCommonHelper { + static goToPreservationSpaceMenu(): void { + TestHelper.login(ApplicationRoleEnum.user); + TestHelper.waitXhr("organizational-units?*", () => { + cy.wait(1000); // MANDATORY FOR NOT RANDOM ERROR... + TestHelper.getTestData(DataTestEnum.linkMenuPreservationSpace).click(); + }, { + expectedHttpCode: undefined, + }); + cy.wait(1000); // MANDATORY FOR NOT RANDOM ERROR... + TestHelper.waitModuleLoaded(ModuleLoadedEnum.preservationSpaceModuleLoaded); + TestHelper.waitModuleLoaded(ModuleLoadedEnum.preservationSpaceOrgUnitModuleLoaded); + } + + static goToOrgUnitDetail(orgUnitName: string): void { + TestHelper.getTestData(DataTestEnum.preservationSpaceOrgUnitListSearchName).type(orgUnitName, {delay: 0, release: false}); + cy.get("dlcm-shared-data-table").should("attr", "data-test-info-number-line").should("eq", "1"); + + TestHelper.waitXhrs(["organizational-units/*"], + () => cy.get("tbody").find("tr").first().click()); + } + + static shouldNotEditOrgUnit(orgUnitName: string): void { + PreservationSpaceCommonHelper.goToOrgUnitDetail(orgUnitName); + TestHelper.getTestData(DataTestEnum.preservationSpaceOrgUnitName).click({force: true}); + TestHelper.getTestData(DataTestEnum.save).should("not.exist"); + } +} \ No newline at end of file diff --git a/cypress/integration/preservation-space/preservation-space-common.spec.ts b/cypress/integration/preservation-space/preservation-space-common.spec.ts new file mode 100644 index 000000000..319fdd255 --- /dev/null +++ b/cypress/integration/preservation-space/preservation-space-common.spec.ts @@ -0,0 +1,34 @@ +import {DataTestEnum} from "@shared/enums/data-test.enum"; +import {HttpVerbEnum} from "@shared/enums/http-verb.enum"; +import {HttpStatus} from "solidify-frontend"; +import {TestHelper} from "../test-helper"; +import {PreservationSpaceCommonHelper} from "./preservation-space-common.helper"; + +describe("Preservation Space for Common", () => { + beforeEach(() => { + PreservationSpaceCommonHelper.goToPreservationSpaceMenu(); + }); + + it("Can see contributor", () => { + TestHelper.waitXhr("preingest/contributors?*", () => { + TestHelper.getTestData(DataTestEnum.preservationSpaceTabContributor).click(); + }); + }); + + it("Can ask creation of org unit", () => { + TestHelper.getTestData(DataTestEnum.preservationSpaceOrgUnitButtonAskCreationOrgUnit).click(); + TestHelper.getTestData(DataTestEnum.preservationSpaceOrgUnitAskCreationName).type("Org unit test common"); + TestHelper.getTestData(DataTestEnum.preservationSpaceOrgUnitAskCreationMessage).type("Org unit test message"); + + TestHelper.waitXhr("admin/notifications", () => { + TestHelper.getTestData(DataTestEnum.preservationSpaceOrgUnitAskCreationSubmit).click(); + }, { + expectedHttpCode: HttpStatus.CREATED, + method: HttpVerbEnum.POST, + }); + + TestHelper.waitXhr("admin/notifications/sent?*", () => { + TestHelper.getTestData(DataTestEnum.preservationSpaceTabRequestSent).click(); + }); + }); +}); diff --git a/cypress/integration/preservation-space/preservation-space-creator.spec.ts b/cypress/integration/preservation-space/preservation-space-creator.spec.ts new file mode 100644 index 000000000..698aa8173 --- /dev/null +++ b/cypress/integration/preservation-space/preservation-space-creator.spec.ts @@ -0,0 +1,19 @@ +import {RoleEnum} from "@shared/enums/role.enum"; +import {OrgunitHelper} from "../orgunit-helper"; +import {PreservationSpaceCommonHelper} from "./preservation-space-common.helper"; + +describe("Preservation Space for Creator", () => { + let orgUnitName; + + before(() => { + orgUnitName = OrgunitHelper.createIfNotExistOrgUnitForPrerequisiteTest(RoleEnum.CREATOR); + }); + + beforeEach(() => { + PreservationSpaceCommonHelper.goToPreservationSpaceMenu(); + }); + + it("Can't edit org unit", () => { + PreservationSpaceCommonHelper.shouldNotEditOrgUnit(orgUnitName); + }); +}); diff --git a/cypress/integration/preservation-space/preservation-space-manager.spec.ts b/cypress/integration/preservation-space/preservation-space-manager.spec.ts new file mode 100644 index 000000000..d865e1696 --- /dev/null +++ b/cypress/integration/preservation-space/preservation-space-manager.spec.ts @@ -0,0 +1,34 @@ +import {DataTestEnum} from "@shared/enums/data-test.enum"; +import {HttpVerbEnum} from "@shared/enums/http-verb.enum"; +import {RoleEnum} from "@shared/enums/role.enum"; +import {OrgunitHelper} from "../orgunit-helper"; +import {TestHelper} from "../test-helper"; +import {PreservationSpaceCommonHelper} from "./preservation-space-common.helper"; + +describe("Preservation Space for Manager", () => { + let orgUnitName; + + before(() => { + orgUnitName = OrgunitHelper.createIfNotExistOrgUnitForPrerequisiteTest(RoleEnum.MANAGER); + }); + + beforeEach(() => { + PreservationSpaceCommonHelper.goToPreservationSpaceMenu(); + }); + + it("Can see org unit and edit org unit", () => { + PreservationSpaceCommonHelper.goToOrgUnitDetail(orgUnitName); + + TestHelper.getTestData(DataTestEnum.preservationSpaceOrgUnitName).click({force: true}); + TestHelper.getTestData(DataTestEnum.preservationSpaceOrgUnitName).type(orgUnitName); + TestHelper.waitXhr("admin/organizational-units/*", () => { + TestHelper.getTestData(DataTestEnum.save).click(); + }, { + // expectedHttpCode: HttpStatus.CREATED, // ERROR + method: HttpVerbEnum.PATCH, + }); + }); + + it("Can see received request", () => { + }); +}); diff --git a/cypress/integration/preservation-space/preservation-space-not-member.spec.ts b/cypress/integration/preservation-space/preservation-space-not-member.spec.ts new file mode 100644 index 000000000..550a947d1 --- /dev/null +++ b/cypress/integration/preservation-space/preservation-space-not-member.spec.ts @@ -0,0 +1,35 @@ +import {DataTestEnum} from "@shared/enums/data-test.enum"; +import {HttpVerbEnum} from "@shared/enums/http-verb.enum"; +import {OrgunitHelper} from "../orgunit-helper"; +import {TestHelper} from "../test-helper"; +import {PreservationSpaceCommonHelper} from "./preservation-space-common.helper"; + +describe("Preservation Space for Not Member", () => { + let orgUnitName; + + before(() => { + orgUnitName = OrgunitHelper.createIfNotExistOrgUnitForPrerequisiteTest(undefined); + }); + + beforeEach(() => { + PreservationSpaceCommonHelper.goToPreservationSpaceMenu(); + }); + + it("Can ask to join org unit", () => { + PreservationSpaceCommonHelper.goToOrgUnitDetail(orgUnitName); + + TestHelper.getTestData(DataTestEnum.preservationSpaceOrgUnitButtonAskJoinOrgUnit).click(); + TestHelper.getTestData(DataTestEnum.preservationSpaceOrgUnitAskJoinRole).first().click().get("mat-option").first().click(); + TestHelper.getTestData(DataTestEnum.preservationSpaceOrgUnitAskJoinMessage).type("Can I join"); + TestHelper.waitXhr("admin/notifications", () => { + TestHelper.getTestData(DataTestEnum.preservationSpaceOrgUnitAskJoinSubmit).click(); + }, { + // expectedHttpCode: HttpStatus.CREATED, // Should work but failed + method: HttpVerbEnum.POST, + }); + }); + + it("Can't edit org unit", () => { + PreservationSpaceCommonHelper.shouldNotEditOrgUnit(orgUnitName); + }); +}); diff --git a/cypress/integration/preservation-space/preservation-space-steward.spec.ts b/cypress/integration/preservation-space/preservation-space-steward.spec.ts new file mode 100644 index 000000000..760361823 --- /dev/null +++ b/cypress/integration/preservation-space/preservation-space-steward.spec.ts @@ -0,0 +1,19 @@ +import {RoleEnum} from "@shared/enums/role.enum"; +import {OrgunitHelper} from "../orgunit-helper"; +import {PreservationSpaceCommonHelper} from "./preservation-space-common.helper"; + +describe("Preservation Space for Steward", () => { + let orgUnitName; + + before(() => { + orgUnitName = OrgunitHelper.createIfNotExistOrgUnitForPrerequisiteTest(RoleEnum.STEWARD); + }); + + beforeEach(() => { + PreservationSpaceCommonHelper.goToPreservationSpaceMenu(); + }); + + it("Can't edit org unit", () => { + PreservationSpaceCommonHelper.shouldNotEditOrgUnit(orgUnitName); + }); +}); diff --git a/cypress/integration/preservation-space/preservation-space-visitor.spec.ts b/cypress/integration/preservation-space/preservation-space-visitor.spec.ts new file mode 100644 index 000000000..ff2fd2134 --- /dev/null +++ b/cypress/integration/preservation-space/preservation-space-visitor.spec.ts @@ -0,0 +1,22 @@ +import {RoleEnum} from "@shared/enums/role.enum"; +import {OrgunitHelper} from "../orgunit-helper"; +import {PreservationSpaceCommonHelper} from "./preservation-space-common.helper"; + +describe("Preservation Space for Visitor", () => { + let orgUnitName; + + before(() => { + orgUnitName = OrgunitHelper.createIfNotExistOrgUnitForPrerequisiteTest(RoleEnum.VISITOR); + }); + + beforeEach(() => { + PreservationSpaceCommonHelper.goToPreservationSpaceMenu(); + }); + + it("Can see org unit", () => { + }); + + it("Can't edit org unit", () => { + + }); +}); diff --git a/cypress/integration/test-helper.ts b/cypress/integration/test-helper.ts index e7d926cdb..fd1a2e452 100644 --- a/cypress/integration/test-helper.ts +++ b/cypress/integration/test-helper.ts @@ -34,7 +34,7 @@ export class TestHelper { token = cypressEnvironment.tokenAdmin; break; case ApplicationRoleEnum.user: - token = cypressEnvironment.tokenAdmin; + token = cypressEnvironment.tokenUser; break; case ApplicationRoleEnum.guest: default: diff --git a/debug.log b/debug.log new file mode 100644 index 000000000..7d1564b52 --- /dev/null +++ b/debug.log @@ -0,0 +1,5 @@ +[0602/131250.462:ERROR:process_reader_win.cc(151)] SuspendThread: Accès refusé. (0x5) +[0602/131250.463:ERROR:process_reader_win.cc(151)] SuspendThread: Accès refusé. (0x5) +[0602/131250.463:ERROR:process_reader_win.cc(151)] SuspendThread: Accès refusé. (0x5) +[0602/131250.463:ERROR:process_reader_win.cc(151)] SuspendThread: Accès refusé. (0x5) +[0602/131250.464:ERROR:process_reader_win.cc(151)] SuspendThread: Accès refusé. (0x5) diff --git a/src/app/components/presentationals/main-toolbar/abstract-main-toolbar/abstract-main-toolbar.presentational.ts b/src/app/components/presentationals/main-toolbar/abstract-main-toolbar/abstract-main-toolbar.presentational.ts index 6057d68df..e861e4389 100644 --- a/src/app/components/presentationals/main-toolbar/abstract-main-toolbar/abstract-main-toolbar.presentational.ts +++ b/src/app/components/presentationals/main-toolbar/abstract-main-toolbar/abstract-main-toolbar.presentational.ts @@ -111,6 +111,7 @@ export abstract class AbstractMainToolbarPresentational extends SharedAbstractPr labelToTranslate: AppHelper.home, isVisible: () => true, icon: IconNameEnum.home, + dataTest: DataTestEnum.linkMenuHome, }, { click: (menu) => this.openOrder(), @@ -118,9 +119,10 @@ export abstract class AbstractMainToolbarPresentational extends SharedAbstractPr labelToTranslate: AppHelper.order, isVisible: () => PermissionUtil.isUserHavePermission(this.logged, ApplicationRolePermissionEnum.userPermission, this.userRoles), icon: IconNameEnum.order, - // badgeCounter: () => "" + this.numberMyOrderReadyNew, - // badgeDescription: "Counter of new order ready in my order", - // badgeHidden: () => this.numberMyOrderReadyNew === 0, + badgeCounter: () => "" + this.numberMyOrderReadyNew, + badgeDescription: "Counter of new order ready in my order", + badgeHidden: () => this.numberMyOrderReadyNew === 0, + dataTest: DataTestEnum.linkMenuOrder, }, { click: (menu) => this.navigate(menu.path), @@ -139,6 +141,7 @@ export abstract class AbstractMainToolbarPresentational extends SharedAbstractPr badgeCounter: () => "" + this.numberPendingRequestNotificationInbox, badgeDescription: "Counter of pending request notification in inbox", badgeHidden: () => this.numberPendingRequestNotificationInbox === 0, + dataTest: DataTestEnum.linkMenuPreservationSpace, }, ]; diff --git a/src/app/features/admin/orgunit/components/routables/admin-orgunit-list/admin-orgunit-list.routable.ts b/src/app/features/admin/orgunit/components/routables/admin-orgunit-list/admin-orgunit-list.routable.ts index 4ee676218..0fc899b28 100644 --- a/src/app/features/admin/orgunit/components/routables/admin-orgunit-list/admin-orgunit-list.routable.ts +++ b/src/app/features/admin/orgunit/components/routables/admin-orgunit-list/admin-orgunit-list.routable.ts @@ -13,6 +13,7 @@ import { Store, } from "@ngxs/store"; import {SharedAbstractListRoutable} from "@shared/components/routables/shared-abstract-list/shared-abstract-list.routable"; +import {DataTestEnum} from "@shared/enums/data-test.enum"; import {FieldTypeEnum} from "@shared/enums/field-type.enum"; import {LocalStateEnum} from "@shared/enums/local-state.enum"; import {RouterExtService} from "@shared/services/router-ext.service"; @@ -59,6 +60,7 @@ export class AdminOrgunitListRoutable extends SharedAbstractListRoutable<Organiz order: OrderEnum.descending, isFilterable: true, isSortable: true, + dataTest: DataTestEnum.adminOrgUnitListSearchName, }, { field: "openingDate", diff --git a/src/app/features/admin/orgunit/orgunit-routing.module.ts b/src/app/features/admin/orgunit/orgunit-routing.module.ts index d58456d5e..3200862cf 100644 --- a/src/app/features/admin/orgunit/orgunit-routing.module.ts +++ b/src/app/features/admin/orgunit/orgunit-routing.module.ts @@ -7,6 +7,7 @@ import { RouterModule, Routes, } from "@angular/router"; +import {ModuleLoadedEnum} from "@shared/enums/module-loaded.enum"; import { AdminRoutesEnum, AppRoutesEnum, @@ -52,4 +53,7 @@ const routes: Routes = [ exports: [RouterModule], }) export class AdminOrgunitRoutingModule { + constructor() { + window[ModuleLoadedEnum.adminOrgUnitModuleLoaded] = true; + } } diff --git a/src/app/features/preservation-space/components/routables/preservation-space-home/preservation-space-home.routable.ts b/src/app/features/preservation-space/components/routables/preservation-space-home/preservation-space-home.routable.ts index 62e0fd456..6aa38e90d 100644 --- a/src/app/features/preservation-space/components/routables/preservation-space-home/preservation-space-home.routable.ts +++ b/src/app/features/preservation-space/components/routables/preservation-space-home/preservation-space-home.routable.ts @@ -13,6 +13,7 @@ import {LocalStateModel} from "@app/shared/models/local-state.model"; import {Navigate} from "@ngxs/router-plugin"; import {Store} from "@ngxs/store"; import {Tab} from "@shared/components/containers/shared-tabs/shared-tabs.container"; +import {DataTestEnum} from "@shared/enums/data-test.enum"; import {IconNameEnum} from "@shared/enums/icon-name.enum"; import {SessionStorageEnum} from "@shared/enums/session-storage.enum"; import {SessionStorageHelper} from "@shared/helpers/session-storage.helper"; @@ -46,6 +47,7 @@ export class PreservationSpaceHomeRoutable extends SharedAbstractPresentational titleToTranslate: MARK_AS_TRANSLATABLE("admin.organizationalUnit.home.title"), suffixUrl: PreservationSpaceRoutesEnum.organizationalUnit, route: () => [...this.rootUrl, PreservationSpaceRoutesEnum.organizationalUnit], + dataTest: DataTestEnum.preservationSpaceTabOrgUnit, }, { id: "CONTRIBUTOR", @@ -53,6 +55,7 @@ export class PreservationSpaceHomeRoutable extends SharedAbstractPresentational titleToTranslate: MARK_AS_TRANSLATABLE("preservationSpace.contributor.home.title"), suffixUrl: PreservationSpaceRoutesEnum.contributor, route: () => [...this.rootUrl, PreservationSpaceRoutesEnum.contributor], + dataTest: DataTestEnum.preservationSpaceTabContributor, }, { id: "NOTIFICATION_RECEIVED", @@ -61,6 +64,7 @@ export class PreservationSpaceHomeRoutable extends SharedAbstractPresentational suffixUrl: PreservationSpaceRoutesEnum.notificationInbox, route: () => [...this.rootUrl, PreservationSpaceRoutesEnum.notificationInbox], numberNew: () => SessionStorageHelper.getListItem(SessionStorageEnum.notificationInboxPending).length, + dataTest: DataTestEnum.preservationSpaceTabRequestReceived, }, { id: "NOTIFICATION_SENT", @@ -68,6 +72,7 @@ export class PreservationSpaceHomeRoutable extends SharedAbstractPresentational titleToTranslate: MARK_AS_TRANSLATABLE("preservationSpace.notificationSent.home.title"), suffixUrl: PreservationSpaceRoutesEnum.notificationSent, route: () => [...this.rootUrl, PreservationSpaceRoutesEnum.notificationSent], + dataTest: DataTestEnum.preservationSpaceTabRequestSent, }, ]; diff --git a/src/app/features/preservation-space/organizational-unit/components/dialogs/orgunit-request-access/orgunit-request-access.dialog.html b/src/app/features/preservation-space/organizational-unit/components/dialogs/orgunit-request-access/orgunit-request-access.dialog.html index f18355a5e..dd73a07b2 100644 --- a/src/app/features/preservation-space/organizational-unit/components/dialogs/orgunit-request-access/orgunit-request-access.dialog.html +++ b/src/app/features/preservation-space/organizational-unit/components/dialogs/orgunit-request-access/orgunit-request-access.dialog.html @@ -7,6 +7,7 @@ <mat-label>{{'sorganizationalUnit.modal.requestAccess.form.desiredRole' | translate}}</mat-label> <mat-select [formControl]="fd" [required]="formValidationHelper.hasRequiredField(fd)" + [dlcmDataTest]="dataTestEnum.preservationSpaceOrgUnitAskJoinRole" > <mat-option *ngFor="let role of (listRoleObs | async)" [value]="role.resId" @@ -20,6 +21,7 @@ <mat-label>{{'organizationalUnit.modal.requestAccess.form.message' | translate }}</mat-label> <textarea [formControl]="fd" [solidifyValidation]="errors" + [dlcmDataTest]="dataTestEnum.preservationSpaceOrgUnitAskJoinMessage" matInput [required]="formValidationHelper.hasRequiredField(fd)" ></textarea> @@ -39,6 +41,7 @@ color="primary" [dlcmButtonSpinner]="isLoadingObs | async" [disabled]="form.invalid" + [dlcmDataTest]="dataTestEnum.preservationSpaceOrgUnitAskJoinSubmit" solidifyShortCuts (onEnter)="onSubmit()" (click)="onSubmit()" diff --git a/src/app/features/preservation-space/organizational-unit/components/dialogs/orgunit-request-creation/orgunit-request-creation.dialog.html b/src/app/features/preservation-space/organizational-unit/components/dialogs/orgunit-request-creation/orgunit-request-creation.dialog.html index c6e5990d2..d10bd635b 100644 --- a/src/app/features/preservation-space/organizational-unit/components/dialogs/orgunit-request-creation/orgunit-request-creation.dialog.html +++ b/src/app/features/preservation-space/organizational-unit/components/dialogs/orgunit-request-creation/orgunit-request-creation.dialog.html @@ -8,6 +8,7 @@ <input [formControl]="fd" [solidifyValidation]="errors" matInput + [dlcmDataTest]="dataTestEnum.preservationSpaceOrgUnitAskCreationName" [required]="formValidationHelper.hasRequiredField(fd)" > <mat-error #errors></mat-error> @@ -18,6 +19,7 @@ <textarea [formControl]="fd" [solidifyValidation]="errors" matInput + [dlcmDataTest]="dataTestEnum.preservationSpaceOrgUnitAskCreationMessage" [required]="formValidationHelper.hasRequiredField(fd)" ></textarea> <mat-error #errors></mat-error> @@ -36,6 +38,7 @@ color="primary" [dlcmButtonSpinner]="isLoadingObs | async" [disabled]="form.invalid" + [dlcmDataTest]="dataTestEnum.preservationSpaceOrgUnitAskCreationSubmit" solidifyShortCuts (onEnter)="onSubmit()" (click)="onSubmit()" diff --git a/src/app/features/preservation-space/organizational-unit/components/presentationals/orgunit-form/orgunit-form.presentational.html b/src/app/features/preservation-space/organizational-unit/components/presentationals/orgunit-form/orgunit-form.presentational.html index e181a5d75..03ef9914f 100644 --- a/src/app/features/preservation-space/organizational-unit/components/presentationals/orgunit-form/orgunit-form.presentational.html +++ b/src/app/features/preservation-space/organizational-unit/components/presentationals/orgunit-form/orgunit-form.presentational.html @@ -14,6 +14,7 @@ [autocomplete]="'off'" [placeholder]="'organizationalUnit.name' | translate" [required]="formValidationHelper.hasRequiredField(fd)" + [dlcmDataTest]="dataTestEnum.preservationSpaceOrgUnitName" (blur)="checkAvailable(formDefinition.name, fd)" > <mat-error #errors></mat-error> @@ -43,6 +44,7 @@ <button *ngIf="readonly && securityService.isRootOrAdmin() || securityService.isMemberOfOrgUnit(model.resId)" dlcmAlternativeButton solidifyShortCuts + [dlcmDataTest]="dataTestEnum.preservationSpaceOrgUnitButtonSeeDeposit" (onEnter)="goToDeposit()" (click)="goToDeposit()" > @@ -61,6 +63,7 @@ <button *ngIf="readonly && securityService.isRootOrAdmin() || securityService.isMemberOfOrgUnit(model.resId)" dlcmAlternativeButton solidifyShortCuts + [dlcmDataTest]="dataTestEnum.preservationSpaceOrgUnitButtonSeeReceivedRequest" (onEnter)="goToReceivedRequestNotification()" (click)="goToReceivedRequestNotification()" > @@ -181,6 +184,7 @@ <button *ngIf="readonly && !this.securityService.isMemberOfOrgUnit(model.resId)" dlcmAlternativeButton solidifyShortCuts + [dlcmDataTest]="dataTestEnum.preservationSpaceOrgUnitButtonAskJoinOrgUnit" (onEnter)="requestToBeMember()" (click)="requestToBeMember()" > diff --git a/src/app/features/preservation-space/organizational-unit/components/routables/orgunit-list/orgunit-list.routable.ts b/src/app/features/preservation-space/organizational-unit/components/routables/orgunit-list/orgunit-list.routable.ts index d8b6e6a2c..55e3af437 100644 --- a/src/app/features/preservation-space/organizational-unit/components/routables/orgunit-list/orgunit-list.routable.ts +++ b/src/app/features/preservation-space/organizational-unit/components/routables/orgunit-list/orgunit-list.routable.ts @@ -27,6 +27,7 @@ import { Store, } from "@ngxs/store"; import {SharedAbstractListRoutable} from "@shared/components/routables/shared-abstract-list/shared-abstract-list.routable"; +import {DataTestEnum} from "@shared/enums/data-test.enum"; import {FieldTypeEnum} from "@shared/enums/field-type.enum"; import {IconNameEnum} from "@shared/enums/icon-name.enum"; import {LocalStateEnum} from "@shared/enums/local-state.enum"; @@ -72,6 +73,7 @@ export class OrgunitListRoutable extends SharedAbstractListRoutable<Organization labelToTranslate: MARK_AS_TRANSLATABLE("organizationalUnit.button.askCreationOrgunit"), callback: () => this.requestCreationOrgUnit(), order: 40, + dataTest: DataTestEnum.preservationSpaceOrgUnitButtonAskCreationOrgUnit, }, ], }); @@ -163,6 +165,7 @@ export class OrgunitListRoutable extends SharedAbstractListRoutable<Organization order: OrderEnum.ascending, isFilterable: true, isSortable: true, + dataTest: DataTestEnum.preservationSpaceOrgUnitListSearchName, }, { field: "openingDate", diff --git a/src/app/features/preservation-space/organizational-unit/organizational-unit.module.ts b/src/app/features/preservation-space/organizational-unit/organizational-unit.module.ts index 48812d6c7..42128dc6e 100644 --- a/src/app/features/preservation-space/organizational-unit/organizational-unit.module.ts +++ b/src/app/features/preservation-space/organizational-unit/organizational-unit.module.ts @@ -8,6 +8,7 @@ import {OrganizationalUnitState} from "@app/features/preservation-space/organiza import {OrganizationalUnitPersonRoleState} from "@app/features/preservation-space/organizational-unit/stores/person-role/organizational-unit-person-role.state"; import {TranslateModule} from "@ngx-translate/core"; import {NgxsModule} from "@ngxs/store"; +import {ModuleLoadedEnum} from "@shared/enums/module-loaded.enum"; import {SharedModule} from "@shared/shared.module"; import {OrgunitRequestAccessDialog} from "./components/dialogs/orgunit-request-access/orgunit-request-access.dialog"; @@ -49,4 +50,7 @@ const presentationals = [ providers: [], }) export class OrganizationalUnitModule { + constructor() { + window[ModuleLoadedEnum.preservationSpaceOrgUnitModuleLoaded] = true; + } } diff --git a/src/app/features/preservation-space/preservation-space.module.ts b/src/app/features/preservation-space/preservation-space.module.ts index a19069603..3c9ce86d6 100644 --- a/src/app/features/preservation-space/preservation-space.module.ts +++ b/src/app/features/preservation-space/preservation-space.module.ts @@ -3,12 +3,13 @@ import {PreservationSpaceHomeRoutable} from "@app/features/preservation-space/co import {ContributorDepositState} from "@app/features/preservation-space/contributor/stores/contributor-deposit/contributor-deposit.state"; import {ContributorState} from "@app/features/preservation-space/contributor/stores/contributor.state"; import {PreservationSpaceNotificationState} from "@app/features/preservation-space/notification/stores/preservation-space-notification.state"; +import {PreservationSpaceNotificationStatusHistoryState} from "@app/features/preservation-space/notification/stores/status-history/preservation-space-notification-status-history.state"; import {PreservationSpaceRoutingModule} from "@app/features/preservation-space/preservation-space-routing.module"; import {PreservationSpaceState} from "@app/features/preservation-space/stores/preservation-space.state"; import {SharedModule} from "@app/shared/shared.module"; import {TranslateModule} from "@ngx-translate/core"; import {NgxsModule} from "@ngxs/store"; -import {PreservationSpaceNotificationStatusHistoryState} from "@app/features/preservation-space/notification/stores/status-history/preservation-space-notification-status-history.state"; +import {ModuleLoadedEnum} from "@shared/enums/module-loaded.enum"; const routables = [ PreservationSpaceHomeRoutable, @@ -33,7 +34,7 @@ const presentationals = []; ContributorState, ContributorDepositState, PreservationSpaceNotificationState, - PreservationSpaceNotificationStatusHistoryState + PreservationSpaceNotificationStatusHistoryState, ]), ], entryComponents: [ @@ -45,4 +46,7 @@ const presentationals = []; providers: [], }) export class PreservationSpaceModule { + constructor() { + window[ModuleLoadedEnum.preservationSpaceModuleLoaded] = true; + } } diff --git a/src/app/features/preservation/aip/components/presentationals/aip-form/aip-form.presentational.ts b/src/app/features/preservation/aip/components/presentationals/aip-form/aip-form.presentational.ts index c05970d7d..b4756d5b0 100644 --- a/src/app/features/preservation/aip/components/presentationals/aip-form/aip-form.presentational.ts +++ b/src/app/features/preservation/aip/components/presentationals/aip-form/aip-form.presentational.ts @@ -24,10 +24,10 @@ import { DateUtil, isNullOrUndefined, KeyValue, + MARK_AS_TRANSLATABLE, PropertyName, ResourceNameSpace, StringUtil, - MARK_AS_TRANSLATABLE, urlSeparator, } from "solidify-frontend"; diff --git a/src/app/shared/components/containers/shared-tabs/shared-tabs.container.html b/src/app/shared/components/containers/shared-tabs/shared-tabs.container.html index e37170261..3f3291fa5 100644 --- a/src/app/shared/components/containers/shared-tabs/shared-tabs.container.html +++ b/src/app/shared/components/containers/shared-tabs/shared-tabs.container.html @@ -9,6 +9,7 @@ (click)="navigateToTab(tab)" matRipple [matRippleDisabled]="tab === currentTab" + [dlcmDataTest]="tab.dataTest" id="tab-{{tab.id | lowercase}}" > <dlcm-shared-icon *ngIf="tab.icon" diff --git a/src/app/shared/components/containers/shared-tabs/shared-tabs.container.ts b/src/app/shared/components/containers/shared-tabs/shared-tabs.container.ts index 5050aa86e..a3787d016 100644 --- a/src/app/shared/components/containers/shared-tabs/shared-tabs.container.ts +++ b/src/app/shared/components/containers/shared-tabs/shared-tabs.container.ts @@ -14,6 +14,7 @@ import { import {Navigate} from "@ngxs/router-plugin"; import {Store} from "@ngxs/store"; import {SharedAbstractContainer} from "@shared/components/containers/shared-abstract/shared-abstract.container"; +import {DataTestEnum} from "@shared/enums/data-test.enum"; import {IconNameEnum} from "@shared/enums/icon-name.enum"; import { BehaviorSubject, @@ -141,4 +142,5 @@ export interface Tab { conditionDisplay?: () => boolean | Observable<boolean> | undefined; route?: () => string | string[]; numberNew?: () => number; + dataTest?: DataTestEnum; } diff --git a/src/app/shared/components/presentationals/shared-data-table/shared-data-table.presentational.html b/src/app/shared/components/presentationals/shared-data-table/shared-data-table.presentational.html index a73ac400e..ea9578185 100644 --- a/src/app/shared/components/presentationals/shared-data-table/shared-data-table.presentational.html +++ b/src/app/shared/components/presentationals/shared-data-table/shared-data-table.presentational.html @@ -126,6 +126,7 @@ [ngModel]="getValue(col)" [labelKey]="'name'" [valueKey]="'resId'" + [dlcmDataTest]="col.dataTest" (valueChange)="searchChange(col, $event)" > </dlcm-shared-searchable-single-select> @@ -137,6 +138,7 @@ <mat-select #select [class.no-value]="!select.value" [value]="getValue(col)" + [dlcmDataTest]="col.dataTest" (selectionChange)="searchChange(col, $event.value)" > <mat-option>{{'table.filter.all' | translate}}</mat-option> @@ -176,6 +178,7 @@ #filter (keyup)="searchChange(col, $event.target.value)" [value]="getValue(col)" + [dlcmDataTest]="col.dataTest" > <button mat-button *ngIf="filter.value" diff --git a/src/app/shared/components/presentationals/shared-data-table/shared-data-table.presentational.ts b/src/app/shared/components/presentationals/shared-data-table/shared-data-table.presentational.ts index 030b81ef8..7fa91e696 100644 --- a/src/app/shared/components/presentationals/shared-data-table/shared-data-table.presentational.ts +++ b/src/app/shared/components/presentationals/shared-data-table/shared-data-table.presentational.ts @@ -3,6 +3,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, + HostBinding, Input, OnChanges, Output, @@ -47,6 +48,7 @@ import { isTrue, MappingObject, MappingObjectUtil, + MARK_AS_TRANSLATABLE, NotificationService, ObjectUtil, ObservableUtil, @@ -56,7 +58,6 @@ import { QueryParametersUtil, Sort, StringUtil, - MARK_AS_TRANSLATABLE, } from "solidify-frontend"; @Component({ @@ -74,6 +75,9 @@ export class SharedDataTablePresentational<TResource extends BaseResource> exten private _datas: TResource[]; defaultSortColumn: DataTableColumns; + @HostBinding("attr.data-test-info-number-line") + numberLine: number; + @Input() set datas(value: TResource[]) { if (this.pendingRetreiveAllForSelection) { @@ -109,6 +113,7 @@ export class SharedDataTablePresentational<TResource extends BaseResource> exten @Input() skipInitialQuery: boolean = false; + @HostBinding("attr.data-test-info-is-loading") @Input() isLoading: boolean = false; @@ -336,6 +341,9 @@ export class SharedDataTablePresentational<TResource extends BaseResource> exten let isDatasPresent = false; if (!isNullOrUndefined(this.datas) && this.datas.length > 0) { isDatasPresent = true; + this.numberLine = this.datas.length; + } else { + this.numberLine = 0; } this.isDatasPresent = isDatasPresent; } diff --git a/src/app/shared/enums/data-test.enum.ts b/src/app/shared/enums/data-test.enum.ts index ded8cf602..4156b3f55 100644 --- a/src/app/shared/enums/data-test.enum.ts +++ b/src/app/shared/enums/data-test.enum.ts @@ -10,6 +10,8 @@ export enum DataTestEnum { linkMenuAdmin = "link-menu-admin", linkMenuPreservationPlanning = "link-menu-preservation-planning", linkMenuPreservationSpace = "link-menu-preservation-space", + linkMenuOrder = "link-menu-order", + linkMenuHome = "link-menu-home", // Main Button back = "back", @@ -36,6 +38,26 @@ export enum DataTestEnum { depositFileDataTable = "deposit-file-data-table", depositDataCategory = "deposit-data-category", + // Preservation Space + preservationSpaceTabOrgUnit = "preservationSpace-tab-orgUnit", + preservationSpaceTabContributor = "preservationSpace-tab-contributor", + preservationSpaceTabRequestReceived = "preservationSpace-tab-requestReceived", + preservationSpaceTabRequestSent = "preservationSpace-tab-requestSent", + + // Preservation Space Org Unit + preservationSpaceOrgUnitName = "preservationSpace-orgUnit-name", + preservationSpaceOrgUnitListSearchName = "preservationSpace-orgUnit-list-searchName", + preservationSpaceOrgUnitButtonSeeDeposit = "preservationSpace-orgUnit-button-seeDeposit", + preservationSpaceOrgUnitButtonSeeReceivedRequest = "preservationSpace-orgUnit-button-seeReceivedRequest", + preservationSpaceOrgUnitButtonAskJoinOrgUnit = "preservationSpace-orgUnit-button-askJoinOrgUnit", + preservationSpaceOrgUnitButtonAskCreationOrgUnit = "preservationSpace-orgUnit-button-askCreationOrgUnit", + preservationSpaceOrgUnitAskCreationName = "preservationSpace-orgUnit-askCreation-name", + preservationSpaceOrgUnitAskCreationMessage = "preservationSpace-orgUnit-askCreation-message", + preservationSpaceOrgUnitAskCreationSubmit = "preservationSpace-orgUnit-askCreation-submit", + preservationSpaceOrgUnitAskJoinRole = "preservationSpace-orgUnit-askJoin-role", + preservationSpaceOrgUnitAskJoinMessage = "preservationSpace-orgUnit-askJoin-message", + preservationSpaceOrgUnitAskJoinSubmit = "preservationSpace-orgUnit-askJoin-submit", + // Admin Home adminTileOrganizationalUnit = "admin-tile-organizational-unit", adminTileSubmissionPolicy = "admin-tile-submission-policy", @@ -44,6 +66,7 @@ export enum DataTestEnum { // Admin Org Unit adminOrgUnitName = "admin-orgUnit-name", + adminOrgUnitListSearchName = "admin-orgUnit-list-searchName", adminOrgUnitSubmissionPolicy = "admin-orgUnit-submissionPolicy", adminOrgUnitPreservationPolicy = "admin-orgUnit-preservationPolicy", diff --git a/src/app/shared/enums/module-loaded.enum.ts b/src/app/shared/enums/module-loaded.enum.ts index 3594d4d5d..1b4987f14 100644 --- a/src/app/shared/enums/module-loaded.enum.ts +++ b/src/app/shared/enums/module-loaded.enum.ts @@ -1,5 +1,8 @@ export enum ModuleLoadedEnum { + preservationSpaceModuleLoaded = "preservationSpaceModuleLoaded", + preservationSpaceOrgUnitModuleLoaded = "preservationSpaceOrgUnitModuleLoaded", depositModuleLoaded = "depositModuleLoaded", adminModuleLoaded = "adminModuleLoaded", + adminOrgUnitModuleLoaded = "adminOrgUnitModuleLoaded", preservationPlanningModuleLoaded = "preservationPlanningModuleLoaded" } diff --git a/src/app/shared/models/data-table-columns.model.ts b/src/app/shared/models/data-table-columns.model.ts index 8f05a008f..e0a3b5a21 100644 --- a/src/app/shared/models/data-table-columns.model.ts +++ b/src/app/shared/models/data-table-columns.model.ts @@ -1,5 +1,6 @@ import {FieldTypeEnum} from "@app/shared/enums/field-type.enum"; import {DataTableComponentEnum} from "@shared/enums/data-table-component.enum"; +import {DataTestEnum} from "@shared/enums/data-test.enum"; import { BaseResourceType, isNullOrUndefined, @@ -16,6 +17,7 @@ export interface DataTableColumns<TResource extends BaseResourceType = any> { type?: FieldTypeEnum; order: OrderEnum; filterEnum?: KeyValue[]; + dataTest?: DataTestEnum; isMultipleFilterEnum?: boolean; translate?: boolean; isSortable?: boolean; -- GitLab