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