From dfb123dd006f4f349e6cc00e347e418d849978c2 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Tue, 13 Aug 2024 17:28:46 +0200 Subject: [PATCH 01/14] create separate projects for managed server monitoring --- ...e-cte-experiments-for-accessible-uuids.sql | 148 ++++++++++++++++++ .../project/HsBookingProjectEntity.java | 2 +- .../hosting/asset/HsHostingAssetEntity.java | 3 + .../changelog/0-basis/008-raise-functions.sql | 19 ++- .../changelog/1-rbac/1058-rbac-generators.sql | 49 +++--- .../6203-hs-booking-project-rbac.md | 2 +- .../6203-hs-booking-project-rbac.sql | 2 +- .../7013-hs-hosting-asset-rbac.md | 6 +- .../7013-hs-hosting-asset-rbac.sql | 9 +- ...HsBookingItemControllerAcceptanceTest.java | 3 +- ...sBookingItemRepositoryIntegrationTest.java | 12 +- ...ookingProjectControllerAcceptanceTest.java | 3 +- ...okingProjectRepositoryIntegrationTest.java | 10 +- ...sHostingAssetControllerAcceptanceTest.java | 3 +- ...HostingAssetRepositoryIntegrationTest.java | 16 +- .../hs/migration/ImportHostingAssets.java | 56 +++++-- .../resources/migration/hosting/inet_addr.csv | 1 + .../resources/migration/hosting/packet.csv | 1 + .../migration/hosting/packet_component.csv | 1 + .../resources/migration/hosting/unixuser.csv | 1 + 20 files changed, 291 insertions(+), 56 deletions(-) create mode 100644 sql/recursive-cte-experiments-for-accessible-uuids.sql diff --git a/sql/recursive-cte-experiments-for-accessible-uuids.sql b/sql/recursive-cte-experiments-for-accessible-uuids.sql new file mode 100644 index 00000000..ae6f27dc --- /dev/null +++ b/sql/recursive-cte-experiments-for-accessible-uuids.sql @@ -0,0 +1,148 @@ +-- just a permanent playground to explore optimization of the central recursive CTE query for RBAC + +rollback transaction; +begin transaction; +SET TRANSACTION READ ONLY; +call defineContext('performance testing', null, 'superuser-alex@hostsharing.net', + 'hs_booking_project#D-1000000-hshdefaultproject:ADMIN'); +-- 'hs_booking_project#D-1000300-mihdefaultproject:ADMIN'); +select count(type) as counter, type from hs_hosting_asset_rv + group by type + order by counter desc; +commit transaction; + + + + +rollback transaction; +begin transaction; +SET TRANSACTION READ ONLY; +call defineContext('performance testing', null, 'superuser-alex@hostsharing.net', + 'hs_booking_project#D-1000000-hshdefaultproject:ADMIN'); +-- 'hs_booking_project#D-1000300-mihdefaultproject:ADMIN'); + +with accessible_hs_hosting_asset_uuids as + (with recursive + recursive_grants as + (select distinct rbacgrants.descendantuuid, + rbacgrants.ascendantuuid, + 1 as level, + true + from rbacgrants + where rbacgrants.assumed + and (rbacgrants.ascendantuuid = any (currentsubjectsuuids())) + union all + select distinct g.descendantuuid, + g.ascendantuuid, + grants.level + 1 as level, + assertTrue(grants.level < 22, 'too many grant-levels: ' || grants.level) + from rbacgrants g + join recursive_grants grants on grants.descendantuuid = g.ascendantuuid + where g.assumed), + grant_count AS ( + SELECT COUNT(*) AS grant_count FROM recursive_grants + ), + count_check as (select assertTrue((select count(*) as grant_count from recursive_grants) < 300000, + 'too many grants for current subjects: ' || (select count(*) as grant_count from recursive_grants)) + as valid) + select distinct perm.objectuuid + from recursive_grants + join rbacpermission perm on recursive_grants.descendantuuid = perm.uuid + join rbacobject obj on obj.uuid = perm.objectuuid + join count_check cc on cc.valid + where obj.objecttable::text = 'hs_hosting_asset'::text) +select type, +-- count(*) as counter + target.uuid, +-- target.version, +-- target.bookingitemuuid, +-- target.type, +-- target.parentassetuuid, +-- target.assignedtoassetuuid, + target.identifier, + target.caption +-- target.config, +-- target.alarmcontactuuid + from hs_hosting_asset target + where (target.uuid in (select accessible_hs_hosting_asset_uuids.objectuuid + from accessible_hs_hosting_asset_uuids)) + and target.type in ('EMAIL_ADDRESS', 'CLOUD_SERVER', 'MANAGED_SERVER', 'MANAGED_WEBSPACE') +-- and target.type = 'EMAIL_ADDRESS' +-- order by target.identifier; +-- group by type +-- order by counter desc +; +commit transaction; + + + + +rollback transaction; +begin transaction; +SET TRANSACTION READ ONLY; +call defineContext('performance testing', null, 'superuser-alex@hostsharing.net', + 'hs_booking_project#D-1000000-hshdefaultproject:ADMIN'); +-- 'hs_booking_project#D-1000300-mihdefaultproject:ADMIN'); + +with one_path as (with recursive path as ( + -- Base case: Start with the row where ascending equals the starting UUID + select ascendantuuid, + descendantuuid, + array [ascendantuuid] as path_so_far + from rbacgrants + where ascendantuuid = any (currentsubjectsuuids()) + + union all + + -- Recursive case: Find the next step in the path + select c.ascendantuuid, + c.descendantuuid, + p.path_so_far || c.ascendantuuid + from rbacgrants c + inner join + path p on c.ascendantuuid = p.descendantuuid + where c.ascendantuuid != all (p.path_so_far) -- Prevent cycles + ) + -- Final selection: Output all paths that reach the target UUID + select distinct array_length(path_so_far, 1), + path_so_far || descendantuuid as full_path + from path + join rbacpermission perm on perm.uuid = path.descendantuuid + join hs_hosting_asset ha on ha.uuid = perm.objectuuid + -- JOIN rbacrole_ev re on re.uuid = any(path_so_far) + where ha.identifier = 'vm1068' + order by array_length(path_so_far, 1) + limit 1 + ) +select + ( + SELECT ARRAY_AGG(re.roleidname ORDER BY ord.idx) + FROM UNNEST(one_path.full_path) WITH ORDINALITY AS ord(uuid, idx) + JOIN rbacrole_ev re ON ord.uuid = re.uuid + ) AS name_array + from one_path; +commit transaction; + + + + +select * from +( + select uuid, roleidname as name from rbacrole_ev + union all + select uuid, p.optablename || ':' || p.objectuuid || ':' || p.op as name from rbacpermission p +) united + where uuid in ( + '4157915c-a09b-490c-9430-00005fcfbb4f', + '046f2da0-66d5-4e6a-af17-d41fba617b30', + '6239ca11-5224-401d-9780-1af7f5cbf35a', + '70004958-39c7-4d32-8ba6-d78145f3ad32', + '7065fbc1-c605-4da3-97dd-f40fe1b90b4c', + 'd551551b-b1dd-414a-a0ed-a07712f15e62', + 'f1f0fc3e-020a-48fe-b9c1-ac495cc21fdf', + '63ad71f3-214c-411e-8b0b-a859e54af770', + '561bbe75-b8f2-4e4b-86ac-02a72ab9a6e8', + '379e99b3-b53f-421d-a53e-2e81c464fbf2', + '5cb1ecb2-7962-47e0-b8bf-67974da45208' + ); + diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntity.java index c44d43f5..1d893ac0 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntity.java @@ -94,7 +94,7 @@ public class HsBookingProjectEntity implements Stringifyable, BaseEntity { - with.incomingSuperRole("debitorRel", AGENT); + with.incomingSuperRole("debitorRel", AGENT).unassumed(); }) .createSubRole(ADMIN, (with) -> { with.permission(UPDATE); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java index 46b315ff..0b28197c 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java @@ -192,6 +192,9 @@ public class HsHostingAssetEntity implements HsHostingAsset { with.outgoingSubRole("bookingItem", TENANT); with.outgoingSubRole("parentAsset", TENANT); with.incomingSuperRole("alarmContact", ADMIN); + }) + .createSubRole(REFERRER, (with) -> { + with.incomingSuperRole("assignedToAsset", AGENT); with.permission(SELECT); }) diff --git a/src/main/resources/db/changelog/0-basis/008-raise-functions.sql b/src/main/resources/db/changelog/0-basis/008-raise-functions.sql index 15b34d7d..ad298dc9 100644 --- a/src/main/resources/db/changelog/0-basis/008-raise-functions.sql +++ b/src/main/resources/db/changelog/0-basis/008-raise-functions.sql @@ -1,11 +1,10 @@ --liquibase formatted sql -- ============================================================================ --- RAISE-FUNCTIONS --changeset RAISE-FUNCTIONS:1 endDelimiter:--// -- ---------------------------------------------------------------------------- /* - Like RAISE EXCEPTION ... just as an expression instead of a statement. + Like `RAISE EXCEPTION` ... just as an expression instead of a statement. */ create or replace function raiseException(msg text) returns varchar @@ -14,3 +13,19 @@ begin raise exception using message = msg; end; $$; --// + + +-- ============================================================================ +--changeset ASSERT-FUNCTIONS:1 endDelimiter:--// +-- ---------------------------------------------------------------------------- +/* + Like `ASSERT` but as an expression instead of a statement. + */ +create or replace function assertTrue(expectedTrue boolean, msg text) + returns boolean + language plpgsql as $$ +begin + assert expectedTrue, msg; + return expectedTrue; +end; $$; +--// diff --git a/src/main/resources/db/changelog/1-rbac/1058-rbac-generators.sql b/src/main/resources/db/changelog/1-rbac/1058-rbac-generators.sql index 59223d9d..44281bed 100644 --- a/src/main/resources/db/changelog/1-rbac/1058-rbac-generators.sql +++ b/src/main/resources/db/changelog/1-rbac/1058-rbac-generators.sql @@ -177,26 +177,35 @@ begin sql := format($sql$ create or replace view %1$s_rv as with accessible_%1$s_uuids as ( - - -- TODO.perf: this CTE query makes RBAC-SELECT-permission-queries so slow (~500ms), any idea how to optimize? - -- My guess is, that the depth of role-grants causes the problem. - with recursive grants as ( - select descendantUuid, ascendantUuid, 1 as level - from RbacGrants - where assumed - and ascendantUuid = any (currentSubjectsuUids()) - union all - select g.descendantUuid, g.ascendantUuid, level + 1 as level - from RbacGrants g - inner join grants on grants.descendantUuid = g.ascendantUuid - where g.assumed and level<10 - ) - select distinct perm.objectUuid as objectUuid - from grants - join RbacPermission perm on grants.descendantUuid = perm.uuid - join RbacObject obj on obj.uuid = perm.objectUuid - where obj.objectTable = '%1$s' -- 'SELECT' permission is included in all other permissions - limit 8001 + with recursive + recursive_grants as + (select distinct rbacgrants.descendantuuid, + rbacgrants.ascendantuuid, + 1 as level, + true + from rbacgrants + where rbacgrants.assumed + and (rbacgrants.ascendantuuid = any (currentsubjectsuuids())) + union all + select distinct g.descendantuuid, + g.ascendantuuid, + grants.level + 1 as level, + assertTrue(grants.level < 22, 'too many grant-levels: ' || grants.level) + from rbacgrants g + join recursive_grants grants on grants.descendantuuid = g.ascendantuuid + where g.assumed), + grant_count AS ( + SELECT COUNT(*) AS grant_count FROM recursive_grants + ), + count_check as (select assertTrue((select count(*) as grant_count from recursive_grants) < 400000, + 'too many grants for current subjects: ' || (select count(*) as grant_count from recursive_grants)) + as valid) + select distinct perm.objectuuid + from recursive_grants + join rbacpermission perm on recursive_grants.descendantuuid = perm.uuid + join rbacobject obj on obj.uuid = perm.objectuuid + join count_check cc on cc.valid + where obj.objectTable = '%1$s' -- 'SELECT' permission is included in all other permissions ) select target.* from %1$s as target diff --git a/src/main/resources/db/changelog/6-hs-booking/620-booking-project/6203-hs-booking-project-rbac.md b/src/main/resources/db/changelog/6-hs-booking/620-booking-project/6203-hs-booking-project-rbac.md index 270908a8..7fb81cd7 100644 --- a/src/main/resources/db/changelog/6-hs-booking/620-booking-project/6203-hs-booking-project-rbac.md +++ b/src/main/resources/db/changelog/6-hs-booking/620-booking-project/6203-hs-booking-project-rbac.md @@ -48,7 +48,7 @@ role:global:ADMIN -.-> role:debitorRel:OWNER role:debitorRel:OWNER -.-> role:debitorRel:ADMIN role:debitorRel:ADMIN -.-> role:debitorRel:AGENT role:debitorRel:AGENT -.-> role:debitorRel:TENANT -role:debitorRel:AGENT ==> role:project:OWNER +role:debitorRel:AGENT ==>|XX| role:project:OWNER role:project:OWNER ==> role:project:ADMIN role:project:ADMIN ==> role:project:AGENT role:project:AGENT ==> role:project:TENANT diff --git a/src/main/resources/db/changelog/6-hs-booking/620-booking-project/6203-hs-booking-project-rbac.sql b/src/main/resources/db/changelog/6-hs-booking/620-booking-project/6203-hs-booking-project-rbac.sql index e0e0a9b7..c6f3544d 100644 --- a/src/main/resources/db/changelog/6-hs-booking/620-booking-project/6203-hs-booking-project-rbac.sql +++ b/src/main/resources/db/changelog/6-hs-booking/620-booking-project/6203-hs-booking-project-rbac.sql @@ -49,7 +49,7 @@ begin perform createRoleWithGrants( hsBookingProjectOWNER(NEW), - incomingSuperRoles => array[hsOfficeRelationAGENT(newDebitorRel)] + incomingSuperRoles => array[hsOfficeRelationAGENT(newDebitorRel, unassumed())] ); perform createRoleWithGrants( diff --git a/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.md b/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.md index 019bb0a2..926ff65d 100644 --- a/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.md +++ b/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.md @@ -30,6 +30,7 @@ subgraph asset["`**asset**`"] role:asset:ADMIN[[asset:ADMIN]] role:asset:AGENT[[asset:AGENT]] role:asset:TENANT[[asset:TENANT]] + role:asset:REFERRER[[asset:REFERRER]] end subgraph asset:permissions[ ] @@ -50,6 +51,7 @@ subgraph assignedToAsset["`**assignedToAsset**`"] style assignedToAsset:roles fill:#99bcdb,stroke:white role:assignedToAsset:TENANT[[assignedToAsset:TENANT]] + role:assignedToAsset:AGENT[[assignedToAsset:AGENT]] end end @@ -103,6 +105,8 @@ role:asset:AGENT ==> role:asset:TENANT role:asset:TENANT ==> role:bookingItem:TENANT role:asset:TENANT ==> role:parentAsset:TENANT role:alarmContact:ADMIN ==> role:asset:TENANT +role:asset:TENANT ==> role:asset:REFERRER +role:assignedToAsset:AGENT ==> role:asset:REFERRER %% granting permissions to roles role:global:ADMIN ==> perm:asset:INSERT @@ -110,6 +114,6 @@ role:parentAsset:ADMIN ==> perm:asset:INSERT role:global:GUEST ==> perm:asset:INSERT role:asset:OWNER ==> perm:asset:DELETE role:asset:ADMIN ==> perm:asset:UPDATE -role:asset:TENANT ==> perm:asset:SELECT +role:asset:REFERRER ==> perm:asset:SELECT ``` diff --git a/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.sql b/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.sql index 91afe2b6..987b3cc3 100644 --- a/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.sql +++ b/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.sql @@ -75,7 +75,6 @@ begin perform createRoleWithGrants( hsHostingAssetTENANT(NEW), - permissions => array['SELECT'], incomingSuperRoles => array[ hsHostingAssetAGENT(NEW), hsOfficeContactADMIN(newAlarmContact)], @@ -84,6 +83,14 @@ begin hsHostingAssetTENANT(newParentAsset)] ); + perform createRoleWithGrants( + hsHostingAssetREFERRER(NEW), + permissions => array['SELECT'], + incomingSuperRoles => array[ + hsHostingAssetAGENT(newAssignedToAsset), + hsHostingAssetTENANT(NEW)] + ); + IF NEW.type = 'DOMAIN_SETUP' THEN END IF; diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerAcceptanceTest.java index 71753976..b28e3e4e 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerAcceptanceTest.java @@ -287,7 +287,7 @@ class HsBookingItemControllerAcceptanceTest extends ContextBasedTestWithCleanup class PatchBookingItem { @Test - void globalAdmin_canPatchAllUpdatablePropertiesOfBookingItem() { + void projectAgent_canPatchAllUpdatablePropertiesOfBookingItem() { final var givenBookingItem = givenSomeNewBookingItem("D-1000111 default project", MANAGED_WEBSPACE, resource("HDD", 100), resource("SSD", 50), resource("Traffic", 250)); @@ -295,6 +295,7 @@ class HsBookingItemControllerAcceptanceTest extends ContextBasedTestWithCleanup RestAssured // @formatter:off .given() .header("current-user", "superuser-alex@hostsharing.net") + .header("assumed-roles", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT") .contentType(ContentType.JSON) .body(""" { diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java index d0d58cfc..a1b61159 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java @@ -182,7 +182,9 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup public void normalUser_canViewOnlyRelatedBookingItems() { // given: context("person-FirbySusan@example.com"); - final var projectUuid = debitorRepo.findDebitorByDebitorNumber(1000111).stream() + final var debitor = debitorRepo.findDebitorByDebitorNumber(1000111); + context("person-FirbySusan@example.com", "hs_booking_project#D-1000111-D-1000111defaultproject:OWNER"); + final var projectUuid = debitor.stream() .map(d -> projectRepo.findAllByDebitorUuid(d.getUuid())) .flatMap(List::stream) .findAny().orElseThrow().getUuid(); @@ -209,7 +211,7 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup // when final var result = jpaAttempt.transacted(() -> { - context("superuser-alex@hostsharing.net"); + context("superuser-alex@hostsharing.net", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); final var foundBookingItem = em.find(HsBookingItemEntity.class, givenBookingItemUuid); foundBookingItem.getResources().put("CPU", 2); foundBookingItem.getResources().remove("SSD-storage"); @@ -262,12 +264,12 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup @Test public void nonGlobalAdmin_canNotDeleteTheirRelatedBookingItem() { // given - context("superuser-alex@hostsharing.net", null); + context("superuser-alex@hostsharing.net", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); final var givenBookingItem = givenSomeTemporaryBookingItem("D-1000111 default project"); // when final var result = jpaAttempt.transacted(() -> { - context("person-FirbySusan@example.com"); + context("person-FirbySusan@example.com", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); assertThat(bookingItemRepo.findByUuid(givenBookingItem.getUuid())).isPresent(); bookingItemRepo.deleteByUuid(givenBookingItem.getUuid()); @@ -286,7 +288,7 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup @Test public void deletingABookingItemAlsoDeletesRelatedRolesAndGrants() { // given - context("superuser-alex@hostsharing.net"); + context("superuser-alex@hostsharing.net", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); final var initialRoleNames = Array.from(distinctRoleNamesOf(rawRoleRepo.findAll())); final var initialGrantNames = Array.from(distinctGrantDisplaysOf(rawGrantRepo.findAll())); final var givenBookingItem = givenSomeTemporaryBookingItem("D-1000111 default project"); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectControllerAcceptanceTest.java index 9a4c2391..94194b1f 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectControllerAcceptanceTest.java @@ -163,7 +163,7 @@ class HsBookingProjectControllerAcceptanceTest extends ContextBasedTestWithClean } @Test - void debitorAgentUser_canGetRelatedBookingProject() { + void projectAgentUser_canGetRelatedBookingProject() { context.define("superuser-alex@hostsharing.net"); final var givenBookingProjectUuid = bookingProjectRepo.findByCaption("D-1000313 default project").stream() .findAny().orElseThrow().getUuid(); @@ -171,6 +171,7 @@ class HsBookingProjectControllerAcceptanceTest extends ContextBasedTestWithClean RestAssured // @formatter:off .given() .header("current-user", "person-TuckerJack@example.com") + .header("assumed-roles", "hs_booking_project#D-1000313-D-1000313defaultproject:AGENT") .port(port) .when() .get("http://localhost/api/hs/booking/projects/" + givenBookingProjectUuid) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepositoryIntegrationTest.java index e73bf942..8e3b7168 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepositoryIntegrationTest.java @@ -125,7 +125,7 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea "{ grant perm:hs_booking_project#D-1000111-somenewbookingproject:INSERT>hs_booking_item to role:hs_booking_project#D-1000111-somenewbookingproject:ADMIN by system and assume }", // agent - "{ grant role:hs_booking_project#D-1000111-somenewbookingproject:OWNER to role:relation#FirstGmbH-with-DEBITOR-FirstGmbH:AGENT by system and assume }", + "{ grant role:hs_booking_project#D-1000111-somenewbookingproject:OWNER to role:relation#FirstGmbH-with-DEBITOR-FirstGmbH:AGENT by system }", "{ grant role:hs_booking_project#D-1000111-somenewbookingproject:TENANT to role:hs_booking_project#D-1000111-somenewbookingproject:AGENT by system and assume }", // tenant @@ -161,9 +161,10 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea } @Test - public void normalUser_canViewOnlyRelatedBookingProjects() { + public void packetAgent_canViewOnlyRelatedBookingProjects() { + // given: - context("person-FirbySusan@example.com"); + context("person-FirbySusan@example.com", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); final var debitorUuid = debitorRepo.findByDebitorNumber(1000111).stream() .findAny().orElseThrow().getUuid(); @@ -233,12 +234,11 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea @Test public void nonGlobalAdmin_canNotDeleteTheirRelatedBookingProject() { // given - context("superuser-alex@hostsharing.net", null); final var givenBookingProject = givenSomeTemporaryBookingProject(1000111); // when final var result = jpaAttempt.transacted(() -> { - context("person-FirbySusan@example.com"); + context("person-FirbySusan@example.com", "hs_booking_project#D-1000111-sometempproject:AGENT"); assertThat(bookingProjectRepo.findByUuid(givenBookingProject.getUuid())).isPresent(); bookingProjectRepo.deleteByUuid(givenBookingProject.getUuid()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java index 476b6bb0..d84c0815 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java @@ -413,7 +413,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup } @Test - void debitorAgentUser_canGetRelatedAsset() { + void projectAgentUser_canGetRelatedAsset() { context.define("superuser-alex@hostsharing.net"); final var givenAssetUuid = assetRepo.findByIdentifier("vm1013").stream() .filter(bi -> bi.getBookingItem().getProject().getCaption().equals("D-1000313 default project")) @@ -422,6 +422,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup RestAssured // @formatter:off .given() .header("current-user", "person-TuckerJack@example.com") + .header("assumed-roles", "hs_booking_project#D-1000313-D-1000313defaultproject:AGENT") .port(port) .when() .get("http://localhost/api/hs/hosting/assets/" + givenAssetUuid) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java index ae733e54..e5695746 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java @@ -98,7 +98,7 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu @Test public void createsAndGrantsRoles() { // given - context("superuser-alex@hostsharing.net"); + context("superuser-alex@hostsharing.net", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); final var givenManagedServer = givenHostingAsset("D-1000111 default project", MANAGED_SERVER); final var newWebspaceBookingItem = newBookingItem(givenManagedServer.getBookingItem(), HsBookingItemType.MANAGED_WEBSPACE, "fir01"); em.flush(); @@ -125,7 +125,8 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu "hs_hosting_asset#fir00:ADMIN", "hs_hosting_asset#fir00:AGENT", "hs_hosting_asset#fir00:OWNER", - "hs_hosting_asset#fir00:TENANT")); + "hs_hosting_asset#fir00:TENANT", + "hs_hosting_asset#fir00:REFERRER")); assertThat(distinctGrantDisplaysOf(rawGrantRepo.findAll())) .containsExactlyInAnyOrder(fromFormatted( initialGrantNames, @@ -152,7 +153,10 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu "{ grant role:hs_booking_item#fir01:TENANT to role:hs_hosting_asset#fir00:TENANT by system and assume }", "{ grant role:hs_hosting_asset#fir00:TENANT to role:hs_hosting_asset#fir00:AGENT by system and assume }", "{ grant role:hs_hosting_asset#vm1011:TENANT to role:hs_hosting_asset#fir00:TENANT by system and assume }", - "{ grant perm:hs_hosting_asset#fir00:SELECT to role:hs_hosting_asset#fir00:TENANT by system and assume }", // workaround + + // referrer + "{ grant perm:hs_hosting_asset#fir00:SELECT to role:hs_hosting_asset#fir00:REFERRER by system and assume }", + "{ grant role:hs_hosting_asset#fir00:REFERRER to role:hs_hosting_asset#fir00:TENANT by system and assume }", null)); } @@ -216,7 +220,7 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu @Test public void normalUser_canViewOnlyRelatedAsset() { // given: - context("person-FirbySusan@example.com"); + context("person-FirbySusan@example.com", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); final var projectUuid = projectRepo.findByCaption("D-1000111 default project").stream() .findAny().orElseThrow().getUuid(); @@ -310,12 +314,12 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu @Test public void relatedOwner_canDeleteTheirRelatedAsset() { // given - context("superuser-alex@hostsharing.net", null); + context("superuser-alex@hostsharing.net", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); final var givenAsset = givenSomeTemporaryAsset("D-1000111 default project", "vm1000"); // when final var result = jpaAttempt.transacted(() -> { - context("person-FirbySusan@example.com"); + context("person-FirbySusan@example.com", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); assertThat(assetRepo.findByUuid(givenAsset.getUuid())).isPresent(); assetRepo.deleteByUuid(givenAsset.getUuid()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java index 041424f4..f69ef8d0 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java @@ -34,6 +34,7 @@ import org.springframework.test.annotation.DirtiesContext; import java.io.Reader; import java.net.IDN; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -183,9 +184,9 @@ public class ImportHostingAssets extends ImportOfficeData { { 363=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.34), 381=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.52), + 401=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.72), 402=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.73), - 433=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.104), - 457=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.128) + 433=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.104) } """); } @@ -244,7 +245,7 @@ public class ImportHostingAssets extends ImportOfficeData { 10978=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2013-04-01,), BI vm1050), 11061=HsBookingItemEntity(D-1000300:mim default project, MANAGED_SERVER, [2013-08-19,), BI vm1068), 11094=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-10,), BI lug00), - 11112=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-17,), BI mim00), + 11111=HsBookingItemEntity(D-1000000:vm1068 Monitor, MANAGED_WEBSPACE, [2013-08-19,), BI xyz68), 23611=HsBookingItemEntity(D-1101800:wws default project, CLOUD_SERVER, [2022-08-10,), BI vm2097) } """); @@ -255,10 +256,10 @@ public class ImportHostingAssets extends ImportOfficeData { 10978=HsHostingAssetRealEntity(MANAGED_SERVER, vm1050, HA vm1050, D-1000000:hsh default project:BI vm1050), 11061=HsHostingAssetRealEntity(MANAGED_SERVER, vm1068, HA vm1068, D-1000300:mim default project:BI vm1068), 11094=HsHostingAssetRealEntity(MANAGED_WEBSPACE, lug00, HA lug00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI lug00), + 11111=HsHostingAssetRealEntity(MANAGED_WEBSPACE, xyz68, HA xyz68, MANAGED_SERVER:vm1068, D-1000000:vm1068 Monitor:BI xyz68), 11112=HsHostingAssetRealEntity(MANAGED_WEBSPACE, mim00, HA mim00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI mim00), 11447=HsHostingAssetRealEntity(MANAGED_SERVER, vm1093, HA vm1093, D-1000000:hsh default project:BI vm1093), - 19959=HsHostingAssetRealEntity(MANAGED_WEBSPACE, dph00, HA dph00, MANAGED_SERVER:vm1093, D-1101900:dph default project:BI dph00), - 23611=HsHostingAssetRealEntity(CLOUD_SERVER, vm2097, HA vm2097, D-1101800:wws default project:BI vm2097) + 19959=HsHostingAssetRealEntity(MANAGED_WEBSPACE, dph00, HA dph00, MANAGED_SERVER:vm1093, D-1101900:dph default project:BI dph00) } """); } @@ -287,8 +288,8 @@ public class ImportHostingAssets extends ImportOfficeData { 10978=HsHostingAssetRealEntity(MANAGED_SERVER, vm1050, HA vm1050, D-1000000:hsh default project:BI vm1050), 11061=HsHostingAssetRealEntity(MANAGED_SERVER, vm1068, HA vm1068, D-1000300:mim default project:BI vm1068), 11094=HsHostingAssetRealEntity(MANAGED_WEBSPACE, lug00, HA lug00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI lug00), - 11112=HsHostingAssetRealEntity(MANAGED_WEBSPACE, mim00, HA mim00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI mim00), - 11447=HsHostingAssetRealEntity(MANAGED_SERVER, vm1093, HA vm1093, D-1000000:hsh default project:BI vm1093) + 11111=HsHostingAssetRealEntity(MANAGED_WEBSPACE, xyz68, HA xyz68, MANAGED_SERVER:vm1068, D-1000000:vm1068 Monitor:BI xyz68), + 11112=HsHostingAssetRealEntity(MANAGED_WEBSPACE, mim00, HA mim00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI mim00) } """); assertThat(firstOfEachType( @@ -303,6 +304,7 @@ public class ImportHostingAssets extends ImportOfficeData { 10978=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2013-04-01,), BI vm1050, {"CPU": 4, "HDD": 250, "RAM": 32, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 150, "Traffic": 250}), 11061=HsBookingItemEntity(D-1000300:mim default project, MANAGED_SERVER, [2013-08-19,), BI vm1068, {"CPU": 2, "HDD": 250, "RAM": 4, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT2H", "SLA-Web": true, "Traffic": 250}), 11094=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-10,), BI lug00, {"Multi": 5, "SLA-Platform": "EXT24H", "SSD": 1, "Traffic": 10}), + 11111=HsBookingItemEntity(D-1000000:vm1068 Monitor, MANAGED_WEBSPACE, [2013-08-19,), BI xyz68, {"SSD": 3}), 11112=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-17,), BI mim00, {"Multi": 5, "SLA-Platform": "EXT24H", "SSD": 3, "Traffic": 20}), 11447=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2014-11-28,), BI vm1093, {"CPU": 6, "HDD": 500, "RAM": 16, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 300, "Traffic": 250}), 19959=HsBookingItemEntity(D-1101900:dph default project, MANAGED_WEBSPACE, [2021-06-02,), BI dph00, {"Multi": 1, "SLA-Platform": "EXT24H", "SSD": 25, "Traffic": 20}), @@ -335,6 +337,7 @@ public class ImportHostingAssets extends ImportOfficeData { 5811=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102094}), 5813=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102095}), 5835=HsHostingAssetRealEntity(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "shell": "/usr/bin/passwd", "userid": 102106}), + 5961=HsHostingAssetRealEntity(UNIX_USER, xyz68, Monitoring h68, MANAGED_WEBSPACE:xyz68, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102141}), 5964=HsHostingAssetRealEntity(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102147}), 5966=HsHostingAssetRealEntity(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "shell": "/bin/bash", "userid": 102148}), 5990=HsHostingAssetRealEntity(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102160}), @@ -880,6 +883,7 @@ public class ImportHostingAssets extends ImportOfficeData { 5811=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102094}), 5813=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102095}), 5835=HsHostingAssetRealEntity(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102106}), + 5961=HsHostingAssetRealEntity(UNIX_USER, xyz68, Monitoring h68, MANAGED_WEBSPACE:xyz68, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102141}), 5964=HsHostingAssetRealEntity(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102147}), 5966=HsHostingAssetRealEntity(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102148}), 5990=HsHostingAssetRealEntity(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102160}), @@ -909,8 +913,8 @@ public class ImportHostingAssets extends ImportOfficeData { verifyActuallyPersistedHostingAssetCount(CLOUD_SERVER, 1, 50); verifyActuallyPersistedHostingAssetCount(MANAGED_SERVER, 4, 100); - verifyActuallyPersistedHostingAssetCount(MANAGED_WEBSPACE, 4, 100); - verifyActuallyPersistedHostingAssetCount(UNIX_USER, 14, 100); + verifyActuallyPersistedHostingAssetCount(MANAGED_WEBSPACE, 5, 100); + verifyActuallyPersistedHostingAssetCount(UNIX_USER, 15, 100); verifyActuallyPersistedHostingAssetCount(EMAIL_ALIAS, 9, 1400); verifyActuallyPersistedHostingAssetCount(PGSQL_DATABASE, 8, 100); verifyActuallyPersistedHostingAssetCount(MARIADB_DATABASE, 8, 100); @@ -918,6 +922,25 @@ public class ImportHostingAssets extends ImportOfficeData { verifyActuallyPersistedHostingAssetCount(EMAIL_ADDRESS, 71, 30000); } + @Test + @Order(19930) + void verifyProjectAgentsCanViewEmailAddresses() { + assumeThatWeAreImportingControlledTestData(); + + final var haCount = jpaAttempt.transacted(() -> { + context(rbacSuperuser); + // final var roles = em.createNativeQuery("select * from rbacrole_ev where roleidname like 'hs_office_relation%with-DEBITOR%'").getResultList(); + final var roles = em.createNativeQuery("select * from rbacrole_ev where roleidname like 'hs_booking_project#D-10003%'").getResultList(); + //context(rbacSuperuser, "hs_booking_project#D-1000300-mimdefaultproject:ADMIN"); + context(rbacSuperuser, "hs_booking_project#D-1000300-mimdefaultproject:AGENT"); + final var result = em.createNativeQuery("select * from hs_hosting_asset where type='EMAIL_ADDRESS'") + .getResultList(); + return (Integer) em.createNativeQuery("select count(*) from hs_hosting_asset where type='EMAIL_ADDRESS'", Integer.class) + .getSingleResult(); + }).assertSuccessful().returnedValue(); + assertThat(haCount).isEqualTo(71); + } + // ============================================================================================ @Test @@ -1095,7 +1118,20 @@ public class ImportHostingAssets extends ImportOfficeData { final var managedWebspace = pac(packet_id); final var parentAsset = hive(hive_id).serverRef.get(); managedWebspace.setParentAsset(parentAsset); - managedWebspace.getBookingItem().setParentItem(parentAsset.getBookingItem()); + + if (parentAsset.getRelatedProject() != managedWebspace.getRelatedProject() + && managedWebspace.getRelatedProject().getDebitor().getDebitorNumber() == 10000_00 ) { + assertThat(managedWebspace.getIdentifier()).startsWith("xyz"); + final var hshDebitor = managedWebspace.getBookingItem().getProject().getDebitor(); + final var newProject = HsBookingProjectEntity.builder() + .debitor(hshDebitor) + .caption(parentAsset.getIdentifier() + " Monitor") + .build(); + bookingProjects.put(Collections.max(bookingProjects.keySet())+1, newProject); + managedWebspace.getBookingItem().setProject(newProject); + } else { + managedWebspace.getBookingItem().setParentItem(parentAsset.getBookingItem()); + } } }); } diff --git a/src/test/resources/migration/hosting/inet_addr.csv b/src/test/resources/migration/hosting/inet_addr.csv index 15bab1fb..bee797c4 100644 --- a/src/test/resources/migration/hosting/inet_addr.csv +++ b/src/test/resources/migration/hosting/inet_addr.csv @@ -1,6 +1,7 @@ inet_addr_id;inet_addr;description 363;83.223.95.34; 381;83.223.95.52; +401;83.223.95.72; 402;83.223.95.73; 433;83.223.95.104; 457;83.223.95.128; diff --git a/src/test/resources/migration/hosting/packet.csv b/src/test/resources/migration/hosting/packet.csv index 63637444..6e27b41b 100644 --- a/src/test/resources/migration/hosting/packet.csv +++ b/src/test/resources/migration/hosting/packet.csv @@ -4,6 +4,7 @@ packet_id;basepacket_code;packet_name;bp_id;hive_id;created;cancelled;cur_inet_a 10978;SRV/MGD;vm1050;213;1014;2013-04-01;;433;;1 11061;SRV/MGD;vm1068;100;1037;2013-08-19;;381;;f 11094;PAC/WEB;lug00;100;1037;2013-09-10;;1168;;1 +11111;PAC/WEB;xyz68;213;1037;2013-08-19;;401;;1 11112;PAC/WEB;mim00;100;1037;2013-09-17;;402;;1 11447;SRV/MGD;vm1093;213;1163;2014-11-28;;457;;t 19959;PAC/WEB;dph00;542;1163;2021-06-02;;574;;0 diff --git a/src/test/resources/migration/hosting/packet_component.csv b/src/test/resources/migration/hosting/packet_component.csv index ce35034f..5dee11ad 100644 --- a/src/test/resources/migration/hosting/packet_component.csv +++ b/src/test/resources/migration/hosting/packet_component.csv @@ -7,6 +7,7 @@ packet_component_id;packet_id;quantity;basecomponent_code;created;cancelled 46121;11112;20;TRAFFIC;2017-03-27; 46122;11112;5;MULTI;2017-03-27; 46123;11112;3072;QUOTA;2017-03-27; +46124;11111;3072;QUOTA;2017-03-27; 143133;11094;1;SLABASIC;2017-09-01; 143483;11112;1;SLABASIC;2017-09-01; 757383;11112;0;SLAEXT24H;; diff --git a/src/test/resources/migration/hosting/unixuser.csv b/src/test/resources/migration/hosting/unixuser.csv index cd044e0a..739899d2 100644 --- a/src/test/resources/migration/hosting/unixuser.csv +++ b/src/test/resources/migration/hosting/unixuser.csv @@ -9,6 +9,7 @@ unixuser_id;name;comment;shell;homedir;locked;packet_id;userid;quota_softlimit;q 5835;lug00-test;Test;/usr/bin/passwd;/home/pacs/lug00/users/test;0;11094;102106;2000000;4000000;20;0 6705;hsh00-mim;Michael Mellis;/bin/false;/home/pacs/hsh00/users/mi;0;10630;10003;0;0;0;0 +5961;xyz68;Monitoring h68;/bin/bash;/home/pacs/xyz68;0;11111;102141;0;0;0;0 5964;mim00;Michael Mellis;/bin/bash;/home/pacs/mim00;0;11112;102147;0;0;0;0 5966;mim00-1981;Jahrgangstreffen 1981;/bin/bash;/home/pacs/mim00/users/1981;0;11112;102148;128;256;0;0 5990;mim00-mail;Mailbox;/bin/bash;/home/pacs/mim00/users/mail;0;11112;102160;0;0;0;0 -- 2.39.5 From e9b6ca3d9c1b8af5c7eac180ee4954e544ff68f8 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Wed, 14 Aug 2024 12:30:46 +0200 Subject: [PATCH 02/14] make EMail-Addresses visible to webspace agent by granting asset:AGENT to assignedToAsset:AGENT --- ...e-cte-experiments-for-accessible-uuids.sql | 38 +++++++---------- .../hosting/asset/HsHostingAssetEntity.java | 4 +- .../hs/hosting/asset/HsHostingAssetType.java | 2 +- .../rbacgrant/RbacGrantsDiagramService.java | 2 +- .../7013-hs-hosting-asset-rbac.md | 8 ++-- .../7013-hs-hosting-asset-rbac.sql | 13 ++---- .../7018-hs-hosting-asset-test-data.sql | 7 +++- ...sHostingAssetControllerAcceptanceTest.java | 4 +- ...HostingAssetRepositoryIntegrationTest.java | 42 +++++++++++++++---- .../hs/migration/ImportHostingAssets.java | 10 +---- 10 files changed, 69 insertions(+), 61 deletions(-) diff --git a/sql/recursive-cte-experiments-for-accessible-uuids.sql b/sql/recursive-cte-experiments-for-accessible-uuids.sql index ae6f27dc..f8795961 100644 --- a/sql/recursive-cte-experiments-for-accessible-uuids.sql +++ b/sql/recursive-cte-experiments-for-accessible-uuids.sql @@ -123,26 +123,20 @@ select from one_path; commit transaction; - - - -select * from -( - select uuid, roleidname as name from rbacrole_ev - union all - select uuid, p.optablename || ':' || p.objectuuid || ':' || p.op as name from rbacpermission p -) united - where uuid in ( - '4157915c-a09b-490c-9430-00005fcfbb4f', - '046f2da0-66d5-4e6a-af17-d41fba617b30', - '6239ca11-5224-401d-9780-1af7f5cbf35a', - '70004958-39c7-4d32-8ba6-d78145f3ad32', - '7065fbc1-c605-4da3-97dd-f40fe1b90b4c', - 'd551551b-b1dd-414a-a0ed-a07712f15e62', - 'f1f0fc3e-020a-48fe-b9c1-ac495cc21fdf', - '63ad71f3-214c-411e-8b0b-a859e54af770', - '561bbe75-b8f2-4e4b-86ac-02a72ab9a6e8', - '379e99b3-b53f-421d-a53e-2e81c464fbf2', - '5cb1ecb2-7962-47e0-b8bf-67974da45208' - ); +with grants as ( + select uuid + from rbacgrants + where descendantuuid in ( + select uuid + from rbacrole + where objectuuid in ( + select uuid + from hs_hosting_asset + -- where type = 'DOMAIN_MBOX_SETUP' + -- and identifier = 'example.org|MBOX' + where type = 'EMAIL_ADDRESS' + and identifier='test@example.org' + )) +) +select * from rbacgrants_ev gev where exists ( select uuid from grants where gev.uuid = grants.uuid ); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java index 0b28197c..2ae4ae70 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java @@ -185,6 +185,7 @@ public class HsHostingAssetEntity implements HsHostingAsset { with.permission(UPDATE); }) .createSubRole(AGENT, (with) -> { + with.incomingSuperRole("assignedToAsset", AGENT); // TODO.spec: or ADMIN? with.outgoingSubRole("assignedToAsset", TENANT); with.outgoingSubRole("alarmContact", REFERRER); }) @@ -192,9 +193,6 @@ public class HsHostingAssetEntity implements HsHostingAsset { with.outgoingSubRole("bookingItem", TENANT); with.outgoingSubRole("parentAsset", TENANT); with.incomingSuperRole("alarmContact", ADMIN); - }) - .createSubRole(REFERRER, (with) -> { - with.incomingSuperRole("assignedToAsset", AGENT); with.permission(SELECT); }) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java index f08248c4..e11b1430 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java @@ -264,7 +264,7 @@ public enum HsHostingAssetType implements Node { package Booking #feb28c { %{bookingNodes} } - + package Hosting #feb28c{ %{hostingGroups} } diff --git a/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantsDiagramService.java b/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantsDiagramService.java index fd33f358..f1369067 100644 --- a/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantsDiagramService.java +++ b/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantsDiagramService.java @@ -215,7 +215,7 @@ public class RbacGrantsDiagramService { @NotNull private static String cleanId(final String idName) { return idName.replaceAll("@.*", "") - .replace("[", "").replace("]", "").replace("(", "").replace(")", "").replace(",", "").replace(">", ":"); + .replace("[", "").replace("]", "").replace("(", "").replace(")", "").replace(",", "").replace(">", ":").replace("|", "_"); } diff --git a/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.md b/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.md index 926ff65d..d06f9f9a 100644 --- a/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.md +++ b/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.md @@ -30,7 +30,6 @@ subgraph asset["`**asset**`"] role:asset:ADMIN[[asset:ADMIN]] role:asset:AGENT[[asset:AGENT]] role:asset:TENANT[[asset:TENANT]] - role:asset:REFERRER[[asset:REFERRER]] end subgraph asset:permissions[ ] @@ -50,8 +49,8 @@ subgraph assignedToAsset["`**assignedToAsset**`"] subgraph assignedToAsset:roles[ ] style assignedToAsset:roles fill:#99bcdb,stroke:white - role:assignedToAsset:TENANT[[assignedToAsset:TENANT]] role:assignedToAsset:AGENT[[assignedToAsset:AGENT]] + role:assignedToAsset:TENANT[[assignedToAsset:TENANT]] end end @@ -99,14 +98,13 @@ role:asset:OWNER ==> role:asset:ADMIN role:bookingItem:AGENT ==> role:asset:ADMIN role:parentAsset:AGENT ==> role:asset:ADMIN role:asset:ADMIN ==> role:asset:AGENT +role:assignedToAsset:AGENT ==> role:asset:AGENT role:asset:AGENT ==> role:assignedToAsset:TENANT role:asset:AGENT ==> role:alarmContact:REFERRER role:asset:AGENT ==> role:asset:TENANT role:asset:TENANT ==> role:bookingItem:TENANT role:asset:TENANT ==> role:parentAsset:TENANT role:alarmContact:ADMIN ==> role:asset:TENANT -role:asset:TENANT ==> role:asset:REFERRER -role:assignedToAsset:AGENT ==> role:asset:REFERRER %% granting permissions to roles role:global:ADMIN ==> perm:asset:INSERT @@ -114,6 +112,6 @@ role:parentAsset:ADMIN ==> perm:asset:INSERT role:global:GUEST ==> perm:asset:INSERT role:asset:OWNER ==> perm:asset:DELETE role:asset:ADMIN ==> perm:asset:UPDATE -role:asset:REFERRER ==> perm:asset:SELECT +role:asset:TENANT ==> perm:asset:SELECT ``` diff --git a/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.sql b/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.sql index 987b3cc3..5ec3e044 100644 --- a/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.sql +++ b/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7013-hs-hosting-asset-rbac.sql @@ -67,7 +67,9 @@ begin perform createRoleWithGrants( hsHostingAssetAGENT(NEW), - incomingSuperRoles => array[hsHostingAssetADMIN(NEW)], + incomingSuperRoles => array[ + hsHostingAssetADMIN(NEW), + hsHostingAssetAGENT(newAssignedToAsset)], outgoingSubRoles => array[ hsHostingAssetTENANT(newAssignedToAsset), hsOfficeContactREFERRER(newAlarmContact)] @@ -75,6 +77,7 @@ begin perform createRoleWithGrants( hsHostingAssetTENANT(NEW), + permissions => array['SELECT'], incomingSuperRoles => array[ hsHostingAssetAGENT(NEW), hsOfficeContactADMIN(newAlarmContact)], @@ -83,14 +86,6 @@ begin hsHostingAssetTENANT(newParentAsset)] ); - perform createRoleWithGrants( - hsHostingAssetREFERRER(NEW), - permissions => array['SELECT'], - incomingSuperRoles => array[ - hsHostingAssetAGENT(newAssignedToAsset), - hsHostingAssetTENANT(NEW)] - ); - IF NEW.type = 'DOMAIN_SETUP' THEN END IF; diff --git a/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7018-hs-hosting-asset-test-data.sql b/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7018-hs-hosting-asset-test-data.sql index 9e8f3317..a74b6126 100644 --- a/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7018-hs-hosting-asset-test-data.sql +++ b/src/main/resources/db/changelog/7-hs-hosting/701-hosting-asset/7018-hs-hosting-asset-test-data.sql @@ -23,6 +23,7 @@ declare managedServerUuid uuid; managedWebspaceUuid uuid; webUnixUserUuid uuid; + mboxUnixUserUuid uuid; domainSetupUuid uuid; domainMBoxSetupUuid uuid; mariaDbInstanceUuid uuid; @@ -71,6 +72,7 @@ begin select uuid_generate_v4() into managedServerUuid; select uuid_generate_v4() into managedWebspaceUuid; select uuid_generate_v4() into webUnixUserUuid; + select uuid_generate_v4() into mboxUnixUserUuid; select uuid_generate_v4() into domainSetupUuid; select uuid_generate_v4() into domainMBoxSetupUuid; select uuid_generate_v4() into mariaDbInstanceUuid; @@ -94,11 +96,12 @@ begin (uuid_generate_v4(), null, 'PGSQL_DATABASE', pgSqlUserUuid, pgSqlInstanceUuid, defaultPrefix || '01_web', 'some default Postgresql database','{ "encryption": "utf8", "collation": "utf8"}'::jsonb ), (uuid_generate_v4(), null, 'EMAIL_ALIAS', managedWebspaceUuid, null, defaultPrefix || '01-web', 'some E-Mail-Alias', '{ "target": [ "office@example.org", "archive@example.com" ] }'::jsonb), (webUnixUserUuid, null, 'UNIX_USER', managedWebspaceUuid, null, defaultPrefix || '01-web', 'some UnixUser for Website', '{ "SSD-soft-quota": "128", "SSD-hard-quota": "256", "HDD-soft-quota": "512", "HDD-hard-quota": "1024"}'::jsonb), + (mboxUnixUserUuid, null, 'UNIX_USER', managedWebspaceUuid, null, defaultPrefix || '01-mbox', 'some UnixUser for E-Mail', '{ "SSD-soft-quota": "128", "SSD-hard-quota": "256", "HDD-soft-quota": "512", "HDD-hard-quota": "1024"}'::jsonb), (domainSetupUuid, null, 'DOMAIN_SETUP', null, null, defaultPrefix || '.example.org', 'some Domain-Setup', '{}'::jsonb), (uuid_generate_v4(), null, 'DOMAIN_DNS_SETUP', domainSetupUuid, null, defaultPrefix || '.example.org|DNS', 'some Domain-DNS-Setup', '{}'::jsonb), (uuid_generate_v4(), null, 'DOMAIN_HTTP_SETUP', domainSetupUuid, webUnixUserUuid, defaultPrefix || '.example.org|HTTP', 'some Domain-HTTP-Setup', '{ "option-htdocsfallback": true, "use-fcgiphpbin": "/usr/lib/cgi-bin/php", "validsubdomainnames": "*"}'::jsonb), - (uuid_generate_v4(), null, 'DOMAIN_SMTP_SETUP', domainSetupUuid, managedWebspaceUuid, defaultPrefix || '.example.org|DNS', 'some Domain-SMPT-Setup', '{}'::jsonb), - (domainMBoxSetupUuid, null, 'DOMAIN_MBOX_SETUP', domainSetupUuid, managedWebspaceUuid, defaultPrefix || '.example.org|DNS', 'some Domain-MBOX-Setup', '{}'::jsonb), + (uuid_generate_v4(), null, 'DOMAIN_SMTP_SETUP', domainSetupUuid, managedWebspaceUuid, defaultPrefix || '.example.org|SMTP', 'some Domain-SMTP-Setup', '{}'::jsonb), + (domainMBoxSetupUuid, null, 'DOMAIN_MBOX_SETUP', domainSetupUuid, managedWebspaceUuid, defaultPrefix || '.example.org|MBOX', 'some Domain-MBOX-Setup', '{}'::jsonb), (uuid_generate_v4(), null, 'EMAIL_ADDRESS', domainMBoxSetupUuid, null, 'test@' || defaultPrefix || '.example.org', 'some E-Mail-Address', '{}'::jsonb); end; $$; --// diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java index d84c0815..0fcb35b4 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java @@ -324,10 +324,12 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup assertThat(givenHostingAsset.getBookingItem().getResources().get("Multi")) .as("precondition failed") .isEqualTo(1); + final var preExistingUnixUserCount = assetRepo.findAllByCriteria(null, givenHostingAsset.getUuid(), UNIX_USER).size(); + final var UNIX_USER_PER_MULTI_OPTION = 25; jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net"); - for (int n = 0; n < 25; ++n) { + for (int n = 0; n < UNIX_USER_PER_MULTI_OPTION -preExistingUnixUserCount+1; ++n) { toCleanup(assetRepo.save( HsHostingAssetEntity.builder() .type(UNIX_USER) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java index e5695746..a2c96772 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java @@ -6,6 +6,7 @@ import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRepository; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRepository; import net.hostsharing.hsadminng.rbac.rbacgrant.RawRbacGrantRepository; +import net.hostsharing.hsadminng.rbac.rbacgrant.RbacGrantsDiagramService; import net.hostsharing.hsadminng.rbac.rbacrole.RawRbacRoleRepository; import net.hostsharing.hsadminng.mapper.Array; import net.hostsharing.hsadminng.rbac.test.ContextBasedTestWithCleanup; @@ -28,6 +29,7 @@ import java.util.Map; import static java.util.Map.entry; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.CLOUD_SERVER; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_SETUP; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.EMAIL_ADDRESS; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_SERVER; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_WEBSPACE; import static net.hostsharing.hsadminng.rbac.rbacgrant.RawRbacGrantEntity.distinctGrantDisplaysOf; @@ -125,8 +127,7 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu "hs_hosting_asset#fir00:ADMIN", "hs_hosting_asset#fir00:AGENT", "hs_hosting_asset#fir00:OWNER", - "hs_hosting_asset#fir00:TENANT", - "hs_hosting_asset#fir00:REFERRER")); + "hs_hosting_asset#fir00:TENANT")); assertThat(distinctGrantDisplaysOf(rawGrantRepo.findAll())) .containsExactlyInAnyOrder(fromFormatted( initialGrantNames, @@ -153,10 +154,7 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu "{ grant role:hs_booking_item#fir01:TENANT to role:hs_hosting_asset#fir00:TENANT by system and assume }", "{ grant role:hs_hosting_asset#fir00:TENANT to role:hs_hosting_asset#fir00:AGENT by system and assume }", "{ grant role:hs_hosting_asset#vm1011:TENANT to role:hs_hosting_asset#fir00:TENANT by system and assume }", - - // referrer - "{ grant perm:hs_hosting_asset#fir00:SELECT to role:hs_hosting_asset#fir00:REFERRER by system and assume }", - "{ grant role:hs_hosting_asset#fir00:REFERRER to role:hs_hosting_asset#fir00:TENANT by system and assume }", + "{ grant perm:hs_hosting_asset#fir00:SELECT to role:hs_hosting_asset#fir00:TENANT by system and assume }", null)); } @@ -199,7 +197,7 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu } @Nested - class FindByDebitorUuid { + class FindAssets { @Test public void globalAdmin_withoutAssumedRole_canViewArbitraryAssetsOfAllDebitors() { @@ -218,7 +216,7 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu } @Test - public void normalUser_canViewOnlyRelatedAsset() { + public void normalUser_canViewOnlyRelatedAssets() { // given: context("person-FirbySusan@example.com", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); final var projectUuid = projectRepo.findByCaption("D-1000111 default project").stream() @@ -235,7 +233,7 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu } @Test - public void normalUser_canFilterAssetsRelatedToParentAsset() { + public void managedServerAgent_canFindAssetsRelatedToManagedServer() { // given context("superuser-alex@hostsharing.net"); final var parentAssetUuid = assetRepo.findByIdentifier("vm1012").stream() @@ -253,6 +251,32 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu "HsHostingAssetEntity(MARIADB_INSTANCE, vm1012.MariaDB.default, some default MariaDB instance, MANAGED_SERVER:vm1012)", "HsHostingAssetEntity(PGSQL_INSTANCE, vm1012.Postgresql.default, some default Postgresql instance, MANAGED_SERVER:vm1012)"); } + + @Test + public void managedServerAgent_canFindRelatedEmailAddresses() { + // given + context("superuser-alex@hostsharing.net"); + // FIXME: remove +// final var parentAssetUuid = assetRepo.findByIdentifier("vm1012").stream() +// .filter(ha -> ha.getType() == MANAGED_SERVER) +// .findAny().orElseThrow().getUuid(); + + // when +// context("superuser-alex@hostsharing.net", "hs_hosting_asset#vm1012:AGENT"); + context("superuser-alex@hostsharing.net", "hs_hosting_asset#sec01:AGENT"); + // FIXME: cleanup +// context("superuser-alex@hostsharing.net", "hs_hosting_asset#sec.example.org|MBOX:AGENT"); +// context("superuser-alex@hostsharing.net", "hs_booking_project#D-1000212-D-1000212defaultproject:AGENT"); + + generateRbacDiagramForCurrentSubjects(RbacGrantsDiagramService.Include.ALL_NON_TEST_ENTITY_RELATED, "should-contain-email-addresses"); + + final var result = assetRepo.findAllByCriteria(null, null, EMAIL_ADDRESS); + + // then + exactlyTheseAssetsAreReturned( + result, + "HsHostingAssetEntity(EMAIL_ADDRESS, test@sec.example.org, some E-Mail-Address, DOMAIN_MBOX_SETUP:sec.example.org|MBOX)"); + } } @Nested diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java index f69ef8d0..0b96a8a9 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java @@ -928,17 +928,11 @@ public class ImportHostingAssets extends ImportOfficeData { assumeThatWeAreImportingControlledTestData(); final var haCount = jpaAttempt.transacted(() -> { - context(rbacSuperuser); - // final var roles = em.createNativeQuery("select * from rbacrole_ev where roleidname like 'hs_office_relation%with-DEBITOR%'").getResultList(); - final var roles = em.createNativeQuery("select * from rbacrole_ev where roleidname like 'hs_booking_project#D-10003%'").getResultList(); - //context(rbacSuperuser, "hs_booking_project#D-1000300-mimdefaultproject:ADMIN"); context(rbacSuperuser, "hs_booking_project#D-1000300-mimdefaultproject:AGENT"); - final var result = em.createNativeQuery("select * from hs_hosting_asset where type='EMAIL_ADDRESS'") - .getResultList(); - return (Integer) em.createNativeQuery("select count(*) from hs_hosting_asset where type='EMAIL_ADDRESS'", Integer.class) + return (Integer) em.createNativeQuery("select count(*) from hs_hosting_asset_rv where type='EMAIL_ADDRESS'", Integer.class) .getSingleResult(); }).assertSuccessful().returnedValue(); - assertThat(haCount).isEqualTo(71); + assertThat(haCount).isEqualTo(68); } // ============================================================================================ -- 2.39.5 From 2e6817398ea6cfed2ac029032f9fd3cab5414641 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Wed, 14 Aug 2024 14:17:08 +0200 Subject: [PATCH 03/14] more sensible order-parts of booking item toString --- .../hs/booking/item/HsBookingItemEntity.java | 4 +-- .../item/HsBookingItemEntityUnitTest.java | 2 +- ...sBookingItemRepositoryIntegrationTest.java | 12 +++---- .../hs/migration/ImportHostingAssets.java | 34 +++++++++---------- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java index 58a5d4b8..81c87e03 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java @@ -74,10 +74,10 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; public class HsBookingItemEntity implements Stringifyable, BaseEntity, PropertiesProvider { private static Stringify stringify = stringify(HsBookingItemEntity.class) - .withProp(HsBookingItemEntity::getProject) .withProp(HsBookingItemEntity::getType) - .withProp(e -> e.getValidity().asString()) .withProp(HsBookingItemEntity::getCaption) + .withProp(HsBookingItemEntity::getProject) + .withProp(e -> e.getValidity().asString()) .withProp(HsBookingItemEntity::getResources) .quotedValues(false); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityUnitTest.java index 627eabc2..23e0307f 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityUnitTest.java @@ -53,7 +53,7 @@ class HsBookingItemEntityUnitTest { void toStringContainsAllPropertiesAndResourcesSortedByKey() { final var result = givenBookingItem.toString(); - assertThat(result).isEqualToIgnoringWhitespace("HsBookingItemEntity(D-1234500:test project, CLOUD_SERVER, [2020-01-01,2031-01-01), some caption, { \"CPU\": 2, \"HDD-storage\": 2048, \"SSD-storage\": 512 })"); + assertThat(result).isEqualToIgnoringWhitespace("HsBookingItemEntity(CLOUD_SERVER, some caption, D-1234500:test project, [2020-01-01,2031-01-01), { \"CPU\": 2, \"HDD-storage\": 2048, \"SSD-storage\": 512 })"); } @Test diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java index a1b61159..9c1c04d0 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java @@ -170,9 +170,9 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup // then allTheseBookingItemsAreReturned( result, - "HsBookingItemEntity(D-1000212:D-1000212 default project, MANAGED_WEBSPACE, [2022-10-01,), separate ManagedWebspace, { Daemons: 0, Multi: 1, SSD: 100, Traffic: 50 })", - "HsBookingItemEntity(D-1000212:D-1000212 default project, MANAGED_SERVER, [2022-10-01,), separate ManagedServer, { CPU: 2, RAM: 8, SSD: 500, Traffic: 500 })", - "HsBookingItemEntity(D-1000212:D-1000212 default project, PRIVATE_CLOUD, [2024-04-01,), some PrivateCloud, { CPU: 10, HDD: 10000, RAM: 32, SSD: 4000, Traffic: 2000 })"); + "HsBookingItemEntity(MANAGED_SERVER, separate ManagedServer, D-1000212:D-1000212 default project, [2022-10-01,), { CPU: 2, RAM: 8, SSD: 500, Traffic: 500 })", + "HsBookingItemEntity(MANAGED_WEBSPACE, separate ManagedWebspace, D-1000212:D-1000212 default project, [2022-10-01,), { Daemons: 0, Multi: 1, SSD: 100, Traffic: 50 })", + "HsBookingItemEntity(PRIVATE_CLOUD, some PrivateCloud, D-1000212:D-1000212 default project, [2024-04-01,), { CPU: 10, HDD: 10000, RAM: 32, SSD: 4000, Traffic: 2000 })"); assertThat(result.stream().filter(bi -> bi.getRelatedHostingAsset()!=null).findAny()) .as("at least one relatedProject expected, but none found => fetching relatedProject does not work") .isNotEmpty(); @@ -195,9 +195,9 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup // then: exactlyTheseBookingItemsAreReturned( result, - "HsBookingItemEntity(D-1000111:D-1000111 default project, MANAGED_WEBSPACE, [2022-10-01,), separate ManagedWebspace, { Daemons : 0, Multi : 1, SSD : 100, Traffic : 50 })", - "HsBookingItemEntity(D-1000111:D-1000111 default project, MANAGED_SERVER, [2022-10-01,), separate ManagedServer, { CPU : 2, RAM : 8, SSD : 500, Traffic : 500 })", - "HsBookingItemEntity(D-1000111:D-1000111 default project, PRIVATE_CLOUD, [2024-04-01,), some PrivateCloud, { CPU : 10, HDD : 10000, RAM : 32, SSD : 4000, Traffic : 2000 })"); + "HsBookingItemEntity(MANAGED_SERVER, separate ManagedServer, D-1000111:D-1000111 default project, [2022-10-01,), { CPU : 2, RAM : 8, SSD : 500, Traffic : 500 })", + "HsBookingItemEntity(MANAGED_WEBSPACE, separate ManagedWebspace, D-1000111:D-1000111 default project, [2022-10-01,), { Daemons : 0, Multi : 1, SSD : 100, Traffic : 50 })", + "HsBookingItemEntity(PRIVATE_CLOUD, some PrivateCloud, D-1000111:D-1000111 default project, [2024-04-01,), { CPU : 10, HDD : 10000, RAM : 32, SSD : 4000, Traffic : 2000 })"); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java index 0b96a8a9..410485eb 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java @@ -240,13 +240,13 @@ public class ImportHostingAssets extends ImportOfficeData { HsBookingItemType.MANAGED_SERVER, HsBookingItemType.MANAGED_WEBSPACE)).isEqualToIgnoringWhitespace(""" { - 10630=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_WEBSPACE, [2001-06-01,), BI hsh00), - 10968=HsBookingItemEntity(D-1015200:rar default project, MANAGED_SERVER, [2013-04-01,), BI vm1061), - 10978=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2013-04-01,), BI vm1050), - 11061=HsBookingItemEntity(D-1000300:mim default project, MANAGED_SERVER, [2013-08-19,), BI vm1068), - 11094=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-10,), BI lug00), - 11111=HsBookingItemEntity(D-1000000:vm1068 Monitor, MANAGED_WEBSPACE, [2013-08-19,), BI xyz68), - 23611=HsBookingItemEntity(D-1101800:wws default project, CLOUD_SERVER, [2022-08-10,), BI vm2097) + 10630=HsBookingItemEntity(MANAGED_WEBSPACE, BI hsh00, D-1000000:hsh default project, [2001-06-01,)), + 10968=HsBookingItemEntity(MANAGED_SERVER, BI vm1061, D-1015200:rar default project, [2013-04-01,)), + 10978=HsBookingItemEntity(MANAGED_SERVER, BI vm1050, D-1000000:hsh default project, [2013-04-01,)), + 11061=HsBookingItemEntity(MANAGED_SERVER, BI vm1068, D-1000300:mim default project, [2013-08-19,)), + 11094=HsBookingItemEntity(MANAGED_WEBSPACE, BI lug00, D-1000300:mim default project, [2013-09-10,)), + 11111=HsBookingItemEntity(MANAGED_WEBSPACE, BI xyz68, D-1000000:vm1068 Monitor, [2013-08-19,)), + 23611=HsBookingItemEntity(CLOUD_SERVER, BI vm2097, D-1101800:wws default project, [2022-08-10,)) } """); assertThat(firstOfEach(9, packetAssets)).isEqualToIgnoringWhitespace(""" @@ -299,16 +299,16 @@ public class ImportHostingAssets extends ImportOfficeData { HsBookingItemType.MANAGED_WEBSPACE)) .isEqualToIgnoringWhitespace(""" { - 10630=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_WEBSPACE, [2001-06-01,), BI hsh00, {"HDD": 10, "Multi": 25, "SLA-Platform": "EXT24H", "SSD": 16, "Traffic": 50}), - 10968=HsBookingItemEntity(D-1015200:rar default project, MANAGED_SERVER, [2013-04-01,), BI vm1061, {"CPU": 6, "HDD": 250, "RAM": 14, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 375, "Traffic": 250}), - 10978=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2013-04-01,), BI vm1050, {"CPU": 4, "HDD": 250, "RAM": 32, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 150, "Traffic": 250}), - 11061=HsBookingItemEntity(D-1000300:mim default project, MANAGED_SERVER, [2013-08-19,), BI vm1068, {"CPU": 2, "HDD": 250, "RAM": 4, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT2H", "SLA-Web": true, "Traffic": 250}), - 11094=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-10,), BI lug00, {"Multi": 5, "SLA-Platform": "EXT24H", "SSD": 1, "Traffic": 10}), - 11111=HsBookingItemEntity(D-1000000:vm1068 Monitor, MANAGED_WEBSPACE, [2013-08-19,), BI xyz68, {"SSD": 3}), - 11112=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-17,), BI mim00, {"Multi": 5, "SLA-Platform": "EXT24H", "SSD": 3, "Traffic": 20}), - 11447=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2014-11-28,), BI vm1093, {"CPU": 6, "HDD": 500, "RAM": 16, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 300, "Traffic": 250}), - 19959=HsBookingItemEntity(D-1101900:dph default project, MANAGED_WEBSPACE, [2021-06-02,), BI dph00, {"Multi": 1, "SLA-Platform": "EXT24H", "SSD": 25, "Traffic": 20}), - 23611=HsBookingItemEntity(D-1101800:wws default project, CLOUD_SERVER, [2022-08-10,), BI vm2097, {"CPU": 8, "RAM": 12, "SLA-Infrastructure": "EXT4H", "SSD": 25, "Traffic": 250}) + 10630=HsBookingItemEntity(MANAGED_WEBSPACE, BI hsh00, D-1000000:hsh default project, [2001-06-01,), {"HDD": 10, "Multi": 25, "SLA-Platform": "EXT24H", "SSD": 16, "Traffic": 50}), + 10968=HsBookingItemEntity(MANAGED_SERVER, BI vm1061, D-1015200:rar default project, [2013-04-01,), {"CPU": 6, "HDD": 250, "RAM": 14, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 375, "Traffic": 250}), + 10978=HsBookingItemEntity(MANAGED_SERVER, BI vm1050, D-1000000:hsh default project, [2013-04-01,), {"CPU": 4, "HDD": 250, "RAM": 32, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 150, "Traffic": 250}), + 11061=HsBookingItemEntity(MANAGED_SERVER, BI vm1068, D-1000300:mim default project, [2013-08-19,), {"CPU": 2, "HDD": 250, "RAM": 4, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT2H", "SLA-Web": true, "Traffic": 250}), + 11094=HsBookingItemEntity(MANAGED_WEBSPACE, BI lug00, D-1000300:mim default project, [2013-09-10,), {"Multi": 5, "SLA-Platform": "EXT24H", "SSD": 1, "Traffic": 10}), + 11111=HsBookingItemEntity(MANAGED_WEBSPACE, BI xyz68, D-1000000:vm1068 Monitor, [2013-08-19,), {"SSD": 3}), + 11112=HsBookingItemEntity(MANAGED_WEBSPACE, BI mim00, D-1000300:mim default project, [2013-09-17,), {"Multi": 5, "SLA-Platform": "EXT24H", "SSD": 3, "Traffic": 20}), + 11447=HsBookingItemEntity(MANAGED_SERVER, BI vm1093, D-1000000:hsh default project, [2014-11-28,), {"CPU": 6, "HDD": 500, "RAM": 16, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 300, "Traffic": 250}), + 19959=HsBookingItemEntity(MANAGED_WEBSPACE, BI dph00, D-1101900:dph default project, [2021-06-02,), {"Multi": 1, "SLA-Platform": "EXT24H", "SSD": 25, "Traffic": 20}), + 23611=HsBookingItemEntity(CLOUD_SERVER, BI vm2097, D-1101800:wws default project, [2022-08-10,), {"CPU": 8, "RAM": 12, "SLA-Infrastructure": "EXT4H", "SSD": 25, "Traffic": 250}) } """); } -- 2.39.5 From a8e30c3d513db74bfda2c412ff493235b5c70393 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Wed, 14 Aug 2024 14:17:14 +0200 Subject: [PATCH 04/14] cleanup --- .../HsHostingAssetRepositoryIntegrationTest.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java index a2c96772..682610de 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java @@ -6,7 +6,6 @@ import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRepository; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRepository; import net.hostsharing.hsadminng.rbac.rbacgrant.RawRbacGrantRepository; -import net.hostsharing.hsadminng.rbac.rbacgrant.RbacGrantsDiagramService; import net.hostsharing.hsadminng.rbac.rbacrole.RawRbacRoleRepository; import net.hostsharing.hsadminng.mapper.Array; import net.hostsharing.hsadminng.rbac.test.ContextBasedTestWithCleanup; @@ -256,20 +255,9 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu public void managedServerAgent_canFindRelatedEmailAddresses() { // given context("superuser-alex@hostsharing.net"); - // FIXME: remove -// final var parentAssetUuid = assetRepo.findByIdentifier("vm1012").stream() -// .filter(ha -> ha.getType() == MANAGED_SERVER) -// .findAny().orElseThrow().getUuid(); // when -// context("superuser-alex@hostsharing.net", "hs_hosting_asset#vm1012:AGENT"); context("superuser-alex@hostsharing.net", "hs_hosting_asset#sec01:AGENT"); - // FIXME: cleanup -// context("superuser-alex@hostsharing.net", "hs_hosting_asset#sec.example.org|MBOX:AGENT"); -// context("superuser-alex@hostsharing.net", "hs_booking_project#D-1000212-D-1000212defaultproject:AGENT"); - - generateRbacDiagramForCurrentSubjects(RbacGrantsDiagramService.Include.ALL_NON_TEST_ENTITY_RELATED, "should-contain-email-addresses"); - final var result = assetRepo.findAllByCriteria(null, null, EMAIL_ADDRESS); // then -- 2.39.5 From 23c45c0bd886d9e5f9b6edfed6de2c0ee53f8277 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Thu, 15 Aug 2024 09:07:16 +0200 Subject: [PATCH 05/14] properly split up HsHostingAssetEntity into HsHostingAssetReal+RbacEntity extending HsHostingAsset --- .../hs/booking/item/HsBookingItemEntity.java | 4 +- .../hs/hosting/asset/HsHostingAsset.java | 123 +++++++++++++++--- .../asset/HsHostingAssetController.java | 25 ++-- .../asset/HsHostingAssetEntityPatcher.java | 4 +- ...ity.java => HsHostingAssetRbacEntity.java} | 109 +--------------- ...java => HsHostingAssetRbacRepository.java} | 12 +- .../asset/HsHostingAssetRealEntity.java | 24 ++++ .../asset/HsHostingAssetRealRepository.java | 46 +++++++ .../hs/hosting/asset/HsHostingAssetType.java | 6 +- .../hsadminng/arch/ArchitectureTest.java | 21 ++- ...gedServerBookingItemValidatorUnitTest.java | 26 ++-- ...sHostingAssetControllerAcceptanceTest.java | 72 +++++----- .../HsHostingAssetControllerRestTest.java | 65 ++++----- .../HsHostingAssetEntityPatcherUnitTest.java | 18 +-- .../asset/HsHostingAssetEntityUnitTest.java | 14 +- ...ngAssetRbacRepositoryIntegrationTest.java} | 121 +++++++++-------- .../asset/HsHostingAssetTestEntities.java | 36 +++++ .../asset/TestHsHostingAssetEntities.java | 22 ---- ...udServerHostingAssetValidatorUnitTest.java | 15 ++- ...DnsSetupHostingAssetValidatorUnitTest.java | 16 +-- ...ttpSetupHostingAssetValidatorUnitTest.java | 14 +- ...mainMboxHostingAssetValidatorUnitTest.java | 14 +- ...ainSetupHostingAssetValidatorUnitTest.java | 12 +- ...mtpSetupHostingAssetValidatorUnitTest.java | 15 ++- ...lAddressHostingAssetValidatorUnitTest.java | 17 +-- ...ailAliasHostingAssetValidatorUnitTest.java | 28 ++-- ...v4NumberHostingAssetValidatorUnitTest.java | 14 +- ...v6NumberHostingAssetValidatorUnitTest.java | 14 +- ...edServerHostingAssetValidatorUnitTest.java | 17 +-- ...WebspaceHostingAssetValidatorUnitTest.java | 19 +-- ...DatabaseHostingAssetValidatorUnitTest.java | 20 +-- ...InstanceHostingAssetValidatorUnitTest.java | 18 +-- ...iaDbUserHostingAssetValidatorUnitTest.java | 18 +-- ...DatabaseHostingAssetValidatorUnitTest.java | 24 ++-- ...InstanceHostingAssetValidatorUnitTest.java | 18 +-- ...eSqlUserHostingAssetValidatorUnitTest.java | 18 +-- ...UnixUserHostingAssetValidatorUnitTest.java | 27 ++-- .../migration/HsHostingAssetRealEntity.java | 114 ---------------- .../hs/migration/ImportHostingAssets.java | 1 + 39 files changed, 598 insertions(+), 603 deletions(-) rename src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/{HsHostingAssetEntity.java => HsHostingAssetRbacEntity.java} (62%) rename src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/{HsHostingAssetRepository.java => HsHostingAssetRbacRepository.java} (70%) create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRealEntity.java create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRealRepository.java rename src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/{HsHostingAssetRepositoryIntegrationTest.java => HsHostingAssetRbacRepositoryIntegrationTest.java} (77%) create mode 100644 src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetTestEntities.java delete mode 100644 src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/TestHsHostingAssetEntities.java delete mode 100644 src/test/java/net/hostsharing/hsadminng/hs/migration/HsHostingAssetRealEntity.java diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java index 81c87e03..957ba171 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java @@ -10,7 +10,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.validation.PropertiesProvider; import net.hostsharing.hsadminng.mapper.PatchableMapWrapper; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; @@ -120,7 +120,7 @@ public class HsBookingItemEntity implements Stringifyable, BaseEntity subBookingItems; @OneToOne(mappedBy="bookingItem") - private HsHostingAssetEntity relatedHostingAsset; + private HsHostingAssetRbacEntity relatedHostingAsset; @Transient private PatchableMapWrapper resourcesWrapper; diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAsset.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAsset.java index 81b09512..efcba66f 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAsset.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAsset.java @@ -1,13 +1,39 @@ package net.hostsharing.hsadminng.hs.hosting.asset; +import io.hypersistence.utils.hibernate.type.json.JsonType; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.Getter; +import lombok.experimental.SuperBuilder; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectEntity; import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.hs.validation.PropertiesProvider; +import net.hostsharing.hsadminng.mapper.PatchableMapWrapper; import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.stringify.Stringify; import net.hostsharing.hsadminng.stringify.Stringifyable; +import org.hibernate.annotations.Type; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.MappedSuperclass; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.PostLoad; +import jakarta.persistence.Transient; +import jakarta.persistence.Version; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -16,9 +42,15 @@ import java.util.UUID; import static java.util.Collections.emptyMap; import static net.hostsharing.hsadminng.stringify.Stringify.stringify; -public interface HsHostingAsset extends Stringifyable, BaseEntity, PropertiesProvider { +@MappedSuperclass +@Getter +@Setter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@SuperBuilder(builderMethodName = "baseBuilder", toBuilder = true) +public class HsHostingAsset implements Stringifyable, BaseEntity, PropertiesProvider { - Stringify stringify = stringify(HsHostingAsset.class) + static Stringify stringify = stringify(HsHostingAsset.class) .withProp(HsHostingAsset::getType) .withProp(HsHostingAsset::getIdentifier) .withProp(HsHostingAsset::getCaption) @@ -28,20 +60,74 @@ public interface HsHostingAsset extends Stringifyable, BaseEntity getSubHostingAssets(); - String getCaption(); - Map getConfig(); + @Version + private int version; - default HsBookingProjectEntity getRelatedProject() { + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "bookingitemuuid") + private HsBookingItemEntity bookingItem; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "parentassetuuid") + private HsHostingAssetRealEntity parentAsset; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "assignedtoassetuuid") + private HsHostingAssetRealEntity assignedToAsset; + + @Column(name = "type") + @Enumerated(EnumType.STRING) + private HsHostingAssetType type; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "alarmcontactuuid") + private HsOfficeContactRealEntity alarmContact; + + @OneToMany(cascade = CascadeType.REFRESH, orphanRemoval = true, fetch = FetchType.LAZY) + @JoinColumn(name = "parentassetuuid", referencedColumnName = "uuid") + private List subHostingAssets; + + @Column(name = "identifier") + private String identifier; // e.g. vm1234, xyz00, example.org, xyz00_abc + + @Column(name = "caption") + private String caption; + + @Builder.Default + @Setter(AccessLevel.NONE) + @Type(JsonType.class) + @Column(columnDefinition = "config") + private Map config = new HashMap<>(); + + @Transient + private PatchableMapWrapper configWrapper; + + @Transient + private boolean isLoaded; + + @PostLoad + public void markAsLoaded() { + this.isLoaded = true; + } + + public PatchableMapWrapper getConfig() { + return PatchableMapWrapper.of(configWrapper, (newWrapper) -> {configWrapper = newWrapper;}, config); + } + + public void putConfig(Map newConfig) { + PatchableMapWrapper.of(configWrapper, (newWrapper) -> {configWrapper = newWrapper;}, config).assign(newConfig); + } + + @Override + public PatchableMapWrapper directProps() { + return getConfig(); + } + + public HsBookingProjectEntity getRelatedProject() { return Optional.ofNullable(getBookingItem()) .map(HsBookingItemEntity::getRelatedProject) .orElseGet(() -> Optional.ofNullable(getParentAsset()) @@ -50,7 +136,7 @@ public interface HsHostingAsset extends Stringifyable, BaseEntity mapper.map(e, HsHostingAssetResource.class)) .revampProperties(); @@ -98,7 +101,7 @@ public class HsHostingAssetController implements HsHostingAssetsApi { context.define(currentUser, assumedRoles); - final var result = assetRepo.findByUuid(assetUuid); + final var result = assetRbacRepo.findByUuid(assetUuid); return result .map(assetEntity -> ResponseEntity.ok( mapper.map(assetEntity, HsHostingAssetResource.class, ENTITY_TO_RESOURCE_POSTMAPPER))) @@ -113,7 +116,7 @@ public class HsHostingAssetController implements HsHostingAssetsApi { final UUID assetUuid) { context.define(currentUser, assumedRoles); - final var result = assetRepo.deleteByUuid(assetUuid); + final var result = assetRbacRepo.deleteByUuid(assetUuid); return result == 0 ? ResponseEntity.notFound().build() : ResponseEntity.noContent().build(); @@ -129,7 +132,7 @@ public class HsHostingAssetController implements HsHostingAssetsApi { context.define(currentUser, assumedRoles); - final var entity = assetRepo.findByUuid(assetUuid).orElseThrow(); + final var entity = assetRbacRepo.findByUuid(assetUuid).orElseThrow(); new HsHostingAssetEntityPatcher(em, entity).apply(body); @@ -137,7 +140,7 @@ public class HsHostingAssetController implements HsHostingAssetsApi { .preprocessEntity() .validateEntity() .prepareForSave() - .saveUsing(assetRepo::save) + .saveUsing(assetRbacRepo::save) .validateContext() .mapUsing(e -> mapper.map(e, HsHostingAssetResource.class)) .revampProperties(); @@ -145,7 +148,7 @@ public class HsHostingAssetController implements HsHostingAssetsApi { return ResponseEntity.ok(mapped); } - final BiConsumer RESOURCE_TO_ENTITY_POSTMAPPER = (resource, entity) -> { + final BiConsumer RESOURCE_TO_ENTITY_POSTMAPPER = (resource, entity) -> { entity.putConfig(KeyValueMap.from(resource.getConfig())); if (resource.getBookingItemUuid() != null) { entity.setBookingItem(bookingItemRepo.findByUuid(resource.getBookingItemUuid()) @@ -153,14 +156,14 @@ public class HsHostingAssetController implements HsHostingAssetsApi { resource.getBookingItemUuid())))); } if (resource.getParentAssetUuid() != null) { - entity.setParentAsset(assetRepo.findByUuid(resource.getParentAssetUuid()) + entity.setParentAsset(assetRealRepo.findByUuid(resource.getParentAssetUuid()) .orElseThrow(() -> new EntityNotFoundException("ERROR: [400] parentAssetUuid %s not found".formatted( resource.getParentAssetUuid())))); } }; @SuppressWarnings("unchecked") - final BiConsumer ENTITY_TO_RESOURCE_POSTMAPPER = (entity, resource) + final BiConsumer ENTITY_TO_RESOURCE_POSTMAPPER = (entity, resource) -> resource.setConfig(HostingAssetEntityValidatorRegistry.forType(entity.getType()) .revampProperties(em, entity, (Map) resource.getConfig())); } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcher.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcher.java index c16c22e0..5296a955 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcher.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcher.java @@ -12,9 +12,9 @@ import java.util.Optional; public class HsHostingAssetEntityPatcher implements EntityPatcher { private final EntityManager em; - private final HsHostingAssetEntity entity; + private final HsHostingAssetRbacEntity entity; - public HsHostingAssetEntityPatcher(final EntityManager em, final HsHostingAssetEntity entity) { + public HsHostingAssetEntityPatcher(final EntityManager em, final HsHostingAssetRbacEntity entity) { this.em = em; this.entity = entity; } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacEntity.java similarity index 62% rename from src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java rename to src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacEntity.java index 2ae4ae70..18b68c62 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacEntity.java @@ -1,41 +1,17 @@ package net.hostsharing.hsadminng.hs.hosting.asset; -import io.hypersistence.utils.hibernate.type.json.JsonType; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import lombok.experimental.SuperBuilder; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRbacEntity; -import net.hostsharing.hsadminng.mapper.PatchableMapWrapper; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; -import org.hibernate.annotations.Type; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToMany; -import jakarta.persistence.OneToOne; -import jakarta.persistence.PostLoad; import jakarta.persistence.Table; -import jakarta.persistence.Transient; -import jakarta.persistence.Version; import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.CaseDef.inCaseOf; import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Column.dependsOnColumn; @@ -56,89 +32,16 @@ import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.TENANT; import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL.directlyFetchedByDependsOnColumn; import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.rbacViewFor; -@Builder @Entity @Table(name = "hs_hosting_asset_rv") +@SuperBuilder(toBuilder = true) @Getter @Setter @NoArgsConstructor -@AllArgsConstructor -public class HsHostingAssetEntity implements HsHostingAsset { - - @Id - @GeneratedValue - private UUID uuid; - - @Version - private int version; - - @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "bookingitemuuid") - private HsBookingItemEntity bookingItem; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "parentassetuuid") - private HsHostingAssetEntity parentAsset; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "assignedtoassetuuid") - private HsHostingAssetEntity assignedToAsset; - - @Column(name = "type") - @Enumerated(EnumType.STRING) - private HsHostingAssetType type; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "alarmcontactuuid") - private HsOfficeContactRealEntity alarmContact; - - @OneToMany(cascade = CascadeType.REFRESH, orphanRemoval = true, fetch = FetchType.LAZY) - @JoinColumn(name = "parentassetuuid", referencedColumnName = "uuid") - private List subHostingAssets; - - @Column(name = "identifier") - private String identifier; // e.g. vm1234, xyz00, example.org, xyz00_abc - - @Column(name = "caption") - private String caption; - - @Builder.Default - @Setter(AccessLevel.NONE) - @Type(JsonType.class) - @Column(columnDefinition = "config") - private Map config = new HashMap<>(); - - @Transient - private PatchableMapWrapper configWrapper; - - @Transient - private boolean isLoaded; - - @PostLoad - public void markAsLoaded() { - this.isLoaded = true; - } - - public PatchableMapWrapper getConfig() { - return PatchableMapWrapper.of(configWrapper, (newWrapper) -> {configWrapper = newWrapper;}, config); - } - - public void putConfig(Map newConfig) { - PatchableMapWrapper.of(configWrapper, (newWrapper) -> {configWrapper = newWrapper;}, config).assign(newConfig); - } - - @Override - public PatchableMapWrapper directProps() { - return getConfig(); - } - - @Override - public String toString() { - return stringify.using(HsHostingAssetEntity.class).apply(this); - } +public class HsHostingAssetRbacEntity extends HsHostingAsset { public static RbacView rbac() { - return rbacViewFor("asset", HsHostingAssetEntity.class) + return rbacViewFor("asset", HsHostingAssetRbacEntity.class) .withIdentityView(SQL.projection("identifier")) .withRestrictedViewOrderBy(SQL.expression("identifier")) .withUpdatableColumns("version", "caption", "config", "assignedToAssetUuid", "alarmContactUuid") @@ -149,13 +52,13 @@ public class HsHostingAssetEntity implements HsHostingAsset { directlyFetchedByDependsOnColumn(), NULLABLE) - .importEntityAlias("parentAsset", HsHostingAssetEntity.class, usingDefaultCase(), + .importEntityAlias("parentAsset", HsHostingAssetRbacEntity.class, usingDefaultCase(), dependsOnColumn("parentAssetUuid"), directlyFetchedByDependsOnColumn(), NULLABLE) .toRole("parentAsset", ADMIN).grantPermission(INSERT) - .importEntityAlias("assignedToAsset", HsHostingAssetEntity.class, usingDefaultCase(), + .importEntityAlias("assignedToAsset", HsHostingAssetRbacEntity.class, usingDefaultCase(), dependsOnColumn("assignedToAssetUuid"), directlyFetchedByDependsOnColumn(), NULLABLE) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepository.java similarity index 70% rename from src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepository.java rename to src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepository.java index 2b2c4452..af9908cc 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepository.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepository.java @@ -8,11 +8,11 @@ import java.util.Optional; import java.util.UUID; -public interface HsHostingAssetRepository extends Repository { +public interface HsHostingAssetRbacRepository extends Repository { - Optional findByUuid(final UUID serverUuid); + Optional findByUuid(final UUID serverUuid); - List findByIdentifier(String assetIdentifier); + List findByIdentifier(String assetIdentifier); @Query(value = """ select ha.uuid, @@ -34,12 +34,12 @@ public interface HsHostingAssetRepository extends Repository findAllByCriteriaImpl(UUID projectUuid, UUID parentAssetUuid, String type); - default List findAllByCriteria(final UUID projectUuid, final UUID parentAssetUuid, final HsHostingAssetType type) { + List findAllByCriteriaImpl(UUID projectUuid, UUID parentAssetUuid, String type); + default List findAllByCriteria(final UUID projectUuid, final UUID parentAssetUuid, final HsHostingAssetType type) { return findAllByCriteriaImpl(projectUuid, parentAssetUuid, HsHostingAssetType.asString(type)); } - HsHostingAssetEntity save(HsHostingAsset current); + HsHostingAssetRbacEntity save(HsHostingAsset current); int deleteByUuid(final UUID uuid); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRealEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRealEntity.java new file mode 100644 index 00000000..a586f245 --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRealEntity.java @@ -0,0 +1,24 @@ +package net.hostsharing.hsadminng.hs.hosting.asset; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +import jakarta.persistence.Entity; +import jakarta.persistence.Table; + +@Entity +@Table(name = "hs_hosting_asset") +@SuperBuilder(builderMethodName = "genericBuilder", toBuilder = true) +@Getter +@Setter +@NoArgsConstructor +public class HsHostingAssetRealEntity extends HsHostingAsset { + + // without this wrapper method, the builder returns a generic entity which cannot resolved in a generic context + public static HsHostingAssetRealEntityBuilder builder() { + //noinspection unchecked + return (HsHostingAssetRealEntityBuilder) genericBuilder(); + } +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRealRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRealRepository.java new file mode 100644 index 00000000..2b40c96a --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRealRepository.java @@ -0,0 +1,46 @@ +package net.hostsharing.hsadminng.hs.hosting.asset; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.Repository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface HsHostingAssetRealRepository extends Repository { + + Optional findByUuid(final UUID serverUuid); + + List findByIdentifier(String assetIdentifier); + + @Query(value = """ + select ha.uuid, + ha.alarmcontactuuid, + ha.assignedtoassetuuid, + ha.bookingitemuuid, + ha.caption, + ha.config, + ha.identifier, + ha.parentassetuuid, + ha.type, + ha.version + from hs_hosting_asset_rv ha + left join hs_booking_item bi on bi.uuid = ha.bookingitemuuid + left join hs_hosting_asset pha on pha.uuid = ha.parentassetuuid + where (:projectUuid is null or bi.projectuuid=:projectUuid) + and (:parentAssetUuid is null or pha.uuid=:parentAssetUuid) + and (:type is null or :type=cast(ha.type as text)) + """, nativeQuery = true) + // The JPQL query did not generate "left join" but just "join". + // I also optimized the query by not using the _rv for hs_booking_item and hs_hosting_asset, only for hs_hosting_asset_rv. + List findAllByCriteriaImpl(UUID projectUuid, UUID parentAssetUuid, String type); + default List findAllByCriteria(final UUID projectUuid, final UUID parentAssetUuid, final HsHostingAssetType type) { + return findAllByCriteriaImpl(projectUuid, parentAssetUuid, HsHostingAssetType.asString(type)); + } + + HsHostingAssetRealEntity save(HsHostingAsset current); + + int deleteByUuid(final UUID uuid); + + long count(); +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java index e11b1430..9b8e1403 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java @@ -354,14 +354,14 @@ class EntityTypeRelation { final HsHostingAssetType.RelationPolicy relationPolicy; final HsHostingAssetType.RelationType relationType; - final Function getter; + final Function getter; private final List acceptedRelatedTypes; final String edge; private EntityTypeRelation( final HsHostingAssetType.RelationPolicy relationPolicy, final HsHostingAssetType.RelationType relationType, - final Function getter, + final Function getter, final T acceptedRelatedType, final String edge ) { @@ -380,7 +380,7 @@ class EntityTypeRelation { return new EntityTypeRelation<>( REQUIRED, BOOKING_ITEM, - HsHostingAssetEntity::getBookingItem, + HsHostingAssetRbacEntity::getBookingItem, bookingItemType, " *==> "); } diff --git a/src/test/java/net/hostsharing/hsadminng/arch/ArchitectureTest.java b/src/test/java/net/hostsharing/hsadminng/arch/ArchitectureTest.java index 49071496..8bc7aad0 100644 --- a/src/test/java/net/hostsharing/hsadminng/arch/ArchitectureTest.java +++ b/src/test/java/net/hostsharing/hsadminng/arch/ArchitectureTest.java @@ -1,6 +1,9 @@ package net.hostsharing.hsadminng.arch; +import com.tngtech.archunit.base.DescribedPredicate; import com.tngtech.archunit.core.domain.JavaClass; +import com.tngtech.archunit.core.domain.JavaMethod; +import com.tngtech.archunit.core.domain.JavaModifier; import com.tngtech.archunit.junit.AnalyzeClasses; import com.tngtech.archunit.junit.ArchTest; import com.tngtech.archunit.lang.ArchCondition; @@ -9,10 +12,9 @@ import com.tngtech.archunit.lang.ConditionEvents; import com.tngtech.archunit.lang.SimpleConditionEvent; import net.hostsharing.hsadminng.HsadminNgApplication; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.rbac.context.ContextBasedTest; import net.hostsharing.hsadminng.rbac.rbacgrant.RbacGrantsDiagramService; -import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import org.springframework.data.repository.Repository; import org.springframework.web.bind.annotation.RestController; @@ -329,7 +331,7 @@ public class ArchitectureTest { RbacGrantsDiagramService.class) .ignoreDependency( HsBookingItemEntity.class, - HsHostingAssetEntity.class); + HsHostingAssetRbacEntity.class); @ArchTest @@ -347,10 +349,21 @@ public class ArchitectureTest { static final ArchRule tableNamesOfRbacEntitiesShouldEndWith_rv = classes() .that().areAnnotatedWith(Table.class) - .and().areAssignableTo(BaseEntity.class) + .and().containAnyMethodsThat(hasStaticMethodNamed("rbac")) + // .and().haveNameNotMatching(".*RealEntity") TODO.test: check rules for RealEntity vs. RbacEntity .should(haveTableNameEndingWith_rv()) .because("it's required that the table names of RBAC entities end with '_rv'"); + + private static DescribedPredicate hasStaticMethodNamed(final String expectedName) { + return new DescribedPredicate<>("rbac entity") { + @Override + public boolean test(final JavaMethod method) { + return method.getModifiers().contains(JavaModifier.STATIC) && method.getName().equals(expectedName); + } + }; + } + static ArchCondition haveTableNameEndingWith_rv() { return new ArchCondition<>("RBAC table name end with _rv") { diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java index ab54f050..bef65f82 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java @@ -3,7 +3,8 @@ package net.hostsharing.hsadminng.hs.booking.item.validators; import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; import org.junit.jupiter.api.Test; @@ -140,7 +141,7 @@ class HsManagedServerBookingItemValidatorUnitTest { entry("Traffic", 1000), entry("Multi", 1) )) - .relatedHostingAsset(HsHostingAssetEntity.builder() + .relatedHostingAsset(HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.MANAGED_WEBSPACE) .identifier("abc00") .subHostingAssets(concat( @@ -175,47 +176,48 @@ class HsManagedServerBookingItemValidatorUnitTest { } @SafeVarargs - private List concat(final List... hostingAssets) { + private List concat(final List... hostingAssets) { return stream(hostingAssets) .flatMap(Collection::stream) .collect(Collectors.toList()); } - private List generate(final int count, final HsHostingAssetType hostingAssetType, + private List generate(final int count, final HsHostingAssetType hostingAssetType, final String identifierPattern) { return IntStream.range(0, count) - .mapToObj(number -> HsHostingAssetEntity.builder() + .mapToObj(number -> (HsHostingAssetRealEntity) HsHostingAssetRealEntity.builder() .type(hostingAssetType) .identifier(identifierPattern.formatted((number/'a')+'a', (number%'a')+'a')) .build()) .toList(); } - private List generateDbUsersWithDatabases( + private List generateDbUsersWithDatabases( final int userCount, final HsHostingAssetType directAssetType, final String directAssetIdentifierFormat, final int dbCount, final HsHostingAssetType subAssetType) { - return IntStream.range(0, userCount) - .mapToObj(n -> HsHostingAssetEntity.builder() + final List list = IntStream.range(0, userCount) + .mapToObj(n -> HsHostingAssetRealEntity.builder() .type(directAssetType) - .identifier(directAssetIdentifierFormat.formatted((n/'a')+'a', (n%'a')+'a')) + .identifier(directAssetIdentifierFormat.formatted((n / 'a') + 'a', (n % 'a') + 'a')) .subHostingAssets( - generate(dbCount, subAssetType, "%c%c.example.com".formatted((n/'a')+'a', (n%'a')+'a')) + generate(dbCount, subAssetType, "%c%c.example.com" .formatted((n / 'a') + 'a', (n % 'a') + 'a')) ) .build()) .toList(); + return list; } - private List generateDomainEmailSetupsWithEMailAddresses( + private List generateDomainEmailSetupsWithEMailAddresses( final int domainCount, final HsHostingAssetType directAssetType, final String directAssetIdentifierFormat, final int emailAddressCount, final HsHostingAssetType subAssetType) { return IntStream.range(0, domainCount) - .mapToObj(n -> HsHostingAssetEntity.builder() + .mapToObj(n -> HsHostingAssetRealEntity.builder() .type(directAssetType) .identifier(directAssetIdentifierFormat.formatted((n/'a')+'a', (n%'a')+'a')) .subHostingAssets( diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java index 0fcb35b4..0b582272 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java @@ -8,8 +8,8 @@ import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRepository; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRepository; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRbacEntity; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRbacRepository; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealRepository; import net.hostsharing.hsadminng.hs.office.debitor.HsOfficeDebitorRepository; import net.hostsharing.hsadminng.rbac.test.ContextBasedTestWithCleanup; import net.hostsharing.hsadminng.rbac.test.JpaAttempt; @@ -50,7 +50,10 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup private Integer port; @Autowired - HsHostingAssetRepository assetRepo; + HsHostingAssetRealRepository realAssetRepo; + + @Autowired + HsHostingAssetRbacRepository rbacAssetRepo; @Autowired HsBookingItemRepository bookingItemRepo; @@ -62,7 +65,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup HsOfficeDebitorRepository debitorRepo; @Autowired - HsOfficeContactRbacRepository contactRepo; + HsOfficeContactRealRepository realContactRepo; @Autowired JpaAttempt jpaAttempt; @@ -189,13 +192,12 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup final var newWebspace = UUID.fromString( location.substring(location.lastIndexOf('/') + 1)); assertThat(newWebspace).isNotNull(); - toCleanup(HsHostingAssetEntity.class, newWebspace); + toCleanup(HsHostingAssetRbacEntity.class, newWebspace); } @Test void parentAssetAgent_canAddSubAsset() { - context.define("superuser-alex@hostsharing.net"); final var givenParentAsset = givenParentAsset(MANAGED_WEBSPACE, "fir01"); final var location = RestAssured // @formatter:off @@ -273,7 +275,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup final var newWebspace = UUID.fromString( location.substring(location.lastIndexOf('/') + 1)); assertThat(newWebspace).isNotNull(); - toCleanup(HsHostingAssetEntity.class, newWebspace); + toCleanup(HsHostingAssetRbacEntity.class, newWebspace); } @Test @@ -320,18 +322,18 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup void totalsLimitValidationsArePerformend_whenAddingAsset() { context.define("superuser-alex@hostsharing.net"); - final var givenHostingAsset = givenHostingAsset(MANAGED_WEBSPACE, "fir01"); + final var givenHostingAsset = givenRealHostingAsset(MANAGED_WEBSPACE, "fir01"); assertThat(givenHostingAsset.getBookingItem().getResources().get("Multi")) .as("precondition failed") .isEqualTo(1); - final var preExistingUnixUserCount = assetRepo.findAllByCriteria(null, givenHostingAsset.getUuid(), UNIX_USER).size(); + final var preExistingUnixUserCount = realAssetRepo.findAllByCriteria(null, givenHostingAsset.getUuid(), UNIX_USER).size(); final var UNIX_USER_PER_MULTI_OPTION = 25; jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net"); for (int n = 0; n < UNIX_USER_PER_MULTI_OPTION -preExistingUnixUserCount+1; ++n) { - toCleanup(assetRepo.save( - HsHostingAssetEntity.builder() + toCleanup(realAssetRepo.save( + HsHostingAssetRealEntity.builder() .type(UNIX_USER) .parentAsset(givenHostingAsset) .identifier("fir01-%2d".formatted(n)) @@ -375,7 +377,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup @Test void globalAdmin_canGetArbitraryAsset() { context.define("superuser-alex@hostsharing.net"); - final var givenAssetUuid = assetRepo.findByIdentifier("vm1011").stream() + final var givenAssetUuid = realAssetRepo.findByIdentifier("vm1011").stream() .filter(bi -> bi.getBookingItem().getProject().getCaption().equals("D-1000111 default project")) .findAny().orElseThrow().getUuid(); @@ -399,9 +401,9 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup @Test void normalUser_canNotGetUnrelatedAsset() { context.define("superuser-alex@hostsharing.net"); - final var givenAssetUuid = assetRepo.findByIdentifier("vm1012").stream() + final var givenAssetUuid = realAssetRepo.findByIdentifier("vm1012").stream() .filter(bi -> bi.getBookingItem().getProject().getCaption().equals("D-1000212 default project")) - .map(HsHostingAssetEntity::getUuid) + .map(HsHostingAssetRealEntity::getUuid) .findAny().orElseThrow(); RestAssured // @formatter:off @@ -417,7 +419,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup @Test void projectAgentUser_canGetRelatedAsset() { context.define("superuser-alex@hostsharing.net"); - final var givenAssetUuid = assetRepo.findByIdentifier("vm1013").stream() + final var givenAssetUuid = realAssetRepo.findByIdentifier("vm1013").stream() .filter(bi -> bi.getBookingItem().getProject().getCaption().equals("D-1000313 default project")) .findAny().orElseThrow().getUuid(); @@ -449,7 +451,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup void globalAdmin_canPatchAllUpdatablePropertiesOfAsset() { final var givenAsset = givenSomeTemporaryHostingAsset(() -> - HsHostingAssetEntity.builder() + HsHostingAssetRealEntity.builder() .uuid(UUID.randomUUID()) .bookingItem(givenSomeNewBookingItem( "D-1000111 default project", @@ -510,8 +512,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup // finally, the asset is actually updated em.clear(); - context.define("superuser-alex@hostsharing.net"); - assertThat(assetRepo.findByUuid(givenAsset.getUuid())).isPresent().get() + assertThat(realAssetRepo.findByUuid(givenAsset.getUuid())).isPresent().get() .matches(asset -> { assertThat(asset.getAlarmContact()).isNotNull() .extracting(c -> c.getEmailAddresses().get("main")) @@ -533,10 +534,10 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup void assetAdmin_canPatchAllUpdatablePropertiesOfAsset() { final var givenAsset = givenSomeTemporaryHostingAsset(() -> - HsHostingAssetEntity.builder() + HsHostingAssetRealEntity.builder() .uuid(UUID.randomUUID()) .type(UNIX_USER) - .parentAsset(givenHostingAsset(MANAGED_WEBSPACE, "fir01")) + .parentAsset(givenRealHostingAsset(MANAGED_WEBSPACE, "fir01")) .identifier("fir01-temp") .caption("some test-unix-user") .build()); @@ -586,8 +587,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup // finally, the asset is actually updated assertThat(jpaAttempt.transacted(() -> { - context.define("superuser-alex@hostsharing.net"); - return assetRepo.findByUuid(givenAsset.getUuid()); + return realAssetRepo.findByUuid(givenAsset.getUuid()); }).returnedValue()).isPresent().get() .matches(asset -> { assertThat(asset.getCaption()).isEqualTo("some patched test-unix-user"); @@ -611,7 +611,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup void globalAdmin_canDeleteArbitraryAsset() { context.define("superuser-alex@hostsharing.net"); final var givenAsset = givenSomeTemporaryHostingAsset(() -> - HsHostingAssetEntity.builder() + HsHostingAssetRealEntity.builder() .uuid(UUID.randomUUID()) .bookingItem(givenSomeNewBookingItem( "D-1000111 default project", @@ -637,14 +637,14 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup .statusCode(204); // @formatter:on // then the given assets is gone - assertThat(assetRepo.findByUuid(givenAsset.getUuid())).isEmpty(); + assertThat(realAssetRepo.findByUuid(givenAsset.getUuid())).isEmpty(); } @Test void normalUser_canNotDeleteUnrelatedAsset() { context.define("superuser-alex@hostsharing.net"); final var givenAsset = givenSomeTemporaryHostingAsset(() -> - HsHostingAssetEntity.builder() + HsHostingAssetRealEntity.builder() .uuid(UUID.randomUUID()) .bookingItem(givenSomeNewBookingItem( "D-1000111 default project", @@ -670,12 +670,12 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup .statusCode(404); // @formatter:on // then the given asset is still there - assertThat(assetRepo.findByUuid(givenAsset.getUuid())).isNotEmpty(); + assertThat(realAssetRepo.findByUuid(givenAsset.getUuid())).isNotEmpty(); } } - HsHostingAssetEntity givenHostingAsset(final HsHostingAssetType type, final String identifier) { - return assetRepo.findByIdentifier(identifier).stream() + HsHostingAssetRealEntity givenRealHostingAsset(final HsHostingAssetType type, final String identifier) { + return realAssetRepo.findByIdentifier(identifier).stream() .filter(ha -> ha.getType() == type) .findAny().orElseThrow(); } @@ -721,24 +721,24 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup }).assertSuccessful().returnedValue(); } - HsHostingAssetEntity givenParentAsset(final HsHostingAssetType assetType, final String assetIdentifier) { - final var givenAsset = assetRepo.findByIdentifier(assetIdentifier).stream() + HsHostingAssetRealEntity givenParentAsset(final HsHostingAssetType assetType, final String assetIdentifier) { + final var givenAsset = realAssetRepo.findByIdentifier(assetIdentifier).stream() .filter(a -> a.getType() == assetType) .findAny().orElseThrow(); return givenAsset; } - private HsHostingAssetEntity givenSomeTemporaryHostingAsset(final Supplier newAsset) { + private HsHostingAssetRealEntity givenSomeTemporaryHostingAsset(final Supplier newAsset) { return jpaAttempt.transacted(() -> { - context.define("superuser-alex@hostsharing.net"); - return toCleanup(assetRepo.save(newAsset.get())); + context.define("superuser-alex@hostsharing.net"); // needed to determine creator + return toCleanup(realAssetRepo.save(newAsset.get())); }).assertSuccessful().returnedValue(); } - private HsOfficeContactRbacEntity givenContact() { + private HsOfficeContactRealEntity givenContact() { return jpaAttempt.transacted(() -> { - context.define("superuser-alex@hostsharing.net"); - return contactRepo.findContactByOptionalCaptionLike("second").stream().findFirst().orElseThrow(); + context.define("superuser-alex@hostsharing.net"); // needed to determine creator + return realContactRepo.findContactByOptionalCaptionLike("second").stream().findFirst().orElseThrow(); }).returnedValue(); } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerRestTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerRestTest.java index 7a382edb..9bd6b123 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerRestTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerRestTest.java @@ -30,8 +30,8 @@ import java.util.Map; import static java.util.Map.entry; import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_CLOUD_SERVER_BOOKING_ITEM; import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_SERVER_HOSTING_ASSET; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_WEBSPACE_HOSTING_ASSET; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY; import static net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealTestEntity.TEST_REAL_CONTACT; import static net.hostsharing.hsadminng.rbac.test.JsonMatcher.lenientlyEquals; import static org.assertj.core.api.Assertions.assertThat; @@ -65,12 +65,15 @@ public class HsHostingAssetControllerRestTest { private HsBookingItemRepository bookingItemRepo; @MockBean - private HsHostingAssetRepository hostingAssetRepo; + private HsHostingAssetRealRepository realAssetRepo; + + @MockBean + private HsHostingAssetRbacRepository rbacAssetRepo; enum ListTestCases { CLOUD_SERVER( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.CLOUD_SERVER) .bookingItem(TEST_CLOUD_SERVER_BOOKING_ITEM) .identifier("vm1234") @@ -96,7 +99,7 @@ public class HsHostingAssetControllerRestTest { """), MANAGED_SERVER( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.MANAGED_SERVER) .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) .identifier("vm1234") @@ -131,9 +134,9 @@ public class HsHostingAssetControllerRestTest { """), UNIX_USER( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.UNIX_USER) - .parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET) + .parentAsset(MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("xyz00-office") .caption("some fake Unix-User") .config(Map.ofEntries( @@ -165,9 +168,9 @@ public class HsHostingAssetControllerRestTest { """), EMAIL_ALIAS( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.EMAIL_ALIAS) - .parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET) + .parentAsset(MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("xyz00-office") .caption("some fake EMail-Alias") .config(Map.ofEntries( @@ -189,7 +192,7 @@ public class HsHostingAssetControllerRestTest { """), DOMAIN_SETUP( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.DOMAIN_SETUP) .identifier("example.org") .caption("some fake Domain-Setup") @@ -207,7 +210,7 @@ public class HsHostingAssetControllerRestTest { """), DOMAIN_DNS_SETUP( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.DOMAIN_DNS_SETUP) .identifier("example.org") .caption("some fake Domain-DNS-Setup") @@ -250,7 +253,7 @@ public class HsHostingAssetControllerRestTest { """), DOMAIN_HTTP_SETUP( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.DOMAIN_HTTP_SETUP) .identifier("example.org|HTTP") .caption("some fake Domain-HTTP-Setup") @@ -303,7 +306,7 @@ public class HsHostingAssetControllerRestTest { """), DOMAIN_SMTP_SETUP( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.DOMAIN_SMTP_SETUP) .identifier("example.org|SMTP") .caption("some fake Domain-SMTP-Setup") @@ -321,7 +324,7 @@ public class HsHostingAssetControllerRestTest { """), DOMAIN_MBOX_SETUP( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.DOMAIN_MBOX_SETUP) .identifier("example.org|MBOX") .caption("some fake Domain-MBOX-Setup") @@ -339,9 +342,9 @@ public class HsHostingAssetControllerRestTest { """), EMAIL_ADDRESS( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.EMAIL_ADDRESS) - .parentAsset(HsHostingAssetEntity.builder() + .parentAsset(HsHostingAssetRealEntity.builder() .type(HsHostingAssetType.DOMAIN_MBOX_SETUP) .identifier("example.org|MBOX") .caption("some fake Domain-MBOX-Setup") @@ -367,9 +370,9 @@ public class HsHostingAssetControllerRestTest { """), MARIADB_INSTANCE( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.MARIADB_INSTANCE) - .parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET) + .parentAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("vm1234|MariaDB.default") .caption("some fake MariaDB instance") .build()), @@ -386,7 +389,7 @@ public class HsHostingAssetControllerRestTest { """), MARIADB_USER( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.MARIADB_USER) .identifier("xyz00_temp") .caption("some fake MariaDB user") @@ -404,7 +407,7 @@ public class HsHostingAssetControllerRestTest { """), MARIADB_DATABASE( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.MARIADB_DATABASE) .identifier("xyz00_temp") .caption("some fake MariaDB database") @@ -429,9 +432,9 @@ public class HsHostingAssetControllerRestTest { """), PGSQL_INSTANCE( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.PGSQL_INSTANCE) - .parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET) + .parentAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("vm1234|PgSql.default") .caption("some fake PgSql instance") .build()), @@ -448,7 +451,7 @@ public class HsHostingAssetControllerRestTest { """), PGSQL_USER( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.PGSQL_USER) .identifier("xyz00_temp") .caption("some fake PgSql user") @@ -466,7 +469,7 @@ public class HsHostingAssetControllerRestTest { """), PGSQL_DATABASE( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.PGSQL_DATABASE) .identifier("xyz00_temp") .caption("some fake PgSql database") @@ -491,9 +494,9 @@ public class HsHostingAssetControllerRestTest { """), IPV4_NUMBER( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.IPV4_NUMBER) - .assignedToAsset(TEST_MANAGED_SERVER_HOSTING_ASSET) + .assignedToAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("11.12.13.14") .caption("some fake IPv4 number") .build()), @@ -510,9 +513,9 @@ public class HsHostingAssetControllerRestTest { """), IPV6_NUMBER( List.of( - HsHostingAssetEntity.builder() + HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.IPV6_NUMBER) - .assignedToAsset(TEST_MANAGED_SERVER_HOSTING_ASSET) + .assignedToAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("2001:db8:3333:4444:5555:6666:7777:8888") .caption("some fake IPv6 number") .build()), @@ -529,13 +532,13 @@ public class HsHostingAssetControllerRestTest { """); final HsHostingAssetType assetType; - final List givenHostingAssetsOfType; + final List givenHostingAssetsOfType; final String expectedResponse; final JsonNode expectedResponseJson; @SneakyThrows ListTestCases( - final List givenHostingAssetsOfType, + final List givenHostingAssetsOfType, final String expectedResponse) { this.assetType = HsHostingAssetType.valueOf(name()); this.givenHostingAssetsOfType = givenHostingAssetsOfType; @@ -561,7 +564,7 @@ public class HsHostingAssetControllerRestTest { @EnumSource(HsHostingAssetControllerRestTest.ListTestCases.class) void shouldListAssets(final HsHostingAssetControllerRestTest.ListTestCases testCase) throws Exception { // given - when(hostingAssetRepo.findAllByCriteria(null, null, testCase.assetType)) + when(rbacAssetRepo.findAllByCriteria(null, null, testCase.assetType)) .thenReturn(testCase.givenHostingAssetsOfType); // when diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcherUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcherUnitTest.java index f9e4c568..2768cbbc 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcherUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcherUnitTest.java @@ -27,7 +27,7 @@ import static org.mockito.Mockito.lenient; @ExtendWith(MockitoExtension.class) class HsHostingAssetEntityPatcherUnitTest extends PatchUnitTestBase< HsHostingAssetPatchResource, - HsHostingAssetEntity + HsHostingAssetRbacEntity > { private static final UUID INITIAL_BOOKING_ITEM_UUID = UUID.randomUUID(); @@ -60,15 +60,15 @@ class HsHostingAssetEntityPatcherUnitTest extends PatchUnitTestBase< @BeforeEach void initMocks() { - lenient().when(em.getReference(eq(HsHostingAssetEntity.class), any())).thenAnswer(invocation -> - HsHostingAssetEntity.builder().uuid(invocation.getArgument(1)).build()); + lenient().when(em.getReference(eq(HsHostingAssetRbacEntity.class), any())).thenAnswer(invocation -> + HsHostingAssetRbacEntity.builder().uuid(invocation.getArgument(1)).build()); lenient().when(em.getReference(eq(HsOfficeContactRealEntity.class), any())).thenAnswer(invocation -> HsOfficeContactRealEntity.builder().uuid(invocation.getArgument(1)).build()); } @Override - protected HsHostingAssetEntity newInitialEntity() { - final var entity = new HsHostingAssetEntity(); + protected HsHostingAssetRbacEntity newInitialEntity() { + final var entity = new HsHostingAssetRbacEntity(); entity.setUuid(INITIAL_BOOKING_ITEM_UUID); entity.setBookingItem(TEST_CLOUD_SERVER_BOOKING_ITEM); entity.getConfig().putAll(KeyValueMap.from(INITIAL_CONFIG)); @@ -83,7 +83,7 @@ class HsHostingAssetEntityPatcherUnitTest extends PatchUnitTestBase< } @Override - protected HsHostingAssetEntityPatcher createPatcher(final HsHostingAssetEntity server) { + protected HsHostingAssetEntityPatcher createPatcher(final HsHostingAssetRbacEntity server) { return new HsHostingAssetEntityPatcher(em, server); } @@ -94,19 +94,19 @@ class HsHostingAssetEntityPatcherUnitTest extends PatchUnitTestBase< "caption", HsHostingAssetPatchResource::setCaption, PATCHED_CAPTION, - HsHostingAssetEntity::setCaption), + HsHostingAssetRbacEntity::setCaption), new SimpleProperty<>( "config", HsHostingAssetPatchResource::setConfig, PATCH_CONFIG, - HsHostingAssetEntity::putConfig, + HsHostingAssetRbacEntity::putConfig, PATCHED_CONFIG) .notNullable(), new JsonNullableProperty<>( "alarmContact", HsHostingAssetPatchResource::setAlarmContactUuid, PATCHED_CONTACT_UUID, - HsHostingAssetEntity::setAlarmContact, + HsHostingAssetRbacEntity::setAlarmContact, newContact(PATCHED_CONTACT_UUID)) ); } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityUnitTest.java index cbc5c67e..b5539292 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityUnitTest.java @@ -10,7 +10,7 @@ import static org.assertj.core.api.Assertions.assertThat; class HsHostingAssetEntityUnitTest { - final HsHostingAssetEntity givenParentAsset = HsHostingAssetEntity.builder() + final HsHostingAssetRealEntity givenParentAsset = HsHostingAssetRealEntity.builder() .bookingItem(TEST_CLOUD_SERVER_BOOKING_ITEM) .type(HsHostingAssetType.MANAGED_SERVER) .identifier("vm1234") @@ -20,7 +20,7 @@ class HsHostingAssetEntityUnitTest { entry("SSD-storage", 512), entry("HDD-storage", 2048))) .build(); - final HsHostingAssetEntity givenWebspace = HsHostingAssetEntity.builder() + final HsHostingAssetRealEntity givenWebspace = HsHostingAssetRealEntity.builder() .bookingItem(TEST_CLOUD_SERVER_BOOKING_ITEM) .type(HsHostingAssetType.MANAGED_WEBSPACE) .parentAsset(givenParentAsset) @@ -31,7 +31,7 @@ class HsHostingAssetEntityUnitTest { entry("SSD-storage", 512), entry("HDD-storage", 2048))) .build(); - final HsHostingAssetEntity givenUnixUser = HsHostingAssetEntity.builder() + final HsHostingAssetRealEntity givenUnixUser = HsHostingAssetRealEntity.builder() .type(HsHostingAssetType.UNIX_USER) .parentAsset(givenWebspace) .identifier("xyz00-web") @@ -42,7 +42,7 @@ class HsHostingAssetEntityUnitTest { entry("HDD-soft-quota", 256), entry("HDD-hard-quota", 512))) .build(); - final HsHostingAssetEntity givenDomainHttpSetup = HsHostingAssetEntity.builder() + final HsHostingAssetRealEntity givenDomainHttpSetup = HsHostingAssetRealEntity.builder() .type(HsHostingAssetType.DOMAIN_HTTP_SETUP) .parentAsset(givenWebspace) .identifier("example.org") @@ -58,13 +58,13 @@ class HsHostingAssetEntityUnitTest { void toStringContainsAllPropertiesAndResourcesSortedByKey() { assertThat(givenWebspace.toString()).isEqualToIgnoringWhitespace( - "HsHostingAssetEntity(MANAGED_WEBSPACE, xyz00, some managed webspace, MANAGED_SERVER:vm1234, D-1234500:test project:test cloud server booking item, { \"CPU\": 2, \"HDD-storage\": 2048, \"SSD-storage\": 512 })"); + "HsHostingAsset(MANAGED_WEBSPACE, xyz00, some managed webspace, MANAGED_SERVER:vm1234, D-1234500:test project:test cloud server booking item, { \"CPU\": 2, \"HDD-storage\": 2048, \"SSD-storage\": 512 })"); assertThat(givenUnixUser.toString()).isEqualToIgnoringWhitespace( - "HsHostingAssetEntity(UNIX_USER, xyz00-web, some unix-user, MANAGED_WEBSPACE:xyz00, { \"HDD-hard-quota\": 512, \"HDD-soft-quota\": 256, \"SSD-hard-quota\": 256, \"SSD-soft-quota\": 128 })"); + "HsHostingAsset(UNIX_USER, xyz00-web, some unix-user, MANAGED_WEBSPACE:xyz00, { \"HDD-hard-quota\": 512, \"HDD-soft-quota\": 256, \"SSD-hard-quota\": 256, \"SSD-soft-quota\": 128 })"); assertThat(givenDomainHttpSetup.toString()).isEqualToIgnoringWhitespace( - "HsHostingAssetEntity(DOMAIN_HTTP_SETUP, example.org, some domain setup, MANAGED_WEBSPACE:xyz00, UNIX_USER:xyz00-web, { \"option-htdocsfallback\": true, \"use-fcgiphpbin\": \"/usr/lib/cgi-bin/php\", \"validsubdomainnames\": \"*\" })"); + "HsHostingAsset(DOMAIN_HTTP_SETUP, example.org, some domain setup, MANAGED_WEBSPACE:xyz00, UNIX_USER:xyz00-web, { \"option-htdocsfallback\": true, \"use-fcgiphpbin\": \"/usr/lib/cgi-bin/php\", \"validsubdomainnames\": \"*\" })"); } @Test diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepositoryIntegrationTest.java similarity index 77% rename from src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java rename to src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepositoryIntegrationTest.java index 682610de..fb963d55 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepositoryIntegrationTest.java @@ -39,10 +39,13 @@ import static org.assertj.core.api.Assertions.assertThat; @DataJpaTest @Import({ Context.class, JpaAttempt.class }) -class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanup { +class HsHostingAssetRbacRepositoryIntegrationTest extends ContextBasedTestWithCleanup { @Autowired - HsHostingAssetRepository assetRepo; + HsHostingAssetRealRepository realAssetRepo; + + @Autowired + HsHostingAssetRbacRepository rbacAssetRepo; @Autowired HsBookingItemRepository bookingItemRepo; @@ -71,34 +74,35 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu @Test public void testHostsharingAdmin_withoutAssumedRole_canCreateNewAsset() { // given - context("superuser-alex@hostsharing.net"); - final var count = assetRepo.count(); + context("superuser-alex@hostsharing.net"); // TODO.test: remove context(...) once all entities have real entities + final var count = realAssetRepo.count(); final var givenManagedServer = givenHostingAsset("D-1000111 default project", MANAGED_SERVER); final var newWebspaceBookingItem = newBookingItem(givenManagedServer.getBookingItem(), HsBookingItemType.MANAGED_WEBSPACE, "fir01"); // when final var result = attempt(em, () -> { - final var newAsset = HsHostingAssetEntity.builder() + final var newAsset = HsHostingAssetRbacEntity.builder() .bookingItem(newWebspaceBookingItem) .parentAsset(givenManagedServer) .caption("some new managed webspace") .type(MANAGED_WEBSPACE) .identifier("xyz90") .build(); - return toCleanup(assetRepo.save(newAsset)); + return toCleanup(rbacAssetRepo.save(newAsset)); }); // then result.assertSuccessful(); - assertThat(result.returnedValue()).isNotNull().extracting(HsHostingAssetEntity::getUuid).isNotNull(); + assertThat(result.returnedValue()).isNotNull().extracting(HsHostingAssetRbacEntity::getUuid).isNotNull(); assertThatAssetIsPersisted(result.returnedValue()); assertThat(result.returnedValue().isLoaded()).isFalse(); - assertThat(assetRepo.count()).isEqualTo(count + 1); + assertThat(realAssetRepo.count()).isEqualTo(count + 1); } @Test public void createsAndGrantsRoles() { // given + // TODO.test: remove context(...) once all entities have real entities context("superuser-alex@hostsharing.net", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); final var givenManagedServer = givenHostingAsset("D-1000111 default project", MANAGED_SERVER); final var newWebspaceBookingItem = newBookingItem(givenManagedServer.getBookingItem(), HsBookingItemType.MANAGED_WEBSPACE, "fir01"); @@ -107,15 +111,16 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu final var initialGrantNames = distinctGrantDisplaysOf(rawGrantRepo.findAll()); // when + context("superuser-alex@hostsharing.net", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); final var result = attempt(em, () -> { - final var newAsset = HsHostingAssetEntity.builder() + final var newAsset = HsHostingAssetRbacEntity.builder() .bookingItem(newWebspaceBookingItem) .parentAsset(givenManagedServer) .type(HsHostingAssetType.MANAGED_WEBSPACE) .identifier("fir00") .caption("some new managed webspace") .build(); - return toCleanup(assetRepo.save(newAsset)); + return toCleanup(rbacAssetRepo.save(newAsset)); }); // then @@ -163,18 +168,18 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu // when context("person-SmithPeter@example.com"); final var result = attempt(em, () -> { - final var newAsset = HsHostingAssetEntity.builder() + final var newAsset = HsHostingAssetRbacEntity.builder() .type(DOMAIN_SETUP) .identifier("example.net") .caption("some new domain setup") .build(); - return assetRepo.save(newAsset); + return rbacAssetRepo.save(newAsset); }); // then // ... the domain setup was created and returned result.assertSuccessful(); - assertThat(result.returnedValue()).isNotNull().extracting(HsHostingAssetEntity::getUuid).isNotNull(); + assertThat(result.returnedValue()).isNotNull().extracting(HsHostingAssetRbacEntity::getUuid).isNotNull(); assertThat(result.returnedValue().isLoaded()).isFalse(); // ... the creating user can read the new domain setup @@ -186,11 +191,11 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu assertThatAssetIsPersisted(result.returnedValue()); } - private void assertThatAssetIsPersisted(final HsHostingAssetEntity saved) { + private void assertThatAssetIsPersisted(final HsHostingAssetRbacEntity saved) { em.clear(); attempt(em, () -> { - final var found = assetRepo.findByUuid(saved.getUuid()); - assertThat(found).isNotEmpty().map(HsHostingAssetEntity::toString).contains(saved.toString()); + final var found = realAssetRepo.findByUuid(saved.getUuid()); + assertThat(found).isNotEmpty().map(HsHostingAsset::toString).contains(saved.toString()); }); } } @@ -204,14 +209,14 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu context("superuser-alex@hostsharing.net"); // when - final var result = assetRepo.findAllByCriteria(null, null, MANAGED_WEBSPACE); + final var result = rbacAssetRepo.findAllByCriteria(null, null, MANAGED_WEBSPACE); // then exactlyTheseAssetsAreReturned( result, - "HsHostingAssetEntity(MANAGED_WEBSPACE, sec01, some Webspace, MANAGED_SERVER:vm1012, D-1000212:D-1000212 default project:separate ManagedWebspace)", - "HsHostingAssetEntity(MANAGED_WEBSPACE, fir01, some Webspace, MANAGED_SERVER:vm1011, D-1000111:D-1000111 default project:separate ManagedWebspace)", - "HsHostingAssetEntity(MANAGED_WEBSPACE, thi01, some Webspace, MANAGED_SERVER:vm1013, D-1000313:D-1000313 default project:separate ManagedWebspace)"); + "HsHostingAsset(MANAGED_WEBSPACE, sec01, some Webspace, MANAGED_SERVER:vm1012, D-1000212:D-1000212 default project:separate ManagedWebspace)", + "HsHostingAsset(MANAGED_WEBSPACE, fir01, some Webspace, MANAGED_SERVER:vm1011, D-1000111:D-1000111 default project:separate ManagedWebspace)", + "HsHostingAsset(MANAGED_WEBSPACE, thi01, some Webspace, MANAGED_SERVER:vm1013, D-1000313:D-1000313 default project:separate ManagedWebspace)"); } @Test @@ -222,33 +227,32 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu .findAny().orElseThrow().getUuid(); // when: - final var result = assetRepo.findAllByCriteria(projectUuid, null, null); + final var result = rbacAssetRepo.findAllByCriteria(projectUuid, null, null); // then: exactlyTheseAssetsAreReturned( result, - "HsHostingAssetEntity(MANAGED_WEBSPACE, fir01, some Webspace, MANAGED_SERVER:vm1011, D-1000111:D-1000111 default project:separate ManagedWebspace)", - "HsHostingAssetEntity(MANAGED_SERVER, vm1011, some ManagedServer, D-1000111:D-1000111 default project:separate ManagedServer, { monit_max_cpu_usage : 90, monit_max_ram_usage : 80, monit_max_ssd_usage : 70 })"); + "HsHostingAsset(MANAGED_WEBSPACE, fir01, some Webspace, MANAGED_SERVER:vm1011, D-1000111:D-1000111 default project:separate ManagedWebspace)", + "HsHostingAsset(MANAGED_SERVER, vm1011, some ManagedServer, D-1000111:D-1000111 default project:separate ManagedServer, { monit_max_cpu_usage : 90, monit_max_ram_usage : 80, monit_max_ssd_usage : 70 })"); } @Test public void managedServerAgent_canFindAssetsRelatedToManagedServer() { // given - context("superuser-alex@hostsharing.net"); - final var parentAssetUuid = assetRepo.findByIdentifier("vm1012").stream() + final var parentAssetUuid = realAssetRepo.findByIdentifier("vm1012").stream() .filter(ha -> ha.getType() == MANAGED_SERVER) .findAny().orElseThrow().getUuid(); // when context("superuser-alex@hostsharing.net", "hs_hosting_asset#vm1012:AGENT"); - final var result = assetRepo.findAllByCriteria(null, parentAssetUuid, null); + final var result = rbacAssetRepo.findAllByCriteria(null, parentAssetUuid, null); // then exactlyTheseAssetsAreReturned( result, - "HsHostingAssetEntity(MANAGED_WEBSPACE, sec01, some Webspace, MANAGED_SERVER:vm1012, D-1000212:D-1000212 default project:separate ManagedWebspace)", - "HsHostingAssetEntity(MARIADB_INSTANCE, vm1012.MariaDB.default, some default MariaDB instance, MANAGED_SERVER:vm1012)", - "HsHostingAssetEntity(PGSQL_INSTANCE, vm1012.Postgresql.default, some default Postgresql instance, MANAGED_SERVER:vm1012)"); + "HsHostingAsset(MANAGED_WEBSPACE, sec01, some Webspace, MANAGED_SERVER:vm1012, D-1000212:D-1000212 default project:separate ManagedWebspace)", + "HsHostingAsset(MARIADB_INSTANCE, vm1012.MariaDB.default, some default MariaDB instance, MANAGED_SERVER:vm1012)", + "HsHostingAsset(PGSQL_INSTANCE, vm1012.Postgresql.default, some default Postgresql instance, MANAGED_SERVER:vm1012)"); } @Test @@ -258,12 +262,12 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu // when context("superuser-alex@hostsharing.net", "hs_hosting_asset#sec01:AGENT"); - final var result = assetRepo.findAllByCriteria(null, null, EMAIL_ADDRESS); + final var result = rbacAssetRepo.findAllByCriteria(null, null, EMAIL_ADDRESS); // then exactlyTheseAssetsAreReturned( result, - "HsHostingAssetEntity(EMAIL_ADDRESS, test@sec.example.org, some E-Mail-Address, DOMAIN_MBOX_SETUP:sec.example.org|MBOX)"); + "HsHostingAsset(EMAIL_ADDRESS, test@sec.example.org, some E-Mail-Address, DOMAIN_MBOX_SETUP:sec.example.org|MBOX)"); } } @@ -278,25 +282,24 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu // when final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - final var foundAsset = em.find(HsHostingAssetEntity.class, givenAssetUuid); + final var foundAsset = em.find(HsHostingAssetRbacEntity.class, givenAssetUuid); foundAsset.getConfig().put("CPU", 2); foundAsset.getConfig().remove("SSD-storage"); foundAsset.getConfig().put("HSD-storage", 2048); - return toCleanup(assetRepo.save(foundAsset)); + return toCleanup(rbacAssetRepo.save(foundAsset)); }); // then result.assertSuccessful(); jpaAttempt.transacted(() -> { - context("superuser-alex@hostsharing.net"); assertThatAssetActuallyInDatabase(result.returnedValue()); }).assertSuccessful(); } - private void assertThatAssetActuallyInDatabase(final HsHostingAssetEntity saved) { - final var found = assetRepo.findByUuid(saved.getUuid()); + private void assertThatAssetActuallyInDatabase(final HsHostingAssetRbacEntity saved) { + final var found = realAssetRepo.findByUuid(saved.getUuid()); assertThat(found).isNotEmpty().get().isNotSameAs(saved) - .extracting(HsHostingAssetEntity::getVersion).isEqualTo(saved.getVersion()); + .extracting(HsHostingAsset::getVersion).isEqualTo(saved.getVersion()); } } @@ -312,51 +315,47 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu // when final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - assetRepo.deleteByUuid(givenAsset.getUuid()); + rbacAssetRepo.deleteByUuid(givenAsset.getUuid()); }); // then result.assertSuccessful(); assertThat(jpaAttempt.transacted(() -> { - context("superuser-fran@hostsharing.net", null); - return assetRepo.findByUuid(givenAsset.getUuid()); + return realAssetRepo.findByUuid(givenAsset.getUuid()); }).assertSuccessful().returnedValue()).isEmpty(); } @Test public void relatedOwner_canDeleteTheirRelatedAsset() { // given - context("superuser-alex@hostsharing.net", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); final var givenAsset = givenSomeTemporaryAsset("D-1000111 default project", "vm1000"); // when final var result = jpaAttempt.transacted(() -> { context("person-FirbySusan@example.com", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); - assertThat(assetRepo.findByUuid(givenAsset.getUuid())).isPresent(); + assertThat(rbacAssetRepo.findByUuid(givenAsset.getUuid())).isPresent(); - assetRepo.deleteByUuid(givenAsset.getUuid()); + rbacAssetRepo.deleteByUuid(givenAsset.getUuid()); }); // then result.assertSuccessful(); assertThat(jpaAttempt.transacted(() -> { - context("superuser-fran@hostsharing.net", null); - return assetRepo.findByUuid(givenAsset.getUuid()); + return realAssetRepo.findByUuid(givenAsset.getUuid()); }).assertSuccessful().returnedValue()).isEmpty(); } @Test public void relatedAdmin_canNotDeleteTheirRelatedAsset() { // given - context("superuser-alex@hostsharing.net", null); final var givenAsset = givenSomeTemporaryAsset("D-1000111 default project", "vm1000"); // when final var result = jpaAttempt.transacted(() -> { context("person-FirbySusan@example.com", "hs_hosting_asset#vm1000:ADMIN"); - assertThat(assetRepo.findByUuid(givenAsset.getUuid())).isPresent(); + assertThat(rbacAssetRepo.findByUuid(givenAsset.getUuid())).isPresent(); - assetRepo.deleteByUuid(givenAsset.getUuid()); + rbacAssetRepo.deleteByUuid(givenAsset.getUuid()); }); // then @@ -364,15 +363,13 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu JpaSystemException.class, "[403] Subject ", " is not allowed to delete hs_hosting_asset"); assertThat(jpaAttempt.transacted(() -> { - context("superuser-alex@hostsharing.net"); - return assetRepo.findByUuid(givenAsset.getUuid()); + return realAssetRepo.findByUuid(givenAsset.getUuid()); }).assertSuccessful().returnedValue()).isPresent(); // still there } @Test public void deletingAnAssetAlsoDeletesRelatedRolesAndGrants() { // given - context("superuser-alex@hostsharing.net"); final var initialRoleNames = Array.from(distinctRoleNamesOf(rawRoleRepo.findAll())); final var initialGrantNames = Array.from(distinctGrantDisplaysOf(rawGrantRepo.findAll())); final var givenAsset = givenSomeTemporaryAsset("D-1000111 default project", "vm1000"); @@ -380,7 +377,7 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu // when final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - return assetRepo.deleteByUuid(givenAsset.getUuid()); + return rbacAssetRepo.deleteByUuid(givenAsset.getUuid()); }); // then @@ -398,7 +395,7 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu select currentTask, targetTable, targetOp from tx_journal_v where targettable = 'hs_hosting_asset'; - """); + """); // when @SuppressWarnings("unchecked") final List customerLogEntries = query.getResultList(); @@ -410,21 +407,21 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu "[creating hosting-asset test-data D-1000313 default project, hs_hosting_asset, INSERT]"); } - private HsHostingAssetEntity givenSomeTemporaryAsset(final String projectCaption, final String identifier) { + private HsHostingAssetRealEntity givenSomeTemporaryAsset(final String projectCaption, final String identifier) { return jpaAttempt.transacted(() -> { - context("superuser-alex@hostsharing.net"); + context("superuser-alex@hostsharing.net"); // needed to determine creator final var givenBookingItem = givenBookingItem("D-1000111 default project", "test CloudServer"); - final var newAsset = HsHostingAssetEntity.builder() + final var newAsset = HsHostingAssetRealEntity.builder() .bookingItem(givenBookingItem) .type(CLOUD_SERVER) .identifier(identifier) - .caption("some temp cloud asset") + .caption(projectCaption) .config(Map.ofEntries( entry("CPU", 1), entry("SSD-storage", 256))) .build(); - return toCleanup(assetRepo.save(newAsset)); + return toCleanup(realAssetRepo.save(newAsset)); }).assertSuccessful().returnedValue(); } @@ -434,10 +431,10 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu .findAny().orElseThrow(); } - HsHostingAssetEntity givenHostingAsset(final String projectCaption, final HsHostingAssetType type) { + HsHostingAssetRealEntity givenHostingAsset(final String projectCaption, final HsHostingAssetType type) { final var givenProject = projectRepo.findByCaption(projectCaption).stream() .findAny().orElseThrow(); - return assetRepo.findAllByCriteria(givenProject.getUuid(), null, type).stream() + return realAssetRepo.findAllByCriteria(givenProject.getUuid(), null, type).stream() .findAny().orElseThrow(); } @@ -454,10 +451,10 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu } void exactlyTheseAssetsAreReturned( - final List actualResult, + final List actualResult, final String... serverNames) { assertThat(actualResult) - .extracting(HsHostingAssetEntity::toString) + .extracting(HsHostingAssetRbacEntity::toString) .extracting(input -> input.replaceAll("\\s+", " ")) .extracting(input -> input.replaceAll("\"", "")) .extracting(input -> input.replaceAll("\" : ", "\": ")) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetTestEntities.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetTestEntities.java new file mode 100644 index 00000000..f85fbcb6 --- /dev/null +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetTestEntities.java @@ -0,0 +1,36 @@ +package net.hostsharing.hsadminng.hs.hosting.asset; + +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_WEBSPACE_BOOKING_ITEM; + +public class HsHostingAssetTestEntities { + + public static final HsHostingAssetRbacEntity MANAGED_SERVER_HOSTING_ASSET_RBAC_TEST_ENTITY = HsHostingAssetRbacEntity.builder() + .type(HsHostingAssetType.MANAGED_SERVER) + .identifier("vm1234") + .caption("some managed server") + .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) + .build(); + + public static final HsHostingAssetRealEntity MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY = HsHostingAssetRealEntity.builder() + .type(HsHostingAssetType.MANAGED_SERVER) + .identifier("vm1234") + .caption("some managed server") + .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) + .build(); + + public static final HsHostingAssetRbacEntity MANAGED_WEBSPACE_HOSTING_ASSET_RBAC_TEST_ENTITY = HsHostingAssetRbacEntity.builder() + .type(HsHostingAssetType.MANAGED_WEBSPACE) + .identifier("xyz00") + .caption("some managed webspace") + .bookingItem(TEST_MANAGED_WEBSPACE_BOOKING_ITEM) + .build(); + + public static final HsHostingAssetRealEntity MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY = HsHostingAssetRealEntity.builder() + .type(HsHostingAssetType.MANAGED_WEBSPACE) + .identifier("xyz00") + .caption("some managed webspace") + .bookingItem(TEST_MANAGED_WEBSPACE_BOOKING_ITEM) + .build(); + +} diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/TestHsHostingAssetEntities.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/TestHsHostingAssetEntities.java deleted file mode 100644 index e409306b..00000000 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/TestHsHostingAssetEntities.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.hostsharing.hsadminng.hs.hosting.asset; - -import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; -import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_WEBSPACE_BOOKING_ITEM; - -public class TestHsHostingAssetEntities { - - public static final HsHostingAssetEntity TEST_MANAGED_SERVER_HOSTING_ASSET = HsHostingAssetEntity.builder() - .type(HsHostingAssetType.MANAGED_SERVER) - .identifier("vm1234") - .caption("some managed server") - .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) - .build(); - - public static final HsHostingAssetEntity TEST_MANAGED_WEBSPACE_HOSTING_ASSET = HsHostingAssetEntity.builder() - .type(HsHostingAssetType.MANAGED_WEBSPACE) - .identifier("xyz00") - .caption("some managed webspace") - .bookingItem(TEST_MANAGED_WEBSPACE_BOOKING_ITEM) - .build(); - -} diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidatorUnitTest.java index b7e3516a..6dd21fb8 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidatorUnitTest.java @@ -2,7 +2,8 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import org.junit.jupiter.api.Test; import java.util.Map; @@ -18,7 +19,7 @@ class HsCloudServerHostingAssetValidatorUnitTest { @Test void validatesProperties() { // given - final var cloudServerHostingAssetEntity = HsHostingAssetEntity.builder() + final var cloudServerHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(CLOUD_SERVER) .identifier("vm1234") .config(Map.ofEntries( @@ -40,7 +41,7 @@ class HsCloudServerHostingAssetValidatorUnitTest { @Test void validatesInvalidIdentifier() { // given - final var cloudServerHostingAssetEntity = HsHostingAssetEntity.builder() + final var cloudServerHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(CLOUD_SERVER) .identifier("xyz99") .bookingItem(TEST_CLOUD_SERVER_BOOKING_ITEM) @@ -68,7 +69,7 @@ class HsCloudServerHostingAssetValidatorUnitTest { @Test void validatesBookingItemType() { // given - final var mangedServerHostingAssetEntity = HsHostingAssetEntity.builder() + final var mangedServerHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_SERVER) .identifier("xyz00") .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) @@ -86,12 +87,12 @@ class HsCloudServerHostingAssetValidatorUnitTest { @Test void rejectsInvalidReferencedEntities() { // given - final var mangedServerHostingAssetEntity = HsHostingAssetEntity.builder() + final var mangedServerHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(CLOUD_SERVER) .identifier("vm1234") .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) - .parentAsset(HsHostingAssetEntity.builder().type(MANAGED_SERVER).build()) - .assignedToAsset(HsHostingAssetEntity.builder().type(CLOUD_SERVER).build()) + .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_SERVER).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(CLOUD_SERVER).build()) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java index a907dc60..3be5fbe4 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java @@ -2,8 +2,8 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.mapper.Array; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -12,9 +12,9 @@ import java.util.ArrayList; import java.util.Map; import static java.util.Map.entry; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_DNS_SETUP; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_SETUP; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_WEBSPACE_HOSTING_ASSET; import static net.hostsharing.hsadminng.hs.hosting.asset.validators.HsDomainDnsSetupHostingAssetValidator.RR_COMMENT; import static net.hostsharing.hsadminng.hs.hosting.asset.validators.HsDomainDnsSetupHostingAssetValidator.RR_RECORD_DATA; import static net.hostsharing.hsadminng.hs.hosting.asset.validators.HsDomainDnsSetupHostingAssetValidator.RR_RECORD_TYPE; @@ -25,16 +25,16 @@ import static org.assertj.core.api.Assertions.assertThat; class HsDomainDnsSetupHostingAssetValidatorUnitTest { - static final HsHostingAssetEntity validDomainSetupEntity = HsHostingAssetEntity.builder() + static final HsHostingAssetRealEntity validDomainSetupEntity = HsHostingAssetRealEntity.builder() .type(DOMAIN_SETUP) .identifier("example.org") .build(); - static HsHostingAssetEntityBuilder validEntityBuilder() { - return HsHostingAssetEntity.builder() + static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder validEntityBuilder() { + return HsHostingAssetRbacEntity.builder() .type(DOMAIN_DNS_SETUP) .parentAsset(validDomainSetupEntity) - .assignedToAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET) + .assignedToAsset(MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("example.org|DNS") .config(Map.ofEntries( entry("TTL", 21600), @@ -141,7 +141,7 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest { final var mangedServerHostingAssetEntity = validEntityBuilder() .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) .parentAsset(null) - .assignedToAsset(HsHostingAssetEntity.builder().type(DOMAIN_SETUP).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(DOMAIN_SETUP).build()) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainHttpSetupHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainHttpSetupHostingAssetValidatorUnitTest.java index d15f81a5..6bd5e536 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainHttpSetupHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainHttpSetupHostingAssetValidatorUnitTest.java @@ -2,8 +2,8 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.mapper.Array; import org.junit.jupiter.api.Test; @@ -18,16 +18,16 @@ import static org.assertj.core.api.Assertions.assertThat; class HsDomainHttpSetupHostingAssetValidatorUnitTest { - static final HsHostingAssetEntity validDomainSetupEntity = HsHostingAssetEntity.builder() + static final HsHostingAssetRealEntity validDomainSetupEntity = HsHostingAssetRealEntity.builder() .type(DOMAIN_SETUP) .identifier("example.org") .build(); - static HsHostingAssetEntityBuilder validEntityBuilder() { - return HsHostingAssetEntity.builder() + static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder validEntityBuilder() { + return HsHostingAssetRbacEntity.builder() .type(DOMAIN_HTTP_SETUP) .parentAsset(validDomainSetupEntity) - .assignedToAsset(HsHostingAssetEntity.builder().type(UNIX_USER).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(UNIX_USER).build()) .identifier("example.org|HTTP") .config(Map.ofEntries( entry("passenger-errorpage", true), @@ -110,7 +110,7 @@ class HsDomainHttpSetupHostingAssetValidatorUnitTest { // given final var mangedServerHostingAssetEntity = validEntityBuilder() .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) - .parentAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).build()) + .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .assignedToAsset(null) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainMboxHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainMboxHostingAssetValidatorUnitTest.java index 2c08d16f..e8940f13 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainMboxHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainMboxHostingAssetValidatorUnitTest.java @@ -2,8 +2,8 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import org.junit.jupiter.api.Test; import java.util.Map; @@ -16,16 +16,16 @@ import static org.assertj.core.api.Assertions.assertThat; class HsDomainMboxHostingAssetValidatorUnitTest { - static final HsHostingAssetEntity validDomainSetupEntity = HsHostingAssetEntity.builder() + static final HsHostingAssetRealEntity validDomainSetupEntity = HsHostingAssetRealEntity.builder() .type(DOMAIN_SETUP) .identifier("example.org") .build(); - static HsHostingAssetEntityBuilder validEntityBuilder() { - return HsHostingAssetEntity.builder() + static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder validEntityBuilder() { + return HsHostingAssetRbacEntity.builder() .type(DOMAIN_MBOX_SETUP) .parentAsset(validDomainSetupEntity) - .assignedToAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .identifier("example.org|MBOX"); } @@ -85,7 +85,7 @@ class HsDomainMboxHostingAssetValidatorUnitTest { // given final var mangedServerHostingAssetEntity = validEntityBuilder() .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) - .parentAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).build()) + .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .assignedToAsset(null) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidatorUnitTest.java index f7f88eb5..42e2ce66 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidatorUnitTest.java @@ -2,8 +2,8 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; @@ -17,8 +17,8 @@ import static org.assertj.core.api.Assertions.assertThat; class HsDomainSetupHostingAssetValidatorUnitTest { - static HsHostingAssetEntityBuilder validEntityBuilder() { - return HsHostingAssetEntity.builder() + static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder validEntityBuilder() { + return HsHostingAssetRbacEntity.builder() .type(DOMAIN_SETUP) .identifier("example.org"); } @@ -94,8 +94,8 @@ class HsDomainSetupHostingAssetValidatorUnitTest { void validatesReferencedEntities() { // given final var mangedServerHostingAssetEntity = validEntityBuilder() - .parentAsset(HsHostingAssetEntity.builder().type(CLOUD_SERVER).build()) - .assignedToAsset(HsHostingAssetEntity.builder().type(MANAGED_SERVER).build()) + .parentAsset(HsHostingAssetRealEntity.builder().type(CLOUD_SERVER).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(MANAGED_SERVER).build()) .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSmtpSetupHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSmtpSetupHostingAssetValidatorUnitTest.java index 014fb9ef..8d87298e 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSmtpSetupHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSmtpSetupHostingAssetValidatorUnitTest.java @@ -2,8 +2,9 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import org.junit.jupiter.api.Test; import java.util.Map; @@ -16,16 +17,16 @@ import static org.assertj.core.api.Assertions.assertThat; class HsDomainSmtpSetupHostingAssetValidatorUnitTest { - static final HsHostingAssetEntity validDomainSetupEntity = HsHostingAssetEntity.builder() + static final HsHostingAssetRealEntity validDomainSetupEntity = HsHostingAssetRealEntity.builder() .type(DOMAIN_SETUP) .identifier("example.org") .build(); - static HsHostingAssetEntityBuilder validEntityBuilder() { - return HsHostingAssetEntity.builder() + static HsHostingAssetRbacEntityBuilder validEntityBuilder() { + return HsHostingAssetRbacEntity.builder() .type(DOMAIN_SMTP_SETUP) .parentAsset(validDomainSetupEntity) - .assignedToAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .identifier("example.org|SMTP"); } @@ -85,7 +86,7 @@ class HsDomainSmtpSetupHostingAssetValidatorUnitTest { // given final var mangedServerHostingAssetEntity = validEntityBuilder() .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) - .parentAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).build()) + .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .assignedToAsset(null) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidatorUnitTest.java index 386ba632..8d27b9df 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidatorUnitTest.java @@ -1,6 +1,7 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.mapper.Array; import org.junit.jupiter.api.Test; @@ -9,25 +10,25 @@ import java.util.Map; import static java.util.Map.ofEntries; import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_MBOX_SETUP; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.EMAIL_ADDRESS; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_SERVER_HOSTING_ASSET; import static net.hostsharing.hsadminng.mapper.PatchableMapWrapper.entry; import static org.assertj.core.api.Assertions.assertThat; class HsEMailAddressHostingAssetValidatorUnitTest { - final static HsHostingAssetEntity domainSetup = HsHostingAssetEntity.builder() + final static HsHostingAssetRealEntity domainSetup = HsHostingAssetRealEntity.builder() .type(DOMAIN_MBOX_SETUP) .identifier("example.org") .build(); - final static HsHostingAssetEntity domainMboxSetup = HsHostingAssetEntity.builder() + final static HsHostingAssetRealEntity domainMboxSetup = HsHostingAssetRealEntity.builder() .type(DOMAIN_MBOX_SETUP) .identifier("example.org|MBOX") .parentAsset(domainSetup) .build(); - static HsHostingAssetEntity.HsHostingAssetEntityBuilder validEntityBuilder() { - return HsHostingAssetEntity.builder() + static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder validEntityBuilder() { + return HsHostingAssetRbacEntity.builder() .type(EMAIL_ADDRESS) .parentAsset(domainMboxSetup) .identifier("old-local-part@example.org") @@ -174,8 +175,8 @@ class HsEMailAddressHostingAssetValidatorUnitTest { // given final var emailAddressHostingAssetEntity = validEntityBuilder() .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) - .parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET) - .assignedToAsset(TEST_MANAGED_SERVER_HOSTING_ASSET) + .parentAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) + .assignedToAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(emailAddressHostingAssetEntity.getType()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAliasHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAliasHostingAssetValidatorUnitTest.java index 87e7cc2e..6c197d07 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAliasHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAliasHostingAssetValidatorUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.mapper.Array; import org.junit.jupiter.api.Test; @@ -8,9 +8,9 @@ import java.util.Map; import static java.util.Map.entry; import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.EMAIL_ALIAS; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_SERVER_HOSTING_ASSET; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_WEBSPACE_HOSTING_ASSET; import static org.assertj.core.api.Assertions.assertThat; class HsEMailAliasHostingAssetValidatorUnitTest { @@ -28,9 +28,9 @@ class HsEMailAliasHostingAssetValidatorUnitTest { @Test void acceptsValidEntity() { // given - final var emailAliasHostingAssetEntity = HsHostingAssetEntity.builder() + final var emailAliasHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(EMAIL_ALIAS) - .parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET) + .parentAsset(MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("xyz00-office") .config(Map.ofEntries( entry("target", Array.of( @@ -54,9 +54,9 @@ class HsEMailAliasHostingAssetValidatorUnitTest { @Test void rejectsInvalidConfig() { // given - final var emailAliasHostingAssetEntity = HsHostingAssetEntity.builder() + final var emailAliasHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(EMAIL_ALIAS) - .parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET) + .parentAsset(MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("xyz00-office") .config(Map.ofEntries( entry("target", Array.of( @@ -83,9 +83,9 @@ class HsEMailAliasHostingAssetValidatorUnitTest { @Test void rejectsEmptyTargetArray() { // given - final var emailAliasHostingAssetEntity = HsHostingAssetEntity.builder() + final var emailAliasHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(EMAIL_ALIAS) - .parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET) + .parentAsset(MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("xyz00-office") .config(Map.ofEntries( entry("target", new String[0]) @@ -104,9 +104,9 @@ class HsEMailAliasHostingAssetValidatorUnitTest { @Test void rejectsInvalidIndentifier() { // given - final var emailAliasHostingAssetEntity = HsHostingAssetEntity.builder() + final var emailAliasHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(EMAIL_ALIAS) - .parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET) + .parentAsset(MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("abc00-office") .config(Map.ofEntries( entry("target", Array.of("office@example.com")) @@ -125,11 +125,11 @@ class HsEMailAliasHostingAssetValidatorUnitTest { @Test void validatesInvalidReferences() { // given - final var emailAliasHostingAssetEntity = HsHostingAssetEntity.builder() + final var emailAliasHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(EMAIL_ALIAS) .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) - .parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET) - .assignedToAsset(TEST_MANAGED_SERVER_HOSTING_ASSET) + .parentAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) + .assignedToAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("abc00-office") .config(Map.ofEntries( entry("target", Array.of("office@example.com")) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv4NumberHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv4NumberHostingAssetValidatorUnitTest.java index 0d219ad2..6361dfb2 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv4NumberHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv4NumberHostingAssetValidatorUnitTest.java @@ -2,8 +2,8 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -20,8 +20,8 @@ import static org.assertj.core.api.Assertions.assertThat; class HsIPv4NumberHostingAssetValidatorUnitTest { - static HsHostingAssetEntityBuilder validEntityBuilder() { - return HsHostingAssetEntity.builder() + static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder validEntityBuilder() { + return HsHostingAssetRbacEntity.builder() .type(IPV4_NUMBER) .identifier("83.223.95.145"); } @@ -69,7 +69,7 @@ class HsIPv4NumberHostingAssetValidatorUnitTest { void acceptsValidReferencedEntity(final HsHostingAssetType givenAssignedToAssetType) { // given final var ipNumberHostingAssetEntity = validEntityBuilder() - .assignedToAsset(HsHostingAssetEntity.builder().type(givenAssignedToAssetType).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(givenAssignedToAssetType).build()) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(ipNumberHostingAssetEntity.getType()); @@ -85,8 +85,8 @@ class HsIPv4NumberHostingAssetValidatorUnitTest { // given final var ipNumberHostingAssetEntity = validEntityBuilder() .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) - .parentAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).build()) - .assignedToAsset(HsHostingAssetEntity.builder().type(UNIX_USER).build()) + .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(UNIX_USER).build()) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(ipNumberHostingAssetEntity.getType()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv6NumberHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv6NumberHostingAssetValidatorUnitTest.java index 51d86986..28220641 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv6NumberHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv6NumberHostingAssetValidatorUnitTest.java @@ -2,8 +2,8 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -20,8 +20,8 @@ import static org.assertj.core.api.Assertions.assertThat; class HsIPv6NumberHostingAssetValidatorUnitTest { - static HsHostingAssetEntityBuilder validEntityBuilder() { - return HsHostingAssetEntity.builder() + static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder validEntityBuilder() { + return HsHostingAssetRbacEntity.builder() .type(IPV6_NUMBER) .identifier("2001:db8:3333:4444:5555:6666:7777:8888"); } @@ -69,7 +69,7 @@ class HsIPv6NumberHostingAssetValidatorUnitTest { void acceptsValidReferencedEntity(final HsHostingAssetType givenAssignedToAssetType) { // given final var ipNumberHostingAssetEntity = validEntityBuilder() - .assignedToAsset(HsHostingAssetEntity.builder().type(givenAssignedToAssetType).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(givenAssignedToAssetType).build()) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(ipNumberHostingAssetEntity.getType()); @@ -85,8 +85,8 @@ class HsIPv6NumberHostingAssetValidatorUnitTest { // given final var ipNumberHostingAssetEntity = validEntityBuilder() .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) - .parentAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).build()) - .assignedToAsset(HsHostingAssetEntity.builder().type(UNIX_USER).build()) + .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(UNIX_USER).build()) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(ipNumberHostingAssetEntity.getType()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidatorUnitTest.java index 67ff4db5..22d9aa54 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidatorUnitTest.java @@ -2,7 +2,8 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import org.junit.jupiter.api.Test; import java.util.Map; @@ -19,12 +20,12 @@ class HsManagedServerHostingAssetValidatorUnitTest { @Test void validatesProperties() { // given - final var mangedWebspaceHostingAssetEntity = HsHostingAssetEntity.builder() + final var mangedWebspaceHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_SERVER) .identifier("vm1234") .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) - .parentAsset(HsHostingAssetEntity.builder().type(CLOUD_SERVER).build()) - .assignedToAsset(HsHostingAssetEntity.builder().type(CLOUD_SERVER).build()) + .parentAsset(HsHostingAssetRealEntity.builder().type(CLOUD_SERVER).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(CLOUD_SERVER).build()) .config(Map.ofEntries( entry("monit_max_hdd_usage", "90"), entry("monit_max_cpu_usage", 2), @@ -48,7 +49,7 @@ class HsManagedServerHostingAssetValidatorUnitTest { @Test void validatesInvalidIdentifier() { // given - final var mangedServerHostingAssetEntity = HsHostingAssetEntity.builder() + final var mangedServerHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_SERVER) .identifier("xyz00") .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.MANAGED_SERVER).build()) @@ -66,12 +67,12 @@ class HsManagedServerHostingAssetValidatorUnitTest { @Test void rejectsInvalidReferencedEntities() { // given - final var mangedServerHostingAssetEntity = HsHostingAssetEntity.builder() + final var mangedServerHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_SERVER) .identifier("xyz00") .bookingItem(TEST_CLOUD_SERVER_BOOKING_ITEM) - .parentAsset(HsHostingAssetEntity.builder().type(CLOUD_SERVER).build()) - .assignedToAsset(HsHostingAssetEntity.builder().type(MANAGED_SERVER).build()) + .parentAsset(HsHostingAssetRealEntity.builder().type(CLOUD_SERVER).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(MANAGED_SERVER).build()) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java index 02384389..3047d7ab 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java @@ -2,7 +2,8 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; import org.junit.jupiter.api.Test; @@ -35,7 +36,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { .caption("Test Cloud-Server") .build(); - final HsHostingAssetEntity mangedServerAssetEntity = HsHostingAssetEntity.builder() + final HsHostingAssetRealEntity mangedServerAssetEntity = HsHostingAssetRealEntity.builder() .type(HsHostingAssetType.MANAGED_SERVER) .bookingItem(managedServerBookingItem) .identifier("vm1234") @@ -45,7 +46,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { entry("monit_max_ram_usage", 90) )) .build(); - final HsHostingAssetEntity cloudServerAssetEntity = HsHostingAssetEntity.builder() + final HsHostingAssetRealEntity cloudServerAssetEntity = HsHostingAssetRealEntity.builder() .type(HsHostingAssetType.CLOUD_SERVER) .bookingItem(cloudServerBookingItem) .identifier("vm1234") @@ -60,7 +61,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { void acceptsAlienIdentifierPrefixForPreExistingEntity() { // given final var validator = HostingAssetEntityValidatorRegistry.forType(MANAGED_WEBSPACE); - final var mangedWebspaceHostingAssetEntity = HsHostingAssetEntity.builder() + final var mangedWebspaceHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_WEBSPACE) .bookingItem(HsBookingItemEntity.builder() .type(HsBookingItemType.MANAGED_WEBSPACE) @@ -82,7 +83,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { void validatesIdentifierAndReferencedEntities() { // given final var validator = HostingAssetEntityValidatorRegistry.forType(MANAGED_WEBSPACE); - final var mangedWebspaceHostingAssetEntity = HsHostingAssetEntity.builder() + final var mangedWebspaceHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_WEBSPACE) .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.MANAGED_WEBSPACE).build()) .parentAsset(mangedServerAssetEntity) @@ -100,7 +101,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { void validatesUnknownProperties() { // given final var validator = HostingAssetEntityValidatorRegistry.forType(MANAGED_WEBSPACE); - final var mangedWebspaceHostingAssetEntity = HsHostingAssetEntity.builder() + final var mangedWebspaceHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_WEBSPACE) .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.MANAGED_WEBSPACE).build()) .parentAsset(mangedServerAssetEntity) @@ -121,7 +122,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { void validatesValidEntity() { // given final var validator = HostingAssetEntityValidatorRegistry.forType(MANAGED_WEBSPACE); - final var mangedWebspaceHostingAssetEntity = HsHostingAssetEntity.builder() + final var mangedWebspaceHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_WEBSPACE) .bookingItem(HsBookingItemEntity.builder() .type(HsBookingItemType.MANAGED_WEBSPACE) @@ -147,7 +148,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { void rejectsInvalidEntityReferences() { // given final var validator = HostingAssetEntityValidatorRegistry.forType(MANAGED_WEBSPACE); - final var mangedWebspaceHostingAssetEntity = HsHostingAssetEntity.builder() + final var mangedWebspaceHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_WEBSPACE) .bookingItem(HsBookingItemEntity.builder() .type(HsBookingItemType.MANAGED_SERVER) @@ -155,7 +156,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { .resources(Map.ofEntries(entry("SSD", 25), entry("Traffic", 250))) .build()) .parentAsset(cloudServerAssetEntity) - .assignedToAsset(HsHostingAssetEntity.builder().type(CLOUD_SERVER).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(CLOUD_SERVER).build()) .identifier("abc00") .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbDatabaseHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbDatabaseHostingAssetValidatorUnitTest.java index 7e7c8b5b..33982abc 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbDatabaseHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbDatabaseHostingAssetValidatorUnitTest.java @@ -1,33 +1,33 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import org.junit.jupiter.api.Test; import java.util.HashMap; import java.util.stream.Stream; import static java.util.Map.ofEntries; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MARIADB_DATABASE; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MARIADB_INSTANCE; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MARIADB_USER; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_SERVER_HOSTING_ASSET; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_WEBSPACE_HOSTING_ASSET; import static net.hostsharing.hsadminng.mapper.PatchMap.entry; import static org.assertj.core.api.Assertions.assertThat; class HsMariaDbDatabaseHostingAssetValidatorUnitTest { - private static final HsHostingAssetEntity GIVEN_MARIADB_INSTANCE = HsHostingAssetEntity.builder() + private static final HsHostingAssetRealEntity GIVEN_MARIADB_INSTANCE = HsHostingAssetRealEntity.builder() .type(MARIADB_INSTANCE) - .parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET) + .parentAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("vm1234|MariaDB.default") .caption("some valid test MariaDB-Instance") .build(); - private static final HsHostingAssetEntity GIVEN_MARIADB_USER = HsHostingAssetEntity.builder() + private static final HsHostingAssetRealEntity GIVEN_MARIADB_USER = HsHostingAssetRealEntity.builder() .type(MARIADB_USER) - .parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET) + .parentAsset(MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY) .assignedToAsset(GIVEN_MARIADB_INSTANCE) .identifier("xyz00_temp") .caption("some valid test MariaDB-User") @@ -36,8 +36,8 @@ class HsMariaDbDatabaseHostingAssetValidatorUnitTest { ))) .build(); - private static HsHostingAssetEntityBuilder givenValidMariaDbDatabaseBuilder() { - return HsHostingAssetEntity.builder() + private static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder givenValidMariaDbDatabaseBuilder() { + return HsHostingAssetRbacEntity.builder() .type(MARIADB_DATABASE) .parentAsset(GIVEN_MARIADB_USER) .identifier("MAD|xyz00_temp") diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbInstanceHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbInstanceHostingAssetValidatorUnitTest.java index 24d8b4d1..212bb7a7 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbInstanceHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbInstanceHostingAssetValidatorUnitTest.java @@ -2,27 +2,27 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import org.junit.jupiter.api.Test; import java.util.Map; import static java.util.Map.entry; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_SMTP_SETUP; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_WEBSPACE; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MARIADB_INSTANCE; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_SERVER_HOSTING_ASSET; import static net.hostsharing.hsadminng.hs.hosting.asset.validators.HsMariaDbInstanceHostingAssetValidator.DEFAULT_INSTANCE_IDENTIFIER_SUFFIX; import static org.assertj.core.api.Assertions.assertThat; class HsMariaDbInstanceHostingAssetValidatorUnitTest { - static HsHostingAssetEntityBuilder validEntityBuilder() { - return HsHostingAssetEntity.builder() + static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder validEntityBuilder() { + return HsHostingAssetRbacEntity.builder() .type(MARIADB_INSTANCE) - .parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET) - .identifier(TEST_MANAGED_SERVER_HOSTING_ASSET.getIdentifier() + DEFAULT_INSTANCE_IDENTIFIER_SUFFIX); + .parentAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) + .identifier(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY.getIdentifier() + DEFAULT_INSTANCE_IDENTIFIER_SUFFIX); } @Test @@ -81,8 +81,8 @@ class HsMariaDbInstanceHostingAssetValidatorUnitTest { // given final var mangedServerHostingAssetEntity = validEntityBuilder() .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) - .parentAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).build()) - .assignedToAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).build()) + .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbUserHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbUserHostingAssetValidatorUnitTest.java index 70b823c8..e675dc90 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbUserHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbUserHostingAssetValidatorUnitTest.java @@ -1,7 +1,7 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import org.junit.jupiter.api.Test; import jakarta.persistence.EntityManager; @@ -9,28 +9,28 @@ import java.util.HashMap; import java.util.stream.Stream; import static java.util.Map.ofEntries; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MARIADB_INSTANCE; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MARIADB_USER; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_SERVER_HOSTING_ASSET; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_WEBSPACE_HOSTING_ASSET; import static net.hostsharing.hsadminng.mapper.PatchMap.entry; import static org.assertj.core.api.Assertions.assertThat; class HsMariaDbUserHostingAssetValidatorUnitTest { - private static final HsHostingAssetEntity GIVEN_MARIADB_INSTANCE = HsHostingAssetEntity.builder() + private static final HsHostingAssetRealEntity GIVEN_MARIADB_INSTANCE = HsHostingAssetRealEntity.builder() .type(MARIADB_INSTANCE) - .parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET) + .parentAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("vm1234|MariaDB.default") .caption("some valid test MariaDB-Instance") .build(); private EntityManager em = null; // not actually needed in these test cases - private static HsHostingAssetEntityBuilder givenValidMariaDbUserBuilder() { - return HsHostingAssetEntity.builder() + private static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder givenValidMariaDbUserBuilder() { + return HsHostingAssetRbacEntity.builder() .type(MARIADB_USER) - .parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET) + .parentAsset(MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY) .assignedToAsset(GIVEN_MARIADB_INSTANCE) .identifier("MAU|xyz00_temp") .caption("some valid test MariaDB-User") diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlDatabaseHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlDatabaseHostingAssetValidatorUnitTest.java index 78a59288..5abefdee 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlDatabaseHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlDatabaseHostingAssetValidatorUnitTest.java @@ -2,34 +2,34 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import org.junit.jupiter.api.Test; import java.util.HashMap; import java.util.stream.Stream; import static java.util.Map.ofEntries; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.PGSQL_DATABASE; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.PGSQL_INSTANCE; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.PGSQL_USER; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_SERVER_HOSTING_ASSET; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_WEBSPACE_HOSTING_ASSET; import static net.hostsharing.hsadminng.mapper.PatchMap.entry; import static org.assertj.core.api.Assertions.assertThat; class HsPostgreSqlDatabaseHostingAssetValidatorUnitTest { - private static final HsHostingAssetEntity GIVEN_PGSQL_INSTANCE = HsHostingAssetEntity.builder() + private static final HsHostingAssetRealEntity GIVEN_PGSQL_INSTANCE = HsHostingAssetRealEntity.builder() .type(PGSQL_INSTANCE) - .parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET) + .parentAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("vm1234|PgSql.default") .caption("some valid test PgSql-Instance") .build(); - private static final HsHostingAssetEntity GIVEN_PGSQL_USER = HsHostingAssetEntity.builder() + private static final HsHostingAssetRealEntity GIVEN_PGSQL_USER = HsHostingAssetRealEntity.builder() .type(PGSQL_USER) - .parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET) + .parentAsset(MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY) .assignedToAsset(GIVEN_PGSQL_INSTANCE) .identifier("xyz00_user") .caption("some valid test PgSql-User") @@ -38,8 +38,8 @@ class HsPostgreSqlDatabaseHostingAssetValidatorUnitTest { ))) .build(); - private static HsHostingAssetEntityBuilder givenValidPgSqlDatabaseBuilder() { - return HsHostingAssetEntity.builder() + private static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder givenValidPgSqlDatabaseBuilder() { + return HsHostingAssetRbacEntity.builder() .type(PGSQL_DATABASE) .parentAsset(GIVEN_PGSQL_USER) .identifier("PGD|xyz00_db") @@ -84,8 +84,8 @@ class HsPostgreSqlDatabaseHostingAssetValidatorUnitTest { // given final var givenPgSqlUserHostingAsset = givenValidPgSqlDatabaseBuilder() .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) - .parentAsset(HsHostingAssetEntity.builder().type(PGSQL_INSTANCE).build()) - .assignedToAsset(HsHostingAssetEntity.builder().type(PGSQL_INSTANCE).build()) + .parentAsset(HsHostingAssetRealEntity.builder().type(PGSQL_INSTANCE).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(PGSQL_INSTANCE).build()) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(givenPgSqlUserHostingAsset.getType()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlInstanceHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlInstanceHostingAssetValidatorUnitTest.java index 231bb773..5a1424fe 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlInstanceHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlInstanceHostingAssetValidatorUnitTest.java @@ -2,8 +2,8 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import org.junit.jupiter.api.Test; import java.util.Map; @@ -12,17 +12,17 @@ import static java.util.Map.entry; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_SMTP_SETUP; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_WEBSPACE; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MARIADB_INSTANCE; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_SERVER_HOSTING_ASSET; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.validators.HsMariaDbInstanceHostingAssetValidator.DEFAULT_INSTANCE_IDENTIFIER_SUFFIX; import static org.assertj.core.api.Assertions.assertThat; class HsPostgreSqlInstanceHostingAssetValidatorUnitTest { - static HsHostingAssetEntityBuilder validEntityBuilder() { - return HsHostingAssetEntity.builder() + static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder validEntityBuilder() { + return HsHostingAssetRbacEntity.builder() .type(MARIADB_INSTANCE) - .parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET) - .identifier(TEST_MANAGED_SERVER_HOSTING_ASSET.getIdentifier() + DEFAULT_INSTANCE_IDENTIFIER_SUFFIX); + .parentAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) + .identifier(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY.getIdentifier() + DEFAULT_INSTANCE_IDENTIFIER_SUFFIX); } @Test @@ -81,8 +81,8 @@ class HsPostgreSqlInstanceHostingAssetValidatorUnitTest { // given final var mangedServerHostingAssetEntity = validEntityBuilder() .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) - .parentAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).build()) - .assignedToAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).build()) + .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) + .assignedToAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlUserHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlUserHostingAssetValidatorUnitTest.java index bb589a7b..89091fd3 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlUserHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlUserHostingAssetValidatorUnitTest.java @@ -1,8 +1,8 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hash.HashGenerator; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import org.junit.jupiter.api.Test; import jakarta.persistence.EntityManager; @@ -12,28 +12,28 @@ import java.util.HashMap; import java.util.stream.Stream; import static java.util.Map.ofEntries; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.PGSQL_INSTANCE; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.PGSQL_USER; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_SERVER_HOSTING_ASSET; -import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_WEBSPACE_HOSTING_ASSET; import static net.hostsharing.hsadminng.mapper.PatchMap.entry; import static org.assertj.core.api.Assertions.assertThat; class HsPostgreSqlUserHostingAssetValidatorUnitTest { - private static final HsHostingAssetEntity GIVEN_PGSQL_INSTANCE = HsHostingAssetEntity.builder() + private static final HsHostingAssetRealEntity GIVEN_PGSQL_INSTANCE = HsHostingAssetRealEntity.builder() .type(PGSQL_INSTANCE) - .parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET) + .parentAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("vm1234|PgSql.default") .caption("some valid test PgSql-Instance") .build(); private EntityManager em = null; // not actually needed in these test cases - private static HsHostingAssetEntityBuilder givenValidMariaDbUserBuilder() { - return HsHostingAssetEntity.builder() + private static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder givenValidMariaDbUserBuilder() { + return HsHostingAssetRbacEntity.builder() .type(PGSQL_USER) - .parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET) + .parentAsset(MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY) .assignedToAsset(GIVEN_PGSQL_INSTANCE) .identifier("PGU|xyz00_temp") .caption("some valid test PgSql-User") diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java index e24eaf51..d776038d 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java @@ -1,7 +1,8 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hash.HashGenerator; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -27,21 +28,27 @@ import static org.mockito.Mockito.mock; @ExtendWith(MockitoExtension.class) class HsUnixUserHostingAssetValidatorUnitTest { - private final HsHostingAssetEntity TEST_MANAGED_SERVER_HOSTING_ASSET = HsHostingAssetEntity.builder() + private final HsHostingAssetRealEntity TEST_MANAGED_SERVER_HOSTING_ASSET_REAL_ENTITY = HsHostingAssetRealEntity.builder() .type(HsHostingAssetType.MANAGED_SERVER) .identifier("vm1234") .caption("some managed server") .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) .build(); - private final HsHostingAssetEntity TEST_MANAGED_WEBSPACE_HOSTING_ASSET = HsHostingAssetEntity.builder() + private final HsHostingAssetRealEntity TEST_MANAGED_WEBSPACE_HOSTING_ASSET_REAL_ENTITY = HsHostingAssetRealEntity.builder() .type(MANAGED_WEBSPACE) .bookingItem(TEST_MANAGED_WEBSPACE_BOOKING_ITEM) - .parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET) + .parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET_REAL_ENTITY) .identifier("abc00") .build(); - private final HsHostingAssetEntity GIVEN_VALID_UNIX_USER_HOSTING_ASSET = HsHostingAssetEntity.builder() + private final HsHostingAssetRbacEntity TEST_MANAGED_WEBSPACE_HOSTING_ASSET_RBAC_ENTITY = HsHostingAssetRbacEntity.builder() + .type(MANAGED_WEBSPACE) + .bookingItem(TEST_MANAGED_WEBSPACE_BOOKING_ITEM) + .parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET_REAL_ENTITY) + .identifier("abc00") + .build(); + private final HsHostingAssetRbacEntity GIVEN_VALID_UNIX_USER_HOSTING_ASSET = HsHostingAssetRbacEntity.builder() .type(UNIX_USER) - .parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET) + .parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET_REAL_ENTITY) .identifier("abc00-temp") .caption("some valid test UnixUser") .config(new HashMap<>(ofEntries( @@ -103,9 +110,9 @@ class HsUnixUserHostingAssetValidatorUnitTest { @Test void validatesUnixUserProperties() { // given - final var unixUserHostingAsset = HsHostingAssetEntity.builder() + final var unixUserHostingAsset = HsHostingAssetRbacEntity.builder() .type(UNIX_USER) - .parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET) + .parentAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET_REAL_ENTITY) .identifier("abc00-temp") .caption("some test UnixUser with invalid properties") .config(ofEntries( @@ -140,9 +147,9 @@ class HsUnixUserHostingAssetValidatorUnitTest { @Test void validatesInvalidIdentifier() { // given - final var unixUserHostingAsset = HsHostingAssetEntity.builder() + final var unixUserHostingAsset = HsHostingAssetRbacEntity.builder() .type(UNIX_USER) - .parentAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).identifier("abc00").build()) + .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).identifier("abc00").build()) .identifier("xyz99-temp") .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(unixUserHostingAsset.getType()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/HsHostingAssetRealEntity.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/HsHostingAssetRealEntity.java deleted file mode 100644 index b83f97ee..00000000 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/HsHostingAssetRealEntity.java +++ /dev/null @@ -1,114 +0,0 @@ -package net.hostsharing.hsadminng.hs.migration; - -import io.hypersistence.utils.hibernate.type.json.JsonType; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAsset; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; -import net.hostsharing.hsadminng.mapper.PatchableMapWrapper; -import org.hibernate.annotations.Type; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToMany; -import jakarta.persistence.OneToOne; -import jakarta.persistence.PostLoad; -import jakarta.persistence.Table; -import jakarta.persistence.Transient; -import jakarta.persistence.Version; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -@Builder -@Entity -@Table(name = "hs_hosting_asset") -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -public class HsHostingAssetRealEntity implements HsHostingAsset { - - @Id - @GeneratedValue - private UUID uuid; - - @Version - private int version; - - @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "bookingitemuuid") - private HsBookingItemEntity bookingItem; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "parentassetuuid") - private HsHostingAssetRealEntity parentAsset; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "assignedtoassetuuid") - private HsHostingAssetRealEntity assignedToAsset; - - @Column(name = "type") - @Enumerated(EnumType.STRING) - private HsHostingAssetType type; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "alarmcontactuuid") - private HsOfficeContactRealEntity alarmContact; - - @OneToMany(cascade = CascadeType.REFRESH, orphanRemoval = true, fetch = FetchType.LAZY) - @JoinColumn(name = "parentassetuuid", referencedColumnName = "uuid") - private List subHostingAssets; - - @Column(name = "identifier") - private String identifier; // e.g. vm1234, xyz00, example.org, xyz00_abc - - @Column(name = "caption") - private String caption; - - @Builder.Default - @Setter(AccessLevel.NONE) - @Type(JsonType.class) - @Column(columnDefinition = "config") - private Map config = new HashMap<>(); - - @Transient - private PatchableMapWrapper configWrapper; - - @Transient - private boolean isLoaded; - - @PostLoad - public void markAsLoaded() { - this.isLoaded = true; - } - - public PatchableMapWrapper getConfig() { - return PatchableMapWrapper.of(configWrapper, (newWrapper) -> {configWrapper = newWrapper;}, config); - } - - @Override - public PatchableMapWrapper directProps() { - return getConfig(); - } - - @Override - public String toString() { - return stringify.using(HsHostingAssetRealEntity.class).apply(this); - } -} diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java index 410485eb..c3db5298 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java @@ -10,6 +10,7 @@ import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.booking.item.validators.HsBookingItemEntityValidatorRegistry; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; import net.hostsharing.hsadminng.hs.hosting.asset.validators.HostingAssetEntitySaveProcessor; import net.hostsharing.hsadminng.hs.hosting.asset.validators.HostingAssetEntityValidatorRegistry; -- 2.39.5 From 06784e03f4af483c4cea982dda101d75cb02e158 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Thu, 15 Aug 2024 14:05:16 +0200 Subject: [PATCH 06/14] properly split up HsBookingProjectEntity into HsBookingProjectReal+RbacEntity extending HsBookingProject --- .../hs/booking/item/HsBookingItemEntity.java | 17 ++-- ...ojectEntity.java => HsBookingProject.java} | 20 ++--- .../project/HsBookingProjectController.java | 6 +- .../HsBookingProjectEntityPatcher.java | 4 +- .../project/HsBookingProjectRbacEntity.java | 86 ++++++++++++++++++ .../HsBookingProjectRbacRepository.java | 21 +++++ .../project/HsBookingProjectRealEntity.java | 19 ++++ .../HsBookingProjectRealRepository.java | 21 +++++ .../project/HsBookingProjectRepository.java | 21 ----- .../hs/hosting/asset/HsHostingAsset.java | 4 +- ...HsBookingItemControllerAcceptanceTest.java | 10 +-- .../item/HsBookingItemControllerRestTest.java | 14 +-- .../HsBookingItemEntityPatcherUnitTest.java | 4 +- .../item/HsBookingItemEntityUnitTest.java | 4 +- ...sBookingItemRepositoryIntegrationTest.java | 14 +-- .../hs/booking/item/TestHsBookingItem.java | 6 +- .../HsBookingItemEntityValidatorUnitTest.java | 6 +- ...oudServerBookingItemValidatorUnitTest.java | 4 +- ...gedServerBookingItemValidatorUnitTest.java | 7 +- ...dWebspaceBookingItemValidatorUnitTest.java | 4 +- ...vateCloudBookingItemValidatorUnitTest.java | 8 +- ...ookingProjectControllerAcceptanceTest.java | 25 +++--- ...HsBookingProjectEntityPatcherUnitTest.java | 15 ++-- .../HsBookingProjectEntityUnitTest.java | 14 ++- ...ProjectRbacRepositoryIntegrationTest.java} | 87 ++++++++++--------- .../booking/project/TestHsBookingProject.java | 3 +- ...sHostingAssetControllerAcceptanceTest.java | 10 +-- ...ingAssetRbacRepositoryIntegrationTest.java | 4 +- ...WebspaceHostingAssetValidatorUnitTest.java | 6 +- .../hs/migration/ImportHostingAssets.java | 8 +- .../test/ContextBasedTestWithCleanup.java | 15 ++++ .../hsadminng/rbac/test/JpaAttempt.java | 8 +- 32 files changed, 315 insertions(+), 180 deletions(-) rename src/main/java/net/hostsharing/hsadminng/hs/booking/project/{HsBookingProjectEntity.java => HsBookingProject.java} (88%) create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacEntity.java create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacRepository.java create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRealEntity.java create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRealRepository.java delete mode 100644 src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepository.java rename src/test/java/net/hostsharing/hsadminng/hs/booking/project/{HsBookingProjectRepositoryIntegrationTest.java => HsBookingProjectRbacRepositoryIntegrationTest.java} (78%) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java index 957ba171..e6d10154 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java @@ -9,8 +9,9 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProject; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.hs.validation.PropertiesProvider; import net.hostsharing.hsadminng.mapper.PatchableMapWrapper; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; @@ -90,7 +91,7 @@ public class HsBookingItemEntity implements Stringifyable, BaseEntity subBookingItems; @OneToOne(mappedBy="bookingItem") - private HsHostingAssetRbacEntity relatedHostingAsset; + private HsHostingAssetRealEntity relatedHostingAsset; @Transient private PatchableMapWrapper resourcesWrapper; @@ -181,18 +182,18 @@ public class HsBookingItemEntity implements Stringifyable, BaseEntity { +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@SuperBuilder(builderMethodName = "baseBuilder", toBuilder = true) +public class HsBookingProject implements Stringifyable, BaseEntity { - private static Stringify stringify = stringify(HsBookingProjectEntity.class) - .withProp(HsBookingProjectEntity::getDebitor) - .withProp(HsBookingProjectEntity::getCaption) + private static Stringify stringify = stringify(HsBookingProject.class) + .withProp(HsBookingProject::getDebitor) + .withProp(HsBookingProject::getCaption) .quotedValues(false); @Id @@ -67,7 +67,7 @@ public class HsBookingProjectEntity implements Stringifyable, BaseEntity RESOURCE_TO_ENTITY_POSTMAPPER = (resource, entity) -> { + final BiConsumer RESOURCE_TO_ENTITY_POSTMAPPER = (resource, entity) -> { if (resource.getDebitorUuid() != null) { entity.setDebitor(debitorRepo.findByUuid(resource.getDebitorUuid()) .orElseThrow(() -> new EntityNotFoundException("ERROR: [400] debitorUuid %s not found".formatted( diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityPatcher.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityPatcher.java index 239fb075..e6ddcc6e 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityPatcher.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityPatcher.java @@ -8,9 +8,9 @@ import net.hostsharing.hsadminng.mapper.OptionalFromJson; public class HsBookingProjectEntityPatcher implements EntityPatcher { - private final HsBookingProjectEntity entity; + private final HsBookingProject entity; - public HsBookingProjectEntityPatcher(final HsBookingProjectEntity entity) { + public HsBookingProjectEntityPatcher(final HsBookingProject entity) { this.entity = entity; } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacEntity.java new file mode 100644 index 00000000..50ba366a --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacEntity.java @@ -0,0 +1,86 @@ +package net.hostsharing.hsadminng.hs.booking.project; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import net.hostsharing.hsadminng.hs.office.debitor.HsOfficeDebitorEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRbacEntity; +import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; +import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; + +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import java.io.IOException; + +import static net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationType.DEBITOR; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Column.dependsOnColumn; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.ColumnValue.usingCase; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.ColumnValue.usingDefaultCase; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Nullable.NOT_NULL; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.DELETE; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.INSERT; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.SELECT; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.UPDATE; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.ADMIN; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.AGENT; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.OWNER; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.TENANT; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL.directlyFetchedByDependsOnColumn; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL.fetchedBySql; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.rbacViewFor; + +@Entity +@Table(name = "hs_booking_project_rv") +@SuperBuilder(toBuilder = true) +@Getter +@Setter +@NoArgsConstructor +public class HsBookingProjectRbacEntity extends HsBookingProject { + + public static RbacView rbac() { + return rbacViewFor("project", HsBookingProjectRbacEntity.class) + .withIdentityView(SQL.query(""" + SELECT bookingProject.uuid as uuid, debitorIV.idName || '-' || cleanIdentifier(bookingProject.caption) as idName + FROM hs_booking_project bookingProject + JOIN hs_office_debitor_iv debitorIV ON debitorIV.uuid = bookingProject.debitorUuid + """)) + .withRestrictedViewOrderBy(SQL.expression("caption")) + .withUpdatableColumns("version", "caption") + + .importEntityAlias("debitor", HsOfficeDebitorEntity.class, usingDefaultCase(), + dependsOnColumn("debitorUuid"), + directlyFetchedByDependsOnColumn(), + NOT_NULL) + + .importEntityAlias("debitorRel", HsOfficeRelationRbacEntity.class, usingCase(DEBITOR), + dependsOnColumn("debitorUuid"), + fetchedBySql(""" + SELECT ${columns} + FROM hs_office_relation debitorRel + JOIN hs_office_debitor debitor ON debitor.debitorRelUuid = debitorRel.uuid + WHERE debitor.uuid = ${REF}.debitorUuid + """), + NOT_NULL) + .toRole("debitorRel", ADMIN).grantPermission(INSERT) + .toRole("global", ADMIN).grantPermission(DELETE) + + .createRole(OWNER, (with) -> { + with.incomingSuperRole("debitorRel", AGENT).unassumed(); + }) + .createSubRole(ADMIN, (with) -> { + with.permission(UPDATE); + }) + .createSubRole(AGENT) + .createSubRole(TENANT, (with) -> { + with.outgoingSubRole("debitorRel", TENANT); + with.permission(SELECT); + }) + + .limitDiagramTo("project", "debitorRel", "global"); + } + + public static void main(String[] args) throws IOException { + rbac().generateWithBaseFileName("6-hs-booking/620-booking-project/6203-hs-booking-project-rbac"); + } +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacRepository.java new file mode 100644 index 00000000..cb8a27d3 --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacRepository.java @@ -0,0 +1,21 @@ +package net.hostsharing.hsadminng.hs.booking.project; + +import org.springframework.data.repository.Repository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface HsBookingProjectRbacRepository extends Repository { + + Optional findByUuid(final UUID bookingProjectUuid); + List findByCaption(final String projectCaption); + + List findAllByDebitorUuid(final UUID bookingProjectUuid); + + HsBookingProjectRbacEntity save(HsBookingProjectRbacEntity current); + + int deleteByUuid(final UUID uuid); + + long count(); +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRealEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRealEntity.java new file mode 100644 index 00000000..e561c0b6 --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRealEntity.java @@ -0,0 +1,19 @@ +package net.hostsharing.hsadminng.hs.booking.project; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +import jakarta.persistence.Entity; +import jakarta.persistence.Table; + + +@Entity +@Table(name = "hs_booking_project") +@SuperBuilder(toBuilder = true) +@Getter +@Setter +@NoArgsConstructor +public class HsBookingProjectRealEntity extends HsBookingProject { +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRealRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRealRepository.java new file mode 100644 index 00000000..ca8df609 --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRealRepository.java @@ -0,0 +1,21 @@ +package net.hostsharing.hsadminng.hs.booking.project; + +import org.springframework.data.repository.Repository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface HsBookingProjectRealRepository extends Repository { + + Optional findByUuid(final UUID bookingProjectUuid); + List findByCaption(final String projectCaption); + + List findAllByDebitorUuid(final UUID bookingProjectUuid); + + HsBookingProjectRealEntity save(HsBookingProjectRealEntity current); + + int deleteByUuid(final UUID uuid); + + long count(); +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepository.java deleted file mode 100644 index f8a171b4..00000000 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.hostsharing.hsadminng.hs.booking.project; - -import org.springframework.data.repository.Repository; - -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -public interface HsBookingProjectRepository extends Repository { - - Optional findByUuid(final UUID bookingProjectUuid); - List findByCaption(final String projectCaption); - - List findAllByDebitorUuid(final UUID bookingProjectUuid); - - HsBookingProjectEntity save(HsBookingProjectEntity current); - - int deleteByUuid(final UUID uuid); - - long count(); -} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAsset.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAsset.java index efcba66f..4e76adb7 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAsset.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAsset.java @@ -9,7 +9,7 @@ import lombok.Setter; import lombok.Getter; import lombok.experimental.SuperBuilder; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; -import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectEntity; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProject; import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.hs.validation.PropertiesProvider; import net.hostsharing.hsadminng.mapper.PatchableMapWrapper; @@ -127,7 +127,7 @@ public class HsHostingAsset implements Stringifyable, BaseEntity return getConfig(); } - public HsBookingProjectEntity getRelatedProject() { + public HsBookingProject getRelatedProject() { return Optional.ofNullable(getBookingItem()) .map(HsBookingItemEntity::getRelatedProject) .orElseGet(() -> Optional.ofNullable(getParentAsset()) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerAcceptanceTest.java index b28e3e4e..00a868ef 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerAcceptanceTest.java @@ -4,7 +4,7 @@ import io.hypersistence.utils.hibernate.type.range.Range; import io.restassured.RestAssured; import io.restassured.http.ContentType; import net.hostsharing.hsadminng.HsadminNgApplication; -import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRepository; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealRepository; import net.hostsharing.hsadminng.hs.office.debitor.HsOfficeDebitorRepository; import net.hostsharing.hsadminng.rbac.test.ContextBasedTestWithCleanup; import net.hostsharing.hsadminng.rbac.test.JpaAttempt; @@ -47,7 +47,7 @@ class HsBookingItemControllerAcceptanceTest extends ContextBasedTestWithCleanup HsBookingItemRepository bookingItemRepo; @Autowired - HsBookingProjectRepository projectRepo; + HsBookingProjectRealRepository realProjectRepo; @Autowired HsOfficeDebitorRepository debitorRepo; @@ -65,7 +65,7 @@ class HsBookingItemControllerAcceptanceTest extends ContextBasedTestWithCleanup // given context("superuser-alex@hostsharing.net"); final var givenProject = debitorRepo.findDebitorByDebitorNumber(1000111).stream() - .map(d -> projectRepo.findAllByDebitorUuid(d.getUuid())) + .map(d -> realProjectRepo.findAllByDebitorUuid(d.getUuid())) .flatMap(List::stream) .findFirst() .orElseThrow(); @@ -133,7 +133,7 @@ class HsBookingItemControllerAcceptanceTest extends ContextBasedTestWithCleanup context.define("superuser-alex@hostsharing.net"); final var givenProject = debitorRepo.findDebitorByDebitorNumber(1000111).stream() - .map(d -> projectRepo.findAllByDebitorUuid(d.getUuid())) + .map(d -> realProjectRepo.findAllByDebitorUuid(d.getUuid())) .flatMap(List::stream) .findFirst() .orElseThrow(); @@ -386,7 +386,7 @@ class HsBookingItemControllerAcceptanceTest extends ContextBasedTestWithCleanup final HsBookingItemType hsBookingItemType, final Map.Entry... resources) { return jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net"); - final var givenProject = projectRepo.findByCaption(projectCaption).stream() + final var givenProject = realProjectRepo.findByCaption(projectCaption).stream() .findAny().orElseThrow(); final var newBookingItem = HsBookingItemEntity.builder() .uuid(UUID.randomUUID()) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerRestTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerRestTest.java index 4a50cb19..d3578bbd 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerRestTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerRestTest.java @@ -1,8 +1,8 @@ package net.hostsharing.hsadminng.hs.booking.item; import net.hostsharing.hsadminng.context.Context; -import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectEntity; -import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRepository; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealRepository; import net.hostsharing.hsadminng.mapper.Mapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; @@ -51,7 +51,7 @@ class HsBookingItemControllerRestTest { EntityManagerFactory emf; @MockBean - HsBookingProjectRepository bookingProjectRepo; + HsBookingProjectRealRepository realProjectRepo; @MockBean HsBookingItemRepository bookingItemRepo; @@ -73,8 +73,8 @@ class HsBookingItemControllerRestTest { final var givenProjectUuid = UUID.randomUUID(); // given - when(em.find(HsBookingProjectEntity.class, givenProjectUuid)).thenAnswer(invocation -> - HsBookingProjectEntity.builder() + when(em.find(HsBookingProjectRealEntity.class, givenProjectUuid)).thenAnswer(invocation -> + HsBookingProjectRealEntity.builder() .uuid(invocation.getArgument(1)) .build() ); @@ -123,8 +123,8 @@ class HsBookingItemControllerRestTest { final var givenProjectUuid = UUID.randomUUID(); // given - when(em.find(HsBookingProjectEntity.class, givenProjectUuid)).thenAnswer(invocation -> - HsBookingProjectEntity.builder() + when(em.find(HsBookingProjectRealEntity.class, givenProjectUuid)).thenAnswer(invocation -> + HsBookingProjectRealEntity.builder() .uuid(invocation.getArgument(1)) .build() ); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityPatcherUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityPatcherUnitTest.java index ca179fc3..40b45884 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityPatcherUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityPatcherUnitTest.java @@ -17,7 +17,7 @@ import java.util.Map; import java.util.UUID; import java.util.stream.Stream; -import static net.hostsharing.hsadminng.hs.booking.project.TestHsBookingProject.TEST_PROJECT; +import static net.hostsharing.hsadminng.hs.booking.project.TestHsBookingProject.PROJECT_TEST_ENTITY; import static net.hostsharing.hsadminng.mapper.PatchMap.entry; import static net.hostsharing.hsadminng.mapper.PatchMap.patchMap; import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS; @@ -70,7 +70,7 @@ class HsBookingItemEntityPatcherUnitTest extends PatchUnitTestBase< protected HsBookingItemEntity newInitialEntity() { final var entity = new HsBookingItemEntity(); entity.setUuid(INITIAL_BOOKING_ITEM_UUID); - entity.setProject(TEST_PROJECT); + entity.setProject(PROJECT_TEST_ENTITY); entity.getResources().putAll(KeyValueMap.from(INITIAL_RESOURCES)); entity.setCaption(INITIAL_CAPTION); entity.setValidity(Range.closedInfinite(GIVEN_VALID_FROM)); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityUnitTest.java index 23e0307f..8085bbca 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityUnitTest.java @@ -10,7 +10,7 @@ import java.time.Month; import java.util.Map; import static java.util.Map.entry; -import static net.hostsharing.hsadminng.hs.booking.project.TestHsBookingProject.TEST_PROJECT; +import static net.hostsharing.hsadminng.hs.booking.project.TestHsBookingProject.PROJECT_TEST_ENTITY; import static net.hostsharing.hsadminng.mapper.PostgresDateRange.toPostgresDateRange; import static org.assertj.core.api.Assertions.assertThat; @@ -21,7 +21,7 @@ class HsBookingItemEntityUnitTest { private MockedStatic localDateMockedStatic = Mockito.mockStatic(LocalDate.class, Mockito.CALLS_REAL_METHODS); final HsBookingItemEntity givenBookingItem = HsBookingItemEntity.builder() - .project(TEST_PROJECT) + .project(PROJECT_TEST_ENTITY) .type(HsBookingItemType.CLOUD_SERVER) .caption("some caption") .resources(Map.ofEntries( diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java index 9c1c04d0..e91cdd95 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java @@ -2,7 +2,7 @@ package net.hostsharing.hsadminng.hs.booking.item; import io.hypersistence.utils.hibernate.type.range.Range; import net.hostsharing.hsadminng.context.Context; -import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRepository; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealRepository; import net.hostsharing.hsadminng.hs.office.debitor.HsOfficeDebitorRepository; import net.hostsharing.hsadminng.rbac.rbacgrant.RawRbacGrantRepository; import net.hostsharing.hsadminng.rbac.rbacrole.RawRbacRoleRepository; @@ -42,7 +42,7 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup HsBookingItemRepository bookingItemRepo; @Autowired - HsBookingProjectRepository projectRepo; + HsBookingProjectRealRepository realProjectRepo; @Autowired HsOfficeDebitorRepository debitorRepo; @@ -71,7 +71,7 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup context("superuser-alex@hostsharing.net"); final var count = bookingItemRepo.count(); final var givenDebitor = debitorRepo.findDebitorByOptionalNameLike("First").get(0); - final var givenProject = projectRepo.findAllByDebitorUuid(givenDebitor.getUuid()).get(0); + final var givenProject = realProjectRepo.findAllByDebitorUuid(givenDebitor.getUuid()).get(0); // when final var result = attempt(em, () -> { @@ -102,7 +102,7 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup // when attempt(em, () -> { final var givenDebitor = debitorRepo.findDebitorByOptionalNameLike("First").get(0); - final var givenProject = projectRepo.findAllByDebitorUuid(givenDebitor.getUuid()).get(0); + final var givenProject = realProjectRepo.findAllByDebitorUuid(givenDebitor.getUuid()).get(0); final var newBookingItem = HsBookingItemEntity.builder() .project(givenProject) .type(MANAGED_WEBSPACE) @@ -160,7 +160,7 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup // given context("superuser-alex@hostsharing.net"); final var projectUuid = debitorRepo.findDebitorByDebitorNumber(1000212).stream() - .map(d -> projectRepo.findAllByDebitorUuid(d.getUuid())) + .map(d -> realProjectRepo.findAllByDebitorUuid(d.getUuid())) .flatMap(List::stream) .findAny().orElseThrow().getUuid(); @@ -185,7 +185,7 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup final var debitor = debitorRepo.findDebitorByDebitorNumber(1000111); context("person-FirbySusan@example.com", "hs_booking_project#D-1000111-D-1000111defaultproject:OWNER"); final var projectUuid = debitor.stream() - .map(d -> projectRepo.findAllByDebitorUuid(d.getUuid())) + .map(d -> realProjectRepo.findAllByDebitorUuid(d.getUuid())) .flatMap(List::stream) .findAny().orElseThrow().getUuid(); @@ -329,7 +329,7 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup private HsBookingItemEntity givenSomeTemporaryBookingItem(final String projectCaption) { return jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - final var givenProject = projectRepo.findByCaption(projectCaption).stream() + final var givenProject = realProjectRepo.findByCaption(projectCaption).stream() .findAny().orElseThrow(); final var newBookingItem = HsBookingItemEntity.builder() .project(givenProject) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/TestHsBookingItem.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/TestHsBookingItem.java index 1d143ab3..ec4cd2b4 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/TestHsBookingItem.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/TestHsBookingItem.java @@ -7,13 +7,13 @@ import java.time.LocalDate; import java.util.Map; import static java.util.Map.entry; -import static net.hostsharing.hsadminng.hs.booking.project.TestHsBookingProject.TEST_PROJECT; +import static net.hostsharing.hsadminng.hs.booking.project.TestHsBookingProject.PROJECT_TEST_ENTITY; @UtilityClass public class TestHsBookingItem { public static final HsBookingItemEntity TEST_CLOUD_SERVER_BOOKING_ITEM = HsBookingItemEntity.builder() - .project(TEST_PROJECT) + .project(PROJECT_TEST_ENTITY) .type(HsBookingItemType.CLOUD_SERVER) .caption("test cloud server booking item") .resources(Map.ofEntries( @@ -26,7 +26,7 @@ public class TestHsBookingItem { .build(); public static final HsBookingItemEntity TEST_MANAGED_SERVER_BOOKING_ITEM = HsBookingItemEntity.builder() - .project(TEST_PROJECT) + .project(PROJECT_TEST_ENTITY) .type(HsBookingItemType.MANAGED_SERVER) .caption("test project booking item") .resources(Map.ofEntries( diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorUnitTest.java index c8383dc9..d8423508 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorUnitTest.java @@ -2,7 +2,7 @@ package net.hostsharing.hsadminng.hs.booking.item.validators; import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; -import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectEntity; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; import org.junit.jupiter.api.Test; import jakarta.validation.ValidationException; @@ -18,13 +18,13 @@ class HsBookingItemEntityValidatorUnitTest { final HsBookingDebitorEntity debitor = HsBookingDebitorEntity.builder() .debitorNumber(12345) .build(); - final HsBookingProjectEntity project = HsBookingProjectEntity.builder() + final HsBookingProjectRealEntity project = HsBookingProjectRealEntity.builder() .debitor(debitor) .caption("test project") .build(); @Test - void validThrowsException() { + void rejectsInvalidEntity() { // given final var cloudServerBookingItemEntity = HsBookingItemEntity.builder() .type(CLOUD_SERVER) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsCloudServerBookingItemValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsCloudServerBookingItemValidatorUnitTest.java index 5646c2a3..8a411bcc 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsCloudServerBookingItemValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsCloudServerBookingItemValidatorUnitTest.java @@ -2,7 +2,7 @@ package net.hostsharing.hsadminng.hs.booking.item.validators; import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; -import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectEntity; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; import org.junit.jupiter.api.Test; import java.util.Map; @@ -20,7 +20,7 @@ class HsCloudServerBookingItemValidatorUnitTest { final HsBookingDebitorEntity debitor = HsBookingDebitorEntity.builder() .debitorNumber(12345) .build(); - final HsBookingProjectEntity project = HsBookingProjectEntity.builder() + final HsBookingProjectRealEntity project = HsBookingProjectRealEntity.builder() .debitor(debitor) .caption("Test-Project") .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java index bef65f82..2f8df1a9 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java @@ -2,8 +2,7 @@ package net.hostsharing.hsadminng.hs.booking.item.validators; import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; -import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; import org.junit.jupiter.api.Test; @@ -29,7 +28,7 @@ class HsManagedServerBookingItemValidatorUnitTest { final HsBookingDebitorEntity debitor = HsBookingDebitorEntity.builder() .debitorNumber(12345) .build(); - final HsBookingProjectEntity project = HsBookingProjectEntity.builder() + final HsBookingProjectRealEntity project = HsBookingProjectRealEntity.builder() .debitor(debitor) .caption("Test-Project") .build(); @@ -141,7 +140,7 @@ class HsManagedServerBookingItemValidatorUnitTest { entry("Traffic", 1000), entry("Multi", 1) )) - .relatedHostingAsset(HsHostingAssetRbacEntity.builder() + .relatedHostingAsset(HsHostingAssetRealEntity.builder() .type(HsHostingAssetType.MANAGED_WEBSPACE) .identifier("abc00") .subHostingAssets(concat( diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidatorUnitTest.java index 4e7dc561..3df01c5f 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidatorUnitTest.java @@ -2,7 +2,7 @@ package net.hostsharing.hsadminng.hs.booking.item.validators; import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; -import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectEntity; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; import org.junit.jupiter.api.Test; import java.util.Map; @@ -16,7 +16,7 @@ class HsManagedWebspaceBookingItemValidatorUnitTest { final HsBookingDebitorEntity debitor = HsBookingDebitorEntity.builder() .debitorNumber(12345) .build(); - final HsBookingProjectEntity project = HsBookingProjectEntity.builder() + final HsBookingProjectRealEntity project = HsBookingProjectRealEntity.builder() .debitor(debitor) .caption("Test-Project") .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsPrivateCloudBookingItemValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsPrivateCloudBookingItemValidatorUnitTest.java index 9f939d58..8f828e36 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsPrivateCloudBookingItemValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsPrivateCloudBookingItemValidatorUnitTest.java @@ -2,7 +2,7 @@ package net.hostsharing.hsadminng.hs.booking.item.validators; import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; -import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectEntity; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; import org.junit.jupiter.api.Test; import static java.util.List.of; @@ -11,7 +11,7 @@ import static java.util.Map.ofEntries; import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.CLOUD_SERVER; import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_SERVER; import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.PRIVATE_CLOUD; -import static net.hostsharing.hsadminng.hs.booking.project.TestHsBookingProject.TEST_PROJECT; +import static net.hostsharing.hsadminng.hs.booking.project.TestHsBookingProject.PROJECT_TEST_ENTITY; import static org.assertj.core.api.Assertions.assertThat; class HsPrivateCloudBookingItemValidatorUnitTest { @@ -19,7 +19,7 @@ class HsPrivateCloudBookingItemValidatorUnitTest { final HsBookingDebitorEntity debitor = HsBookingDebitorEntity.builder() .debitorNumber(12345) .build(); - final HsBookingProjectEntity project = HsBookingProjectEntity.builder() + final HsBookingProjectRealEntity project = HsBookingProjectRealEntity.builder() .debitor(debitor) .caption("Test-Project") .build(); @@ -29,7 +29,7 @@ class HsPrivateCloudBookingItemValidatorUnitTest { // given final var privateCloudBookingItemEntity = HsBookingItemEntity.builder() .type(PRIVATE_CLOUD) - .project(TEST_PROJECT) + .project(PROJECT_TEST_ENTITY) .caption("myPC") .resources(ofEntries( entry("CPU", 4), diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectControllerAcceptanceTest.java index 94194b1f..c4bc8e2e 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectControllerAcceptanceTest.java @@ -32,10 +32,7 @@ class HsBookingProjectControllerAcceptanceTest extends ContextBasedTestWithClean private Integer port; @Autowired - HsBookingProjectRepository bookingProjectRepo; - - @Autowired - HsBookingProjectRepository projectRepo; + HsBookingProjectRealRepository realProjectRepo; @Autowired HsBookingDebitorRepository debitorRepo; @@ -126,7 +123,7 @@ class HsBookingProjectControllerAcceptanceTest extends ContextBasedTestWithClean @Test void globalAdmin_canGetArbitraryBookingProject() { context.define("superuser-alex@hostsharing.net"); - final var givenBookingProjectUuid = bookingProjectRepo.findByCaption("D-1000111 default project").stream() + final var givenBookingProjectUuid = realProjectRepo.findByCaption("D-1000111 default project").stream() .findAny().orElseThrow().getUuid(); RestAssured // @formatter:off @@ -148,8 +145,8 @@ class HsBookingProjectControllerAcceptanceTest extends ContextBasedTestWithClean @Test void normalUser_canNotGetUnrelatedBookingProject() { context.define("superuser-alex@hostsharing.net"); - final var givenBookingProjectUuid = bookingProjectRepo.findByCaption("D-1000212 default project").stream() - .map(HsBookingProjectEntity::getUuid) + final var givenBookingProjectUuid = realProjectRepo.findByCaption("D-1000212 default project").stream() + .map(HsBookingProject::getUuid) .findAny().orElseThrow(); RestAssured // @formatter:off @@ -165,7 +162,7 @@ class HsBookingProjectControllerAcceptanceTest extends ContextBasedTestWithClean @Test void projectAgentUser_canGetRelatedBookingProject() { context.define("superuser-alex@hostsharing.net"); - final var givenBookingProjectUuid = bookingProjectRepo.findByCaption("D-1000313 default project").stream() + final var givenBookingProjectUuid = realProjectRepo.findByCaption("D-1000313 default project").stream() .findAny().orElseThrow().getUuid(); RestAssured // @formatter:off @@ -217,7 +214,7 @@ class HsBookingProjectControllerAcceptanceTest extends ContextBasedTestWithClean // finally, the bookingProject is actually updated context.define("superuser-alex@hostsharing.net"); - assertThat(bookingProjectRepo.findByUuid(givenBookingProject.getUuid())).isPresent().get() + assertThat(realProjectRepo.findByUuid(givenBookingProject.getUuid())).isPresent().get() .matches(mandate -> { assertThat(mandate.getDebitor().toString()).isEqualTo("booking-debitor(D-1000111: fir)"); return true; @@ -243,7 +240,7 @@ class HsBookingProjectControllerAcceptanceTest extends ContextBasedTestWithClean .statusCode(204); // @formatter:on // then the given bookingProject is gone - assertThat(bookingProjectRepo.findByUuid(givenBookingProject.getUuid())).isEmpty(); + assertThat(realProjectRepo.findByUuid(givenBookingProject.getUuid())).isEmpty(); } @Test @@ -261,21 +258,21 @@ class HsBookingProjectControllerAcceptanceTest extends ContextBasedTestWithClean .statusCode(404); // @formatter:on // then the given bookingProject is still there - assertThat(bookingProjectRepo.findByUuid(givenBookingProject.getUuid())).isNotEmpty(); + assertThat(realProjectRepo.findByUuid(givenBookingProject.getUuid())).isNotEmpty(); } } - private HsBookingProjectEntity givenSomeBookingProject(final int debitorNumber, final String caption) { + private HsBookingProjectRealEntity givenSomeBookingProject(final int debitorNumber, final String caption) { return jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net"); final var givenDebitor = debitorRepo.findByDebitorNumber(debitorNumber).stream().findAny().orElseThrow(); - final var newBookingProject = HsBookingProjectEntity.builder() + final var newBookingProject = HsBookingProjectRealEntity.builder() .uuid(UUID.randomUUID()) .debitor(givenDebitor) .caption(caption) .build(); - return bookingProjectRepo.save(newBookingProject); + return realProjectRepo.save(newBookingProject); }).assertSuccessful().returnedValue(); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityPatcherUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityPatcherUnitTest.java index 37229d26..bfceb370 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityPatcherUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityPatcherUnitTest.java @@ -23,7 +23,7 @@ import static org.mockito.Mockito.lenient; @ExtendWith(MockitoExtension.class) class HsBookingProjectEntityPatcherUnitTest extends PatchUnitTestBase< HsBookingProjectPatchResource, - HsBookingProjectEntity + HsBookingProject > { private static final UUID INITIAL_BOOKING_PROJECT_UUID = UUID.randomUUID(); @@ -38,13 +38,14 @@ class HsBookingProjectEntityPatcherUnitTest extends PatchUnitTestBase< void initMocks() { lenient().when(em.getReference(eq(HsOfficeDebitorEntity.class), any())).thenAnswer(invocation -> HsOfficeDebitorEntity.builder().uuid(invocation.getArgument(1)).build()); - lenient().when(em.getReference(eq(HsBookingProjectEntity.class), any())).thenAnswer(invocation -> - HsBookingProjectEntity.builder().uuid(invocation.getArgument(1)).build()); +// FIXME +// lenient().when(em.getReference(eq(HsBookingProject.class), any())).thenAnswer(invocation -> +// HsBookingProject.builder().uuid(invocation.getArgument(1)).build()); } @Override - protected HsBookingProjectEntity newInitialEntity() { - final var entity = new HsBookingProjectEntity(); + protected HsBookingProject newInitialEntity() { + final var entity = new HsBookingProject(); entity.setUuid(INITIAL_BOOKING_PROJECT_UUID); entity.setDebitor(TEST_BOOKING_DEBITOR); entity.setCaption(INITIAL_CAPTION); @@ -57,7 +58,7 @@ class HsBookingProjectEntityPatcherUnitTest extends PatchUnitTestBase< } @Override - protected HsBookingProjectEntityPatcher createPatcher(final HsBookingProjectEntity bookingProject) { + protected HsBookingProjectEntityPatcher createPatcher(final HsBookingProject bookingProject) { return new HsBookingProjectEntityPatcher(bookingProject); } @@ -68,7 +69,7 @@ class HsBookingProjectEntityPatcherUnitTest extends PatchUnitTestBase< "caption", HsBookingProjectPatchResource::setCaption, PATCHED_CAPTION, - HsBookingProjectEntity::setCaption) + HsBookingProject::setCaption) ); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityUnitTest.java index 1d53070b..c89651f4 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityUnitTest.java @@ -2,26 +2,22 @@ package net.hostsharing.hsadminng.hs.booking.project; import org.junit.jupiter.api.Test; -import static net.hostsharing.hsadminng.hs.booking.debitor.TestHsBookingDebitor.TEST_BOOKING_DEBITOR; +import static net.hostsharing.hsadminng.hs.booking.project.TestHsBookingProject.PROJECT_TEST_ENTITY; import static org.assertj.core.api.Assertions.assertThat; class HsBookingProjectEntityUnitTest { - final HsBookingProjectEntity givenBookingProject = HsBookingProjectEntity.builder() - .debitor(TEST_BOOKING_DEBITOR) - .caption("some caption") - .build(); @Test void toStringContainsAllPropertiesAndResourcesSortedByKey() { - final var result = givenBookingProject.toString(); + final var result = PROJECT_TEST_ENTITY.toString(); - assertThat(result).isEqualTo("HsBookingProjectEntity(D-1234500, some caption)"); + assertThat(result).isEqualTo("HsBookingProject(D-1234500, test project)"); } @Test void toShortStringContainsOnlyMemberNumberAndCaption() { - final var result = givenBookingProject.toShortString(); + final var result = PROJECT_TEST_ENTITY.toShortString(); - assertThat(result).isEqualTo("D-1234500:some caption"); + assertThat(result).isEqualTo("D-1234500:test project"); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacRepositoryIntegrationTest.java similarity index 78% rename from src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepositoryIntegrationTest.java rename to src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacRepositoryIntegrationTest.java index 8e3b7168..6222020a 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacRepositoryIntegrationTest.java @@ -29,13 +29,13 @@ import static org.assertj.core.api.Assertions.assertThat; @DataJpaTest @Import({ Context.class, JpaAttempt.class }) -class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithCleanup { +class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWithCleanup { @Autowired - HsBookingProjectRepository bookingProjectRepo; + HsBookingProjectRealRepository realProjectRepo; @Autowired - HsBookingProjectRepository projectRepo; + HsBookingProjectRbacRepository rbacProjectRepo; @Autowired HsBookingDebitorRepository debitorRepo; @@ -61,24 +61,24 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea @Test public void testHostsharingAdmin_withoutAssumedRole_canCreateNewBookingProject() { // given - context("superuser-alex@hostsharing.net"); - final var count = bookingProjectRepo.count(); + context("superuser-alex@hostsharing.net"); // TODO.test: remove once we have a realDebitorRepo + final var count = realProjectRepo.count(); final var givenDebitor = debitorRepo.findByDebitorNumber(1000111).get(0); // when final var result = attempt(em, () -> { - final var newBookingProject = HsBookingProjectEntity.builder() + final var newBookingProject = HsBookingProjectRbacEntity.builder() .debitor(givenDebitor) .caption("some new booking project") .build(); - return toCleanup(bookingProjectRepo.save(newBookingProject)); + return toCleanup(rbacProjectRepo.save(newBookingProject)); }); // then result.assertSuccessful(); - assertThat(result.returnedValue()).isNotNull().extracting(HsBookingProjectEntity::getUuid).isNotNull(); + assertThat(result.returnedValue()).isNotNull().extracting(HsBookingProject::getUuid).isNotNull(); assertThatBookingProjectIsPersisted(result.returnedValue()); - assertThat(bookingProjectRepo.count()).isEqualTo(count + 1); + assertThat(realProjectRepo.count()).isEqualTo(count + 1); } @Test @@ -93,11 +93,11 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea // when attempt(em, () -> { final var givenDebitor = debitorRepo.findByDebitorNumber(1000111).get(0); - final var newBookingProject = HsBookingProjectEntity.builder() + final var newBookingProject = HsBookingProjectRbacEntity.builder() .debitor(givenDebitor) .caption("some new booking project") .build(); - return toCleanup(bookingProjectRepo.save(newBookingProject)); + return toCleanup(rbacProjectRepo.save(newBookingProject)); }); // then @@ -135,9 +135,9 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea null)); } - private void assertThatBookingProjectIsPersisted(final HsBookingProjectEntity saved) { - final var found = bookingProjectRepo.findByUuid(saved.getUuid()); - assertThat(found).isNotEmpty().map(HsBookingProjectEntity::toString).get().isEqualTo(saved.toString()); + private void assertThatBookingProjectIsPersisted(final HsBookingProject saved) { + final var found = rbacProjectRepo.findByUuid(saved.getUuid()); + assertThat(found).isNotEmpty().map(HsBookingProject::toString).get().isEqualTo(saved.toString()); } } @@ -152,12 +152,12 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea .findAny().orElseThrow().getUuid(); // when - final var result = bookingProjectRepo.findAllByDebitorUuid(debitorUuid); + final var result = rbacProjectRepo.findAllByDebitorUuid(debitorUuid); // then allTheseBookingProjectsAreReturned( result, - "HsBookingProjectEntity(D-1000212, D-1000212 default project)"); + "HsBookingProject(D-1000212, D-1000212 default project)"); } @Test @@ -169,12 +169,12 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea .findAny().orElseThrow().getUuid(); // when: - final var result = bookingProjectRepo.findAllByDebitorUuid(debitorUuid); + final var result = rbacProjectRepo.findAllByDebitorUuid(debitorUuid); // then: exactlyTheseBookingProjectsAreReturned( result, - "HsBookingProjectEntity(D-1000111, D-1000111 default project)"); + "HsBookingProject(D-1000111, D-1000111 default project)"); } } @@ -182,29 +182,30 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea class UpdateBookingProject { @Test - public void hostsharingAdmin_canUpdateArbitraryBookingProject() { + public void bookingProjectAdmin_canUpdateArbitraryBookingProject() { // given final var givenBookingProjectUuid = givenSomeTemporaryBookingProject(1000111).getUuid(); // when final var result = jpaAttempt.transacted(() -> { - context("superuser-alex@hostsharing.net"); - final var foundBookingProject = em.find(HsBookingProjectEntity.class, givenBookingProjectUuid); - return toCleanup(bookingProjectRepo.save(foundBookingProject)); + context("superuser-alex@hostsharing.net", "hs_booking_project#D-1000111-sometempproject:ADMIN"); + final var foundBookingProject = em.find(HsBookingProjectRbacEntity.class, givenBookingProjectUuid); + foundBookingProject.setCaption("updated caption"); + return toCleanup(rbacProjectRepo.save(foundBookingProject)); }); // then result.assertSuccessful(); - jpaAttempt.transacted(() -> { - context("superuser-alex@hostsharing.net"); - assertThatBookingProjectActuallyInDatabase(result.returnedValue()); - }).assertSuccessful(); + assertThat(result.returnedValue().getCaption()).isEqualTo("updated caption"); + assertThatBookingProjectActuallyInDatabase(result.returnedValue()); } - private void assertThatBookingProjectActuallyInDatabase(final HsBookingProjectEntity saved) { - final var found = bookingProjectRepo.findByUuid(saved.getUuid()); - assertThat(found).isNotEmpty().get().isNotSameAs(saved) - .extracting(Object::toString).isEqualTo(saved.toString()); + private void assertThatBookingProjectActuallyInDatabase(final HsBookingProject saved) { + jpaAttempt.transacted(() -> { + final var found = realProjectRepo.findByUuid(saved.getUuid()); + assertThat(found).isNotEmpty().get().isNotSameAs(saved) + .extracting(Object::toString).isEqualTo(saved.toString()); + }).assertSuccessful(); } } @@ -220,14 +221,14 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea // when final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - bookingProjectRepo.deleteByUuid(givenBookingProject.getUuid()); + rbacProjectRepo.deleteByUuid(givenBookingProject.getUuid()); }); // then result.assertSuccessful(); assertThat(jpaAttempt.transacted(() -> { context("superuser-fran@hostsharing.net", null); - return bookingProjectRepo.findByUuid(givenBookingProject.getUuid()); + return rbacProjectRepo.findByUuid(givenBookingProject.getUuid()); }).assertSuccessful().returnedValue()).isEmpty(); } @@ -239,9 +240,9 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea // when final var result = jpaAttempt.transacted(() -> { context("person-FirbySusan@example.com", "hs_booking_project#D-1000111-sometempproject:AGENT"); - assertThat(bookingProjectRepo.findByUuid(givenBookingProject.getUuid())).isPresent(); + assertThat(rbacProjectRepo.findByUuid(givenBookingProject.getUuid())).isPresent(); - bookingProjectRepo.deleteByUuid(givenBookingProject.getUuid()); + rbacProjectRepo.deleteByUuid(givenBookingProject.getUuid()); }); // then @@ -250,7 +251,7 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea "[403] Subject ", " is not allowed to delete hs_booking_project"); assertThat(jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - return bookingProjectRepo.findByUuid(givenBookingProject.getUuid()); + return rbacProjectRepo.findByUuid(givenBookingProject.getUuid()); }).assertSuccessful().returnedValue()).isPresent(); // still there } @@ -265,7 +266,7 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea // when final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - return bookingProjectRepo.deleteByUuid(givenBookingProject.getUuid()); + return rbacProjectRepo.deleteByUuid(givenBookingProject.getUuid()); }); // then @@ -295,32 +296,32 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea "[creating booking-project test-data 1000313, hs_booking_project, INSERT]"); } - private HsBookingProjectEntity givenSomeTemporaryBookingProject(final int debitorNumber) { + private HsBookingProjectRealEntity givenSomeTemporaryBookingProject(final int debitorNumber) { return jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); final var givenDebitor = debitorRepo.findByDebitorNumber(debitorNumber).get(0); - final var newBookingProject = HsBookingProjectEntity.builder() + final var newBookingProject = HsBookingProjectRealEntity.builder() .debitor(givenDebitor) .caption("some temp project") .build(); - return toCleanup(bookingProjectRepo.save(newBookingProject)); + return toCleanup(realProjectRepo.save(newBookingProject)); }).assertSuccessful().returnedValue(); } void exactlyTheseBookingProjectsAreReturned( - final List actualResult, + final List actualResult, final String... bookingProjectNames) { assertThat(actualResult) - .extracting(HsBookingProjectEntity::toString) + .extracting(HsBookingProject::toString) .containsExactlyInAnyOrder(bookingProjectNames); } void allTheseBookingProjectsAreReturned( - final List actualResult, + final List actualResult, final String... bookingProjectNames) { assertThat(actualResult) - .extracting(HsBookingProjectEntity::toString) + .extracting(HsBookingProject::toString) .contains(bookingProjectNames); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/TestHsBookingProject.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/TestHsBookingProject.java index 6190c36b..c75c4f83 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/TestHsBookingProject.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/TestHsBookingProject.java @@ -7,8 +7,7 @@ import static net.hostsharing.hsadminng.hs.booking.debitor.TestHsBookingDebitor. @UtilityClass public class TestHsBookingProject { - - public static final HsBookingProjectEntity TEST_PROJECT = HsBookingProjectEntity.builder() + public static final HsBookingProjectRealEntity PROJECT_TEST_ENTITY = HsBookingProjectRealEntity.builder() .debitor(TEST_BOOKING_DEBITOR) .caption("test project") .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java index 0b582272..8234b349 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java @@ -7,7 +7,7 @@ import net.hostsharing.hsadminng.hash.HashGenerator; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRepository; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRepository; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealRepository; import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealRepository; import net.hostsharing.hsadminng.hs.office.debitor.HsOfficeDebitorRepository; @@ -59,7 +59,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup HsBookingItemRepository bookingItemRepo; @Autowired - HsBookingProjectRepository projectRepo; + HsBookingProjectRealRepository realProjectRepo; @Autowired HsOfficeDebitorRepository debitorRepo; @@ -79,7 +79,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup // given context("superuser-alex@hostsharing.net"); - final var givenProject = projectRepo.findByCaption("D-1000111 default project").stream() + final var givenProject = realProjectRepo.findByCaption("D-1000111 default project").stream() .findAny().orElseThrow(); RestAssured // @formatter:off @@ -685,7 +685,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup final HsBookingItemType type, final String bookingItemCaption, final Map resources) { return jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net"); - final var project = projectRepo.findByCaption(projectCaption).stream() + final var project = realProjectRepo.findByCaption(projectCaption).stream() .findAny().orElseThrow(); final var bookingItem = HsBookingItemEntity.builder() .project(project) @@ -703,7 +703,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup final String bookingItemCaption) { return jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net"); - final var project = projectRepo.findByCaption(projectCaption).getFirst(); + final var project = realProjectRepo.findByCaption(projectCaption).getFirst(); final var resources = switch (bookingItemType) { case MANAGED_SERVER -> Map.ofEntries(entry("CPU", 1), entry("RAM", 20), diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepositoryIntegrationTest.java index fb963d55..fdecf223 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepositoryIntegrationTest.java @@ -4,7 +4,7 @@ import net.hostsharing.hsadminng.context.Context; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRepository; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; -import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRepository; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRbacRepository; import net.hostsharing.hsadminng.rbac.rbacgrant.RawRbacGrantRepository; import net.hostsharing.hsadminng.rbac.rbacrole.RawRbacRoleRepository; import net.hostsharing.hsadminng.mapper.Array; @@ -51,7 +51,7 @@ class HsHostingAssetRbacRepositoryIntegrationTest extends ContextBasedTestWithCl HsBookingItemRepository bookingItemRepo; @Autowired - HsBookingProjectRepository projectRepo; + HsBookingProjectRbacRepository projectRepo; @Autowired RawRbacRoleRepository rawRoleRepo; diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java index 3047d7ab..6f195030 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java @@ -14,12 +14,12 @@ import static java.util.Map.entry; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.CLOUD_SERVER; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_WEBSPACE; import static org.assertj.core.api.Assertions.assertThat; -import static net.hostsharing.hsadminng.hs.booking.project.TestHsBookingProject.TEST_PROJECT; +import static net.hostsharing.hsadminng.hs.booking.project.TestHsBookingProject.PROJECT_TEST_ENTITY; class HsManagedWebspaceHostingAssetValidatorUnitTest { final HsBookingItemEntity managedServerBookingItem = HsBookingItemEntity.builder() - .project(TEST_PROJECT) + .project(PROJECT_TEST_ENTITY) .type(HsBookingItemType.MANAGED_SERVER) .caption("Test Managed-Server") .resources(Map.ofEntries( @@ -126,7 +126,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { .type(MANAGED_WEBSPACE) .bookingItem(HsBookingItemEntity.builder() .type(HsBookingItemType.MANAGED_WEBSPACE) - .project(TEST_PROJECT) + .project(PROJECT_TEST_ENTITY) .caption("some ManagedWebspace") .resources(Map.ofEntries(entry("SSD", 25), entry("Traffic", 250))) .build()) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java index c3db5298..3aaf912f 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java @@ -9,7 +9,7 @@ import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.booking.item.validators.HsBookingItemEntityValidatorRegistry; -import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectEntity; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; import net.hostsharing.hsadminng.hs.hosting.asset.validators.HostingAssetEntitySaveProcessor; @@ -131,7 +131,7 @@ public class ImportHostingAssets extends ImportOfficeData { record Hive(int hive_id, String hive_name, int inet_addr_id, AtomicReference serverRef) {} - static Map bookingProjects = new WriteOnceMap<>(); + static Map bookingProjects = new WriteOnceMap<>(); static Map bookingItems = new WriteOnceMap<>(); static Map hives = new WriteOnceMap<>(); @@ -158,7 +158,7 @@ public class ImportHostingAssets extends ImportOfficeData { @Order(11010) void createBookingProjects() { debitors.forEach((id, debitor) -> { - bookingProjects.put(id, HsBookingProjectEntity.builder() + bookingProjects.put(id, HsBookingProjectRealEntity.builder() .caption(debitor.getDefaultPrefix() + " default project") .debitor(em.find(HsBookingDebitorEntity.class, debitor.getUuid())) .build()); @@ -1118,7 +1118,7 @@ public class ImportHostingAssets extends ImportOfficeData { && managedWebspace.getRelatedProject().getDebitor().getDebitorNumber() == 10000_00 ) { assertThat(managedWebspace.getIdentifier()).startsWith("xyz"); final var hshDebitor = managedWebspace.getBookingItem().getProject().getDebitor(); - final var newProject = HsBookingProjectEntity.builder() + final var newProject = HsBookingProjectRealEntity.builder() .debitor(hshDebitor) .caption(parentAsset.getIdentifier() + " Monitor") .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java b/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java index 771b7e1f..173ea031 100644 --- a/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java +++ b/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java @@ -20,6 +20,7 @@ import jakarta.persistence.*; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; +import java.util.regex.Pattern; import static java.lang.System.out; import static java.util.Comparator.comparing; @@ -290,6 +291,20 @@ public abstract class ContextBasedTestWithCleanup extends ContextBasedTest { }).assertSuccessful().returnedValue(); } + /** + * @return an array of all RBAC roles matching the given pattern + */ + protected String[] roleNames(final String sqlLikeExpression) { + final var pattern = Pattern.compile(sqlLikeExpression); + //noinspection unchecked + final List rows = (List) em.createNativeQuery("select * from rbacrole_ev where roleidname like 'hs_booking_project#%'") + .getResultList(); + return rows.stream() + .map(row -> (row[0]).toString()) + .filter(roleName -> pattern.matcher(roleName).matches()) + .toArray(String[]::new); + } + /** * Generates a diagram of the RBAC-Grants to the current subjects (user or assumed roles). */ diff --git a/src/test/java/net/hostsharing/hsadminng/rbac/test/JpaAttempt.java b/src/test/java/net/hostsharing/hsadminng/rbac/test/JpaAttempt.java index 50a928da..dcf31c5d 100644 --- a/src/test/java/net/hostsharing/hsadminng/rbac/test/JpaAttempt.java +++ b/src/test/java/net/hostsharing/hsadminng/rbac/test/JpaAttempt.java @@ -77,11 +77,11 @@ public class JpaAttempt { public static class JpaResult { - private final T result; + private final T value; private final RuntimeException exception; - private JpaResult(final T result, final RuntimeException exception) { - this.result = result; + private JpaResult(final T value, final RuntimeException exception) { + this.value = value; this.exception = exception; } @@ -102,7 +102,7 @@ public class JpaAttempt { } public T returnedValue() { - return result; + return value; } public ObjectAssert assertThatResult() { -- 2.39.5 From f7c55ea3c8d5802bd3249f251e24266ea56ebe08 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Thu, 15 Aug 2024 15:53:28 +0200 Subject: [PATCH 07/14] create HsBookingProjectRepositoryIntegrationTest which can test rbac+real repo --- .../HsBookingProjectRbacRepository.java | 3 +- .../HsBookingProjectRealRepository.java | 3 +- .../project/HsBookingProjectRepository.java | 19 +++ ...kingProjectRepositoryIntegrationTest.java} | 108 +++++++++++++----- 4 files changed, 104 insertions(+), 29 deletions(-) create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepository.java rename src/test/java/net/hostsharing/hsadminng/hs/booking/project/{HsBookingProjectRbacRepositoryIntegrationTest.java => HsBookingProjectRepositoryIntegrationTest.java} (78%) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacRepository.java index cb8a27d3..8541e002 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacRepository.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacRepository.java @@ -6,7 +6,8 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -public interface HsBookingProjectRbacRepository extends Repository { +public interface HsBookingProjectRbacRepository extends HsBookingProjectRepository, + Repository { Optional findByUuid(final UUID bookingProjectUuid); List findByCaption(final String projectCaption); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRealRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRealRepository.java index ca8df609..b6e74d62 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRealRepository.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRealRepository.java @@ -6,7 +6,8 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -public interface HsBookingProjectRealRepository extends Repository { +public interface HsBookingProjectRealRepository extends HsBookingProjectRepository, + Repository { Optional findByUuid(final UUID bookingProjectUuid); List findByCaption(final String projectCaption); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepository.java new file mode 100644 index 00000000..a609f625 --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepository.java @@ -0,0 +1,19 @@ +package net.hostsharing.hsadminng.hs.booking.project; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface HsBookingProjectRepository { + + Optional findByUuid(final UUID bookingProjectUuid); + List findByCaption(final String projectCaption); + + List findAllByDebitorUuid(final UUID bookingProjectUuid); + + E save(E current); + + int deleteByUuid(final UUID uuid); + + long count(); +} diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepositoryIntegrationTest.java similarity index 78% rename from src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacRepositoryIntegrationTest.java rename to src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepositoryIntegrationTest.java index 6222020a..21069a4e 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRbacRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepositoryIntegrationTest.java @@ -9,6 +9,8 @@ import net.hostsharing.hsadminng.rbac.test.ContextBasedTestWithCleanup; import net.hostsharing.hsadminng.rbac.test.JpaAttempt; 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.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -29,7 +31,7 @@ import static org.assertj.core.api.Assertions.assertThat; @DataJpaTest @Import({ Context.class, JpaAttempt.class }) -class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWithCleanup { +class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithCleanup { @Autowired HsBookingProjectRealRepository realProjectRepo; @@ -58,8 +60,9 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith @Nested class CreateBookingProject { - @Test - public void testHostsharingAdmin_withoutAssumedRole_canCreateNewBookingProject() { + @ParameterizedTest + @EnumSource(TestCase.class) + public void testHostsharingAdmin_withoutAssumedRole_canCreateNewBookingProject(final TestCase testCase) { // given context("superuser-alex@hostsharing.net"); // TODO.test: remove once we have a realDebitorRepo final var count = realProjectRepo.count(); @@ -71,7 +74,7 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith .debitor(givenDebitor) .caption("some new booking project") .build(); - return toCleanup(rbacProjectRepo.save(newBookingProject)); + return toCleanup(repoUnderTest(testCase).save(newBookingProject)); }); // then @@ -81,8 +84,9 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith assertThat(realProjectRepo.count()).isEqualTo(count + 1); } - @Test - public void createsAndGrantsRoles() { + @ParameterizedTest + @EnumSource(TestCase.class) + public void createsAndGrantsRoles(final TestCase testCase) { // given context("superuser-alex@hostsharing.net"); final var initialRoleNames = distinctRoleNamesOf(rawRoleRepo.findAll()); @@ -97,7 +101,7 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith .debitor(givenDebitor) .caption("some new booking project") .build(); - return toCleanup(rbacProjectRepo.save(newBookingProject)); + return toCleanup(repoUnderTest(testCase).save(newBookingProject)); }); // then @@ -144,15 +148,16 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith @Nested class FindByDebitorUuid { - @Test - public void globalAdmin_withoutAssumedRole_canViewAllBookingProjectsOfArbitraryDebitor() { + @ParameterizedTest + @EnumSource(TestCase.class) + public void globalAdmin_withoutAssumedRole_canViewAllBookingProjectsOfArbitraryDebitor(final TestCase testCase) { // given context("superuser-alex@hostsharing.net"); final var debitorUuid = debitorRepo.findByDebitorNumber(1000212).stream() .findAny().orElseThrow().getUuid(); // when - final var result = rbacProjectRepo.findAllByDebitorUuid(debitorUuid); + final var result = repoUnderTest(testCase).findAllByDebitorUuid(debitorUuid); // then allTheseBookingProjectsAreReturned( @@ -160,8 +165,9 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith "HsBookingProject(D-1000212, D-1000212 default project)"); } - @Test - public void packetAgent_canViewOnlyRelatedBookingProjects() { + @ParameterizedTest + @EnumSource(TestCase.class) + public void packetAgent_canViewOnlyRelatedBookingProjects(final TestCase testCase) { // given: context("person-FirbySusan@example.com", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); @@ -169,11 +175,10 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith .findAny().orElseThrow().getUuid(); // when: - final var result = rbacProjectRepo.findAllByDebitorUuid(debitorUuid); + final var result = repoUnderTest(testCase).findAllByDebitorUuid(debitorUuid); // then: - exactlyTheseBookingProjectsAreReturned( - result, + assertResult(testCase, result, "HsBookingProject(D-1000111, D-1000111 default project)"); } } @@ -181,8 +186,9 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith @Nested class UpdateBookingProject { - @Test - public void bookingProjectAdmin_canUpdateArbitraryBookingProject() { + @ParameterizedTest + @EnumSource(TestCase.class) + public void bookingProjectAdmin_canUpdateArbitraryBookingProject(final TestCase testCase) { // given final var givenBookingProjectUuid = givenSomeTemporaryBookingProject(1000111).getUuid(); @@ -191,7 +197,7 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith context("superuser-alex@hostsharing.net", "hs_booking_project#D-1000111-sometempproject:ADMIN"); final var foundBookingProject = em.find(HsBookingProjectRbacEntity.class, givenBookingProjectUuid); foundBookingProject.setCaption("updated caption"); - return toCleanup(rbacProjectRepo.save(foundBookingProject)); + return toCleanup(repoUnderTest(testCase).save(foundBookingProject)); }); // then @@ -212,8 +218,9 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith @Nested class DeleteByUuid { - @Test - public void globalAdmin_withoutAssumedRole_canDeleteAnyBookingProject() { + @ParameterizedTest + @EnumSource(TestCase.class) + public void globalAdmin_withoutAssumedRole_canDeleteAnyBookingProject(final TestCase testCase) { // given context("superuser-alex@hostsharing.net", null); final var givenBookingProject = givenSomeTemporaryBookingProject(1000111); @@ -221,7 +228,7 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith // when final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - rbacProjectRepo.deleteByUuid(givenBookingProject.getUuid()); + repoUnderTest(testCase).deleteByUuid(givenBookingProject.getUuid()); }); // then @@ -242,7 +249,7 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith context("person-FirbySusan@example.com", "hs_booking_project#D-1000111-sometempproject:AGENT"); assertThat(rbacProjectRepo.findByUuid(givenBookingProject.getUuid())).isPresent(); - rbacProjectRepo.deleteByUuid(givenBookingProject.getUuid()); + repoUnderTest(TestCase.RBAC).deleteByUuid(givenBookingProject.getUuid()); }); // then @@ -255,8 +262,9 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith }).assertSuccessful().returnedValue()).isPresent(); // still there } - @Test - public void deletingABookingProjectAlsoDeletesRelatedRolesAndGrants() { + @ParameterizedTest + @EnumSource(TestCase.class) + public void deletingABookingProjectAlsoDeletesRelatedRolesAndGrants(final TestCase testCase) { // given context("superuser-alex@hostsharing.net"); final var initialRoleNames = Array.from(distinctRoleNamesOf(rawRoleRepo.findAll())); @@ -266,7 +274,7 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith // when final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - return rbacProjectRepo.deleteByUuid(givenBookingProject.getUuid()); + return repoUnderTest(testCase).deleteByUuid(givenBookingProject.getUuid()); }); // then @@ -310,7 +318,7 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith } void exactlyTheseBookingProjectsAreReturned( - final List actualResult, + final List actualResult, final String... bookingProjectNames) { assertThat(actualResult) .extracting(HsBookingProject::toString) @@ -318,10 +326,56 @@ class HsBookingProjectRbacRepositoryIntegrationTest extends ContextBasedTestWith } void allTheseBookingProjectsAreReturned( - final List actualResult, + final List actualResult, final String... bookingProjectNames) { assertThat(actualResult) .extracting(HsBookingProject::toString) .contains(bookingProjectNames); } + + private HsBookingProjectRepository repoUnderTest(final TestCase testCase) { + return testCase.repo(HsBookingProjectRepositoryIntegrationTest.this); + } + + private void assertResult( + final TestCase testCase, + final List actualResult, + final String... expectedProjects) { + testCase.assertResult(HsBookingProjectRepositoryIntegrationTest.this, actualResult, expectedProjects); + } + + enum TestCase { + REAL { + @Override + HsBookingProjectRepository repo(final HsBookingProjectRepositoryIntegrationTest test) { + return test.realProjectRepo; + } + + @Override + void assertResult( + final HsBookingProjectRepositoryIntegrationTest test, + final List result, + final String... expectedProjects) { + test.allTheseBookingProjectsAreReturned(result, expectedProjects); + } + }, + RBAC { + @Override + HsBookingProjectRepository repo(final HsBookingProjectRepositoryIntegrationTest test) { + return test.rbacProjectRepo; + } + + @Override + void assertResult( + final HsBookingProjectRepositoryIntegrationTest test, + final List result, + final String... expectedProjects) { + test.exactlyTheseBookingProjectsAreReturned(result, expectedProjects); + } + }; + + abstract HsBookingProjectRepository repo(final HsBookingProjectRepositoryIntegrationTest test); + + abstract void assertResult(final HsBookingProjectRepositoryIntegrationTest test, final List result, final String... expectedProjects); + } } -- 2.39.5 From 1288c44919ed74d0eeee11f057b6f2fa741af12c Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Thu, 15 Aug 2024 16:24:09 +0200 Subject: [PATCH 08/14] amend assertions to new entity names --- .../hs/migration/ImportHostingAssets.java | 290 +++++++++--------- 1 file changed, 145 insertions(+), 145 deletions(-) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java index 3aaf912f..4d2cb12b 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java @@ -183,11 +183,11 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEach(5, ipNumberAssets)).isEqualToIgnoringWhitespace(""" { - 363=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.34), - 381=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.52), - 401=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.72), - 402=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.73), - 433=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.104) + 363=HsHostingAsset(IPV4_NUMBER, 83.223.95.34), + 381=HsHostingAsset(IPV4_NUMBER, 83.223.95.52), + 401=HsHostingAsset(IPV4_NUMBER, 83.223.95.72), + 402=HsHostingAsset(IPV4_NUMBER, 83.223.95.73), + 433=HsHostingAsset(IPV4_NUMBER, 83.223.95.104) } """); } @@ -252,15 +252,15 @@ public class ImportHostingAssets extends ImportOfficeData { """); assertThat(firstOfEach(9, packetAssets)).isEqualToIgnoringWhitespace(""" { - 10630=HsHostingAssetRealEntity(MANAGED_WEBSPACE, hsh00, HA hsh00, MANAGED_SERVER:vm1050, D-1000000:hsh default project:BI hsh00), - 10968=HsHostingAssetRealEntity(MANAGED_SERVER, vm1061, HA vm1061, D-1015200:rar default project:BI vm1061), - 10978=HsHostingAssetRealEntity(MANAGED_SERVER, vm1050, HA vm1050, D-1000000:hsh default project:BI vm1050), - 11061=HsHostingAssetRealEntity(MANAGED_SERVER, vm1068, HA vm1068, D-1000300:mim default project:BI vm1068), - 11094=HsHostingAssetRealEntity(MANAGED_WEBSPACE, lug00, HA lug00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI lug00), - 11111=HsHostingAssetRealEntity(MANAGED_WEBSPACE, xyz68, HA xyz68, MANAGED_SERVER:vm1068, D-1000000:vm1068 Monitor:BI xyz68), - 11112=HsHostingAssetRealEntity(MANAGED_WEBSPACE, mim00, HA mim00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI mim00), - 11447=HsHostingAssetRealEntity(MANAGED_SERVER, vm1093, HA vm1093, D-1000000:hsh default project:BI vm1093), - 19959=HsHostingAssetRealEntity(MANAGED_WEBSPACE, dph00, HA dph00, MANAGED_SERVER:vm1093, D-1101900:dph default project:BI dph00) + 10630=HsHostingAsset(MANAGED_WEBSPACE, hsh00, HA hsh00, MANAGED_SERVER:vm1050, D-1000000:hsh default project:BI hsh00), + 10968=HsHostingAsset(MANAGED_SERVER, vm1061, HA vm1061, D-1015200:rar default project:BI vm1061), + 10978=HsHostingAsset(MANAGED_SERVER, vm1050, HA vm1050, D-1000000:hsh default project:BI vm1050), + 11061=HsHostingAsset(MANAGED_SERVER, vm1068, HA vm1068, D-1000300:mim default project:BI vm1068), + 11094=HsHostingAsset(MANAGED_WEBSPACE, lug00, HA lug00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI lug00), + 11111=HsHostingAsset(MANAGED_WEBSPACE, xyz68, HA xyz68, MANAGED_SERVER:vm1068, D-1000000:vm1068 Monitor:BI xyz68), + 11112=HsHostingAsset(MANAGED_WEBSPACE, mim00, HA mim00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI mim00), + 11447=HsHostingAsset(MANAGED_SERVER, vm1093, HA vm1093, D-1000000:hsh default project:BI vm1093), + 19959=HsHostingAsset(MANAGED_WEBSPACE, dph00, HA dph00, MANAGED_SERVER:vm1093, D-1101900:dph default project:BI dph00) } """); } @@ -284,13 +284,13 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEach(7, packetAssets)) .isEqualToIgnoringWhitespace(""" { - 10630=HsHostingAssetRealEntity(MANAGED_WEBSPACE, hsh00, HA hsh00, MANAGED_SERVER:vm1050, D-1000000:hsh default project:BI hsh00), - 10968=HsHostingAssetRealEntity(MANAGED_SERVER, vm1061, HA vm1061, D-1015200:rar default project:BI vm1061), - 10978=HsHostingAssetRealEntity(MANAGED_SERVER, vm1050, HA vm1050, D-1000000:hsh default project:BI vm1050), - 11061=HsHostingAssetRealEntity(MANAGED_SERVER, vm1068, HA vm1068, D-1000300:mim default project:BI vm1068), - 11094=HsHostingAssetRealEntity(MANAGED_WEBSPACE, lug00, HA lug00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI lug00), - 11111=HsHostingAssetRealEntity(MANAGED_WEBSPACE, xyz68, HA xyz68, MANAGED_SERVER:vm1068, D-1000000:vm1068 Monitor:BI xyz68), - 11112=HsHostingAssetRealEntity(MANAGED_WEBSPACE, mim00, HA mim00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI mim00) + 10630=HsHostingAsset(MANAGED_WEBSPACE, hsh00, HA hsh00, MANAGED_SERVER:vm1050, D-1000000:hsh default project:BI hsh00), + 10968=HsHostingAsset(MANAGED_SERVER, vm1061, HA vm1061, D-1015200:rar default project:BI vm1061), + 10978=HsHostingAsset(MANAGED_SERVER, vm1050, HA vm1050, D-1000000:hsh default project:BI vm1050), + 11061=HsHostingAsset(MANAGED_SERVER, vm1068, HA vm1068, D-1000300:mim default project:BI vm1068), + 11094=HsHostingAsset(MANAGED_WEBSPACE, lug00, HA lug00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI lug00), + 11111=HsHostingAsset(MANAGED_WEBSPACE, xyz68, HA xyz68, MANAGED_SERVER:vm1068, D-1000000:vm1068 Monitor:BI xyz68), + 11112=HsHostingAsset(MANAGED_WEBSPACE, mim00, HA mim00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI mim00) } """); assertThat(firstOfEachType( @@ -332,21 +332,21 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEach(15, unixUserAssets)).isEqualToIgnoringWhitespace(""" { - 5803=HsHostingAssetRealEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102090}), - 5805=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.1, Paul Klemm, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102091}), - 5809=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.2, Walter Müller, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 8, "SSD soft quota": 4, "locked": false, "shell": "/bin/bash", "userid": 102093}), - 5811=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102094}), - 5813=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102095}), - 5835=HsHostingAssetRealEntity(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "shell": "/usr/bin/passwd", "userid": 102106}), - 5961=HsHostingAssetRealEntity(UNIX_USER, xyz68, Monitoring h68, MANAGED_WEBSPACE:xyz68, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102141}), - 5964=HsHostingAssetRealEntity(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102147}), - 5966=HsHostingAssetRealEntity(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "shell": "/bin/bash", "userid": 102148}), - 5990=HsHostingAssetRealEntity(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102160}), - 6705=HsHostingAssetRealEntity(UNIX_USER, hsh00-mim, Michael Mellis, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 10003}), - 6824=HsHostingAssetRealEntity(UNIX_USER, hsh00, Hostsharing Paket, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 10000}), - 7846=HsHostingAssetRealEntity(UNIX_USER, hsh00-dph, hsh00-uph, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 110568}), - 9546=HsHostingAssetRealEntity(UNIX_USER, dph00, Reinhard Wiese, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110593}), - 9596=HsHostingAssetRealEntity(UNIX_USER, dph00-dph, Domain admin, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110594}) + 5803=HsHostingAsset(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102090}), + 5805=HsHostingAsset(UNIX_USER, lug00-wla.1, Paul Klemm, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102091}), + 5809=HsHostingAsset(UNIX_USER, lug00-wla.2, Walter Müller, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 8, "SSD soft quota": 4, "locked": false, "shell": "/bin/bash", "userid": 102093}), + 5811=HsHostingAsset(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102094}), + 5813=HsHostingAsset(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102095}), + 5835=HsHostingAsset(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "shell": "/usr/bin/passwd", "userid": 102106}), + 5961=HsHostingAsset(UNIX_USER, xyz68, Monitoring h68, MANAGED_WEBSPACE:xyz68, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102141}), + 5964=HsHostingAsset(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102147}), + 5966=HsHostingAsset(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "shell": "/bin/bash", "userid": 102148}), + 5990=HsHostingAsset(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102160}), + 6705=HsHostingAsset(UNIX_USER, hsh00-mim, Michael Mellis, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 10003}), + 6824=HsHostingAsset(UNIX_USER, hsh00, Hostsharing Paket, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 10000}), + 7846=HsHostingAsset(UNIX_USER, hsh00-dph, hsh00-uph, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 110568}), + 9546=HsHostingAsset(UNIX_USER, dph00, Reinhard Wiese, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110593}), + 9596=HsHostingAsset(UNIX_USER, dph00-dph, Domain admin, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110594}) } """); } @@ -369,15 +369,15 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEach(15, emailAliasAssets)).isEqualToIgnoringWhitespace(""" { - 2403=HsHostingAssetRealEntity(EMAIL_ALIAS, lug00, lug00, MANAGED_WEBSPACE:lug00, {"target": [ "michael.mellis@example.com" ]}), - 2405=HsHostingAssetRealEntity(EMAIL_ALIAS, lug00-wla-listar, lug00-wla-listar, MANAGED_WEBSPACE:lug00, {"target": [ "|/home/pacs/lug00/users/in/mailinglist/listar" ]}), - 2429=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00, mim00, MANAGED_WEBSPACE:mim00, {"target": [ "mim12-mi@mim12.hostsharing.net" ]}), - 2431=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-abruf, mim00-abruf, MANAGED_WEBSPACE:mim00, {"target": [ "michael.mellis@hostsharing.net" ]}), - 2449=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-hhfx, mim00-hhfx, MANAGED_WEBSPACE:mim00, {"target": [ "mim00-hhfx", "|/usr/bin/formail -I 'Reply-To: hamburger-fx@example.net' | /usr/lib/sendmail mim00-hhfx-l" ]}), - 2451=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-hhfx-l, mim00-hhfx-l, MANAGED_WEBSPACE:mim00, {"target": [ ":include:/home/pacs/mim00/etc/hhfx.list" ]}), - 2454=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-dev.null, mim00-dev.null, MANAGED_WEBSPACE:mim00, {"target": [ "/dev/null" ]}), - 2455=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-1_with_space, mim00-1_with_space, MANAGED_WEBSPACE:mim00, {"target": [ "|/home/pacs/mim00/install/corpslistar/listar" ]}), - 2456=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-1_with_single_quotes, mim00-1_with_single_quotes, MANAGED_WEBSPACE:mim00, {"target": [ "|/home/pacs/rir00/mailinglist/ecartis -r kybs06-intern" ]}) + 2403=HsHostingAsset(EMAIL_ALIAS, lug00, lug00, MANAGED_WEBSPACE:lug00, {"target": [ "michael.mellis@example.com" ]}), + 2405=HsHostingAsset(EMAIL_ALIAS, lug00-wla-listar, lug00-wla-listar, MANAGED_WEBSPACE:lug00, {"target": [ "|/home/pacs/lug00/users/in/mailinglist/listar" ]}), + 2429=HsHostingAsset(EMAIL_ALIAS, mim00, mim00, MANAGED_WEBSPACE:mim00, {"target": [ "mim12-mi@mim12.hostsharing.net" ]}), + 2431=HsHostingAsset(EMAIL_ALIAS, mim00-abruf, mim00-abruf, MANAGED_WEBSPACE:mim00, {"target": [ "michael.mellis@hostsharing.net" ]}), + 2449=HsHostingAsset(EMAIL_ALIAS, mim00-hhfx, mim00-hhfx, MANAGED_WEBSPACE:mim00, {"target": [ "mim00-hhfx", "|/usr/bin/formail -I 'Reply-To: hamburger-fx@example.net' | /usr/lib/sendmail mim00-hhfx-l" ]}), + 2451=HsHostingAsset(EMAIL_ALIAS, mim00-hhfx-l, mim00-hhfx-l, MANAGED_WEBSPACE:mim00, {"target": [ ":include:/home/pacs/mim00/etc/hhfx.list" ]}), + 2454=HsHostingAsset(EMAIL_ALIAS, mim00-dev.null, mim00-dev.null, MANAGED_WEBSPACE:mim00, {"target": [ "/dev/null" ]}), + 2455=HsHostingAsset(EMAIL_ALIAS, mim00-1_with_space, mim00-1_with_space, MANAGED_WEBSPACE:mim00, {"target": [ "|/home/pacs/mim00/install/corpslistar/listar" ]}), + 2456=HsHostingAsset(EMAIL_ALIAS, mim00-1_with_single_quotes, mim00-1_with_single_quotes, MANAGED_WEBSPACE:mim00, {"target": [ "|/home/pacs/rir00/mailinglist/ecartis -r kybs06-intern" ]}) } """); } @@ -395,14 +395,14 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEach(8, dbInstanceAssets)).isEqualToIgnoringWhitespace(""" { - 0=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1061|PgSql.default, vm1061-PostgreSQL default instance, MANAGED_SERVER:vm1061), - 1=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1061|MariaDB.default, vm1061-MariaDB default instance, MANAGED_SERVER:vm1061), - 2=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1050|PgSql.default, vm1050-PostgreSQL default instance, MANAGED_SERVER:vm1050), - 3=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1050|MariaDB.default, vm1050-MariaDB default instance, MANAGED_SERVER:vm1050), - 4=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1068|PgSql.default, vm1068-PostgreSQL default instance, MANAGED_SERVER:vm1068), - 5=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1068|MariaDB.default, vm1068-MariaDB default instance, MANAGED_SERVER:vm1068), - 6=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1093|PgSql.default, vm1093-PostgreSQL default instance, MANAGED_SERVER:vm1093), - 7=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1093|MariaDB.default, vm1093-MariaDB default instance, MANAGED_SERVER:vm1093) + 0=HsHostingAsset(PGSQL_INSTANCE, vm1061|PgSql.default, vm1061-PostgreSQL default instance, MANAGED_SERVER:vm1061), + 1=HsHostingAsset(MARIADB_INSTANCE, vm1061|MariaDB.default, vm1061-MariaDB default instance, MANAGED_SERVER:vm1061), + 2=HsHostingAsset(PGSQL_INSTANCE, vm1050|PgSql.default, vm1050-PostgreSQL default instance, MANAGED_SERVER:vm1050), + 3=HsHostingAsset(MARIADB_INSTANCE, vm1050|MariaDB.default, vm1050-MariaDB default instance, MANAGED_SERVER:vm1050), + 4=HsHostingAsset(PGSQL_INSTANCE, vm1068|PgSql.default, vm1068-PostgreSQL default instance, MANAGED_SERVER:vm1068), + 5=HsHostingAsset(MARIADB_INSTANCE, vm1068|MariaDB.default, vm1068-MariaDB default instance, MANAGED_SERVER:vm1068), + 6=HsHostingAsset(PGSQL_INSTANCE, vm1093|PgSql.default, vm1093-PostgreSQL default instance, MANAGED_SERVER:vm1093), + 7=HsHostingAsset(MARIADB_INSTANCE, vm1093|MariaDB.default, vm1093-MariaDB default instance, MANAGED_SERVER:vm1093) } """); } @@ -425,16 +425,16 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEach(10, dbUserAssets)).isEqualToIgnoringWhitespace(""" { - 1857=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00, hsh00, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$JDiZmaxU+O+ByArLY/CkYZ8HbOk0r/I8LyABnno5gQs=:NI3T500/63dzI1B07Jh3UtQGlukS6JxuS0XoxM/QgAc="}), - 1858=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00, hsh00, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*59067A36BA197AD0A47D74909296C5B002A0FB9F"}), - 1859=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_vorstand, hsh00_vorstand, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg="}), - 1860=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_hsadmin, hsh00_hsadmin, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg="}), - 1861=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_hsadmin_ro, hsh00_hsadmin_ro, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8="}), - 4908=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00_mantis, hsh00_mantis, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*EA4C0889A22AAE66BBEBC88161E8CF862D73B44F"}), - 4909=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00_mantis_ro, hsh00_mantis_ro, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*B3BB6D0DA2EC01958616E9B3BCD2926FE8C38383"}), - 4931=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_phpPgSqlAdmin, hsh00_phpPgSqlAdmin, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8="}), - 4932=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00_phpMyAdmin, hsh00_phpMyAdmin, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*3188720B1889EF5447C722629765F296F40257C2"}), - 7520=HsHostingAssetRealEntity(MARIADB_USER, MAU|lug00_wla, lug00_wla, MANAGED_WEBSPACE:lug00, MARIADB_INSTANCE:vm1068|MariaDB.default, { "password": "*11667C0EAC42BF8B0295ABEDC7D2868A835E4DB5"}) + 1857=HsHostingAsset(PGSQL_USER, PGU|hsh00, hsh00, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$JDiZmaxU+O+ByArLY/CkYZ8HbOk0r/I8LyABnno5gQs=:NI3T500/63dzI1B07Jh3UtQGlukS6JxuS0XoxM/QgAc="}), + 1858=HsHostingAsset(MARIADB_USER, MAU|hsh00, hsh00, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*59067A36BA197AD0A47D74909296C5B002A0FB9F"}), + 1859=HsHostingAsset(PGSQL_USER, PGU|hsh00_vorstand, hsh00_vorstand, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg="}), + 1860=HsHostingAsset(PGSQL_USER, PGU|hsh00_hsadmin, hsh00_hsadmin, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg="}), + 1861=HsHostingAsset(PGSQL_USER, PGU|hsh00_hsadmin_ro, hsh00_hsadmin_ro, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8="}), + 4908=HsHostingAsset(MARIADB_USER, MAU|hsh00_mantis, hsh00_mantis, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*EA4C0889A22AAE66BBEBC88161E8CF862D73B44F"}), + 4909=HsHostingAsset(MARIADB_USER, MAU|hsh00_mantis_ro, hsh00_mantis_ro, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*B3BB6D0DA2EC01958616E9B3BCD2926FE8C38383"}), + 4931=HsHostingAsset(PGSQL_USER, PGU|hsh00_phpPgSqlAdmin, hsh00_phpPgSqlAdmin, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8="}), + 4932=HsHostingAsset(MARIADB_USER, MAU|hsh00_phpMyAdmin, hsh00_phpMyAdmin, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*3188720B1889EF5447C722629765F296F40257C2"}), + 7520=HsHostingAsset(MARIADB_USER, MAU|lug00_wla, lug00_wla, MANAGED_WEBSPACE:lug00, MARIADB_INSTANCE:vm1068|MariaDB.default, { "password": "*11667C0EAC42BF8B0295ABEDC7D2868A835E4DB5"}) } """); } @@ -457,16 +457,16 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEach(10, dbAssets)).isEqualToIgnoringWhitespace(""" { - 1077=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_vorstand, hsh00_vorstand, PGSQL_USER:PGU|hsh00_vorstand, {"encoding": "LATIN1"}), - 1786=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_addr, hsh00_addr, MARIADB_USER:MAU|hsh00, {"encoding": "latin1"}), - 1805=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_dba, hsh00_dba, MARIADB_USER:MAU|hsh00, {"encoding": "latin1"}), - 1858=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00, hsh00, PGSQL_USER:PGU|hsh00, {"encoding": "LATIN1"}), - 1860=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_hsadmin, hsh00_hsadmin, PGSQL_USER:PGU|hsh00_hsadmin, {"encoding": "UTF8"}), - 4908=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_mantis, hsh00_mantis, MARIADB_USER:MAU|hsh00_mantis, {"encoding": "utf8"}), - 4931=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_phpPgSqlAdmin, hsh00_phpPgSqlAdmin, PGSQL_USER:PGU|hsh00_phpPgSqlAdmin, {"encoding": "UTF8"}), - 4932=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_phpPgSqlAdmin_new, hsh00_phpPgSqlAdmin_new, PGSQL_USER:PGU|hsh00_phpPgSqlAdmin, {"encoding": "UTF8"}), - 4941=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_phpMyAdmin, hsh00_phpMyAdmin, MARIADB_USER:MAU|hsh00_phpMyAdmin, {"encoding": "utf8"}), - 4942=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_phpMyAdmin_old, hsh00_phpMyAdmin_old, MARIADB_USER:MAU|hsh00_phpMyAdmin, {"encoding": "utf8"}) + 1077=HsHostingAsset(PGSQL_DATABASE, PGD|hsh00_vorstand, hsh00_vorstand, PGSQL_USER:PGU|hsh00_vorstand, {"encoding": "LATIN1"}), + 1786=HsHostingAsset(MARIADB_DATABASE, MAD|hsh00_addr, hsh00_addr, MARIADB_USER:MAU|hsh00, {"encoding": "latin1"}), + 1805=HsHostingAsset(MARIADB_DATABASE, MAD|hsh00_dba, hsh00_dba, MARIADB_USER:MAU|hsh00, {"encoding": "latin1"}), + 1858=HsHostingAsset(PGSQL_DATABASE, PGD|hsh00, hsh00, PGSQL_USER:PGU|hsh00, {"encoding": "LATIN1"}), + 1860=HsHostingAsset(PGSQL_DATABASE, PGD|hsh00_hsadmin, hsh00_hsadmin, PGSQL_USER:PGU|hsh00_hsadmin, {"encoding": "UTF8"}), + 4908=HsHostingAsset(MARIADB_DATABASE, MAD|hsh00_mantis, hsh00_mantis, MARIADB_USER:MAU|hsh00_mantis, {"encoding": "utf8"}), + 4931=HsHostingAsset(PGSQL_DATABASE, PGD|hsh00_phpPgSqlAdmin, hsh00_phpPgSqlAdmin, PGSQL_USER:PGU|hsh00_phpPgSqlAdmin, {"encoding": "UTF8"}), + 4932=HsHostingAsset(PGSQL_DATABASE, PGD|hsh00_phpPgSqlAdmin_new, hsh00_phpPgSqlAdmin_new, PGSQL_USER:PGU|hsh00_phpPgSqlAdmin, {"encoding": "UTF8"}), + 4941=HsHostingAsset(MARIADB_DATABASE, MAD|hsh00_phpMyAdmin, hsh00_phpMyAdmin, MARIADB_USER:MAU|hsh00_phpMyAdmin, {"encoding": "utf8"}), + 4942=HsHostingAsset(MARIADB_DATABASE, MAD|hsh00_phpMyAdmin_old, hsh00_phpMyAdmin_old, MARIADB_USER:MAU|hsh00_phpMyAdmin, {"encoding": "utf8"}) } """); } @@ -500,71 +500,71 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEach(12, domainSetupAssets)).isEqualToIgnoringWhitespace(""" { - 4531=HsHostingAssetRealEntity(DOMAIN_SETUP, l-u-g.org, l-u-g.org), - 4532=HsHostingAssetRealEntity(DOMAIN_SETUP, linuxfanboysngirls.de, linuxfanboysngirls.de), - 4534=HsHostingAssetRealEntity(DOMAIN_SETUP, lug-mars.de, lug-mars.de), - 4581=HsHostingAssetRealEntity(DOMAIN_SETUP, 1981.ist-im-netz.de, 1981.ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de), - 4587=HsHostingAssetRealEntity(DOMAIN_SETUP, mellis.de, mellis.de), - 4589=HsHostingAssetRealEntity(DOMAIN_SETUP, ist-im-netz.de, ist-im-netz.de), - 4600=HsHostingAssetRealEntity(DOMAIN_SETUP, waera.de, waera.de), - 4604=HsHostingAssetRealEntity(DOMAIN_SETUP, xn--wra-qla.de, wära.de), - 7662=HsHostingAssetRealEntity(DOMAIN_SETUP, dph-netzwerk.de, dph-netzwerk.de) + 4531=HsHostingAsset(DOMAIN_SETUP, l-u-g.org, l-u-g.org), + 4532=HsHostingAsset(DOMAIN_SETUP, linuxfanboysngirls.de, linuxfanboysngirls.de), + 4534=HsHostingAsset(DOMAIN_SETUP, lug-mars.de, lug-mars.de), + 4581=HsHostingAsset(DOMAIN_SETUP, 1981.ist-im-netz.de, 1981.ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de), + 4587=HsHostingAsset(DOMAIN_SETUP, mellis.de, mellis.de), + 4589=HsHostingAsset(DOMAIN_SETUP, ist-im-netz.de, ist-im-netz.de), + 4600=HsHostingAsset(DOMAIN_SETUP, waera.de, waera.de), + 4604=HsHostingAsset(DOMAIN_SETUP, xn--wra-qla.de, wära.de), + 7662=HsHostingAsset(DOMAIN_SETUP, dph-netzwerk.de, dph-netzwerk.de) } """); assertThat(firstOfEach(12, domainDnsSetupAssets)).isEqualToIgnoringWhitespace(""" { - 4531=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, l-u-g.org|DNS, DNS-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, MANAGED_WEBSPACE:lug00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), - 4532=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, linuxfanboysngirls.de|DNS, DNS-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, MANAGED_WEBSPACE:lug00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), - 4534=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, lug-mars.de|DNS, DNS-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, MANAGED_WEBSPACE:lug00, {"TTL": 14400, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": false, "auto-NS-RR": true, "auto-SOA": false, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ "lug-mars.de. 14400 IN SOA dns1.hostsharing.net. hostmaster.hostsharing.net. 1611590905 10800 3600 604800 3600", "lug-mars.de. 14400 IN MX 10 mailin1.hostsharing.net.", "lug-mars.de. 14400 IN MX 20 mailin2.hostsharing.net.", "lug-mars.de. 14400 IN MX 30 mailin3.hostsharing.net.", "bbb.lug-mars.de. 14400 IN A 83.223.79.72", "ftp.lug-mars.de. 14400 IN A 83.223.79.72", "www.lug-mars.de. 14400 IN A 83.223.79.72" ]}), - 4581=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, 1981.ist-im-netz.de|DNS, DNS-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), - 4587=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, mellis.de|DNS, DNS-Setup für mellis.de, DOMAIN_SETUP:mellis.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": true, "auto-AUTOCONFIG-RR": true, "auto-AUTODISCOVER-RR": true, "auto-DKIM-RR": true, "auto-MAILSERVICES-RR": true, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": true, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": true, "user-RR": [ "dump.hoennig.de. 21600 IN CNAME mih12.hostsharing.net.", "fotos.hoennig.de. 21600 IN CNAME mih12.hostsharing.net.", "maven.hoennig.de. 21600 IN NS dns1.hostsharing.net." ]}), - 4589=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, ist-im-netz.de|DNS, DNS-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, MANAGED_WEBSPACE:mim00, {"TTL": 700, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), - 4600=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, waera.de|DNS, DNS-Setup für waera.de, DOMAIN_SETUP:waera.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": false, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": false, "auto-NS-RR": false, "auto-SOA": false, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": false, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), - 4604=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, xn--wra-qla.de|DNS, DNS-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": false, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": false, "auto-NS-RR": false, "auto-SOA": false, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": false, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), - 7662=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, dph-netzwerk.de|DNS, DNS-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, MANAGED_WEBSPACE:dph00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": true, "auto-AUTOCONFIG-RR": true, "auto-AUTODISCOVER-RR": true, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": true, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": true, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ "dph-netzwerk.de. 21600 IN TXT \\"v=spf1 include:spf.hostsharing.net ?all\\"", "*.dph-netzwerk.de. 21600 IN TXT \\"v=spf1 include:spf.hostsharing.net ?all\\"" ]}) + 4531=HsHostingAsset(DOMAIN_DNS_SETUP, l-u-g.org|DNS, DNS-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, MANAGED_WEBSPACE:lug00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), + 4532=HsHostingAsset(DOMAIN_DNS_SETUP, linuxfanboysngirls.de|DNS, DNS-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, MANAGED_WEBSPACE:lug00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), + 4534=HsHostingAsset(DOMAIN_DNS_SETUP, lug-mars.de|DNS, DNS-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, MANAGED_WEBSPACE:lug00, {"TTL": 14400, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": false, "auto-NS-RR": true, "auto-SOA": false, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ "lug-mars.de. 14400 IN SOA dns1.hostsharing.net. hostmaster.hostsharing.net. 1611590905 10800 3600 604800 3600", "lug-mars.de. 14400 IN MX 10 mailin1.hostsharing.net.", "lug-mars.de. 14400 IN MX 20 mailin2.hostsharing.net.", "lug-mars.de. 14400 IN MX 30 mailin3.hostsharing.net.", "bbb.lug-mars.de. 14400 IN A 83.223.79.72", "ftp.lug-mars.de. 14400 IN A 83.223.79.72", "www.lug-mars.de. 14400 IN A 83.223.79.72" ]}), + 4581=HsHostingAsset(DOMAIN_DNS_SETUP, 1981.ist-im-netz.de|DNS, DNS-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), + 4587=HsHostingAsset(DOMAIN_DNS_SETUP, mellis.de|DNS, DNS-Setup für mellis.de, DOMAIN_SETUP:mellis.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": true, "auto-AUTOCONFIG-RR": true, "auto-AUTODISCOVER-RR": true, "auto-DKIM-RR": true, "auto-MAILSERVICES-RR": true, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": true, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": true, "user-RR": [ "dump.hoennig.de. 21600 IN CNAME mih12.hostsharing.net.", "fotos.hoennig.de. 21600 IN CNAME mih12.hostsharing.net.", "maven.hoennig.de. 21600 IN NS dns1.hostsharing.net." ]}), + 4589=HsHostingAsset(DOMAIN_DNS_SETUP, ist-im-netz.de|DNS, DNS-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, MANAGED_WEBSPACE:mim00, {"TTL": 700, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), + 4600=HsHostingAsset(DOMAIN_DNS_SETUP, waera.de|DNS, DNS-Setup für waera.de, DOMAIN_SETUP:waera.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": false, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": false, "auto-NS-RR": false, "auto-SOA": false, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": false, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), + 4604=HsHostingAsset(DOMAIN_DNS_SETUP, xn--wra-qla.de|DNS, DNS-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": false, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": false, "auto-NS-RR": false, "auto-SOA": false, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": false, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), + 7662=HsHostingAsset(DOMAIN_DNS_SETUP, dph-netzwerk.de|DNS, DNS-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, MANAGED_WEBSPACE:dph00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": true, "auto-AUTOCONFIG-RR": true, "auto-AUTODISCOVER-RR": true, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": true, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": true, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ "dph-netzwerk.de. 21600 IN TXT \\"v=spf1 include:spf.hostsharing.net ?all\\"", "*.dph-netzwerk.de. 21600 IN TXT \\"v=spf1 include:spf.hostsharing.net ?all\\"" ]}) } """); assertThat(firstOfEach(12, domainHttpSetupAssets)).isEqualToIgnoringWhitespace(""" { - 4531=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, l-u-g.org|HTTP, HTTP-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, UNIX_USER:lug00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), - 4532=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, linuxfanboysngirls.de|HTTP, HTTP-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, UNIX_USER:lug00-wla.2, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), - 4534=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, lug-mars.de|HTTP, HTTP-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, UNIX_USER:lug00-wla.2, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "www" ]}), - 4581=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, 1981.ist-im-netz.de|HTTP, HTTP-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), - 4587=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, mellis.de|HTTP, HTTP-Setup für mellis.de, DOMAIN_SETUP:mellis.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": false, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "www", "michael", "test", "photos", "static", "input" ]}), - 4589=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, ist-im-netz.de|HTTP, HTTP-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": false, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), - 4600=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, waera.de|HTTP, HTTP-Setup für waera.de, DOMAIN_SETUP:waera.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), - 4604=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, xn--wra-qla.de|HTTP, HTTP-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), - 7662=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, dph-netzwerk.de|HTTP, HTTP-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, UNIX_USER:dph00-dph, {"autoconfig": true, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}) + 4531=HsHostingAsset(DOMAIN_HTTP_SETUP, l-u-g.org|HTTP, HTTP-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, UNIX_USER:lug00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), + 4532=HsHostingAsset(DOMAIN_HTTP_SETUP, linuxfanboysngirls.de|HTTP, HTTP-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, UNIX_USER:lug00-wla.2, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), + 4534=HsHostingAsset(DOMAIN_HTTP_SETUP, lug-mars.de|HTTP, HTTP-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, UNIX_USER:lug00-wla.2, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "www" ]}), + 4581=HsHostingAsset(DOMAIN_HTTP_SETUP, 1981.ist-im-netz.de|HTTP, HTTP-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), + 4587=HsHostingAsset(DOMAIN_HTTP_SETUP, mellis.de|HTTP, HTTP-Setup für mellis.de, DOMAIN_SETUP:mellis.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": false, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "www", "michael", "test", "photos", "static", "input" ]}), + 4589=HsHostingAsset(DOMAIN_HTTP_SETUP, ist-im-netz.de|HTTP, HTTP-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": false, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), + 4600=HsHostingAsset(DOMAIN_HTTP_SETUP, waera.de|HTTP, HTTP-Setup für waera.de, DOMAIN_SETUP:waera.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), + 4604=HsHostingAsset(DOMAIN_HTTP_SETUP, xn--wra-qla.de|HTTP, HTTP-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), + 7662=HsHostingAsset(DOMAIN_HTTP_SETUP, dph-netzwerk.de|HTTP, HTTP-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, UNIX_USER:dph00-dph, {"autoconfig": true, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}) } """); assertThat(firstOfEach(12, domainMBoxSetupAssets)).isEqualToIgnoringWhitespace(""" { - 4531=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, l-u-g.org|MBOX, E-Mail-Empfang-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, MANAGED_WEBSPACE:lug00), - 4532=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, linuxfanboysngirls.de|MBOX, E-Mail-Empfang-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, MANAGED_WEBSPACE:lug00), - 4534=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, lug-mars.de|MBOX, E-Mail-Empfang-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, MANAGED_WEBSPACE:lug00), - 4581=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, 1981.ist-im-netz.de|MBOX, E-Mail-Empfang-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00), - 4587=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, mellis.de|MBOX, E-Mail-Empfang-Setup für mellis.de, DOMAIN_SETUP:mellis.de, MANAGED_WEBSPACE:mim00), - 4589=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, ist-im-netz.de|MBOX, E-Mail-Empfang-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, MANAGED_WEBSPACE:mim00), - 4600=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, waera.de|MBOX, E-Mail-Empfang-Setup für waera.de, DOMAIN_SETUP:waera.de, MANAGED_WEBSPACE:mim00), - 4604=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, xn--wra-qla.de|MBOX, E-Mail-Empfang-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, MANAGED_WEBSPACE:mim00), - 7662=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, dph-netzwerk.de|MBOX, E-Mail-Empfang-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, MANAGED_WEBSPACE:dph00) + 4531=HsHostingAsset(DOMAIN_MBOX_SETUP, l-u-g.org|MBOX, E-Mail-Empfang-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, MANAGED_WEBSPACE:lug00), + 4532=HsHostingAsset(DOMAIN_MBOX_SETUP, linuxfanboysngirls.de|MBOX, E-Mail-Empfang-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, MANAGED_WEBSPACE:lug00), + 4534=HsHostingAsset(DOMAIN_MBOX_SETUP, lug-mars.de|MBOX, E-Mail-Empfang-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, MANAGED_WEBSPACE:lug00), + 4581=HsHostingAsset(DOMAIN_MBOX_SETUP, 1981.ist-im-netz.de|MBOX, E-Mail-Empfang-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00), + 4587=HsHostingAsset(DOMAIN_MBOX_SETUP, mellis.de|MBOX, E-Mail-Empfang-Setup für mellis.de, DOMAIN_SETUP:mellis.de, MANAGED_WEBSPACE:mim00), + 4589=HsHostingAsset(DOMAIN_MBOX_SETUP, ist-im-netz.de|MBOX, E-Mail-Empfang-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, MANAGED_WEBSPACE:mim00), + 4600=HsHostingAsset(DOMAIN_MBOX_SETUP, waera.de|MBOX, E-Mail-Empfang-Setup für waera.de, DOMAIN_SETUP:waera.de, MANAGED_WEBSPACE:mim00), + 4604=HsHostingAsset(DOMAIN_MBOX_SETUP, xn--wra-qla.de|MBOX, E-Mail-Empfang-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, MANAGED_WEBSPACE:mim00), + 7662=HsHostingAsset(DOMAIN_MBOX_SETUP, dph-netzwerk.de|MBOX, E-Mail-Empfang-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, MANAGED_WEBSPACE:dph00) } """); assertThat(firstOfEach(12, domainSmtpSetupAssets)).isEqualToIgnoringWhitespace(""" { - 4531=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, l-u-g.org|SMTP, E-Mail-Versand-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, MANAGED_WEBSPACE:lug00), - 4532=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, linuxfanboysngirls.de|SMTP, E-Mail-Versand-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, MANAGED_WEBSPACE:lug00), - 4534=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, lug-mars.de|SMTP, E-Mail-Versand-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, MANAGED_WEBSPACE:lug00), - 4581=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, 1981.ist-im-netz.de|SMTP, E-Mail-Versand-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00), - 4587=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, mellis.de|SMTP, E-Mail-Versand-Setup für mellis.de, DOMAIN_SETUP:mellis.de, MANAGED_WEBSPACE:mim00), - 4589=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, ist-im-netz.de|SMTP, E-Mail-Versand-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, MANAGED_WEBSPACE:mim00), - 4600=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, waera.de|SMTP, E-Mail-Versand-Setup für waera.de, DOMAIN_SETUP:waera.de, MANAGED_WEBSPACE:mim00), - 4604=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, xn--wra-qla.de|SMTP, E-Mail-Versand-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, MANAGED_WEBSPACE:mim00), - 7662=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, dph-netzwerk.de|SMTP, E-Mail-Versand-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, MANAGED_WEBSPACE:dph00) + 4531=HsHostingAsset(DOMAIN_SMTP_SETUP, l-u-g.org|SMTP, E-Mail-Versand-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, MANAGED_WEBSPACE:lug00), + 4532=HsHostingAsset(DOMAIN_SMTP_SETUP, linuxfanboysngirls.de|SMTP, E-Mail-Versand-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, MANAGED_WEBSPACE:lug00), + 4534=HsHostingAsset(DOMAIN_SMTP_SETUP, lug-mars.de|SMTP, E-Mail-Versand-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, MANAGED_WEBSPACE:lug00), + 4581=HsHostingAsset(DOMAIN_SMTP_SETUP, 1981.ist-im-netz.de|SMTP, E-Mail-Versand-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00), + 4587=HsHostingAsset(DOMAIN_SMTP_SETUP, mellis.de|SMTP, E-Mail-Versand-Setup für mellis.de, DOMAIN_SETUP:mellis.de, MANAGED_WEBSPACE:mim00), + 4589=HsHostingAsset(DOMAIN_SMTP_SETUP, ist-im-netz.de|SMTP, E-Mail-Versand-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, MANAGED_WEBSPACE:mim00), + 4600=HsHostingAsset(DOMAIN_SMTP_SETUP, waera.de|SMTP, E-Mail-Versand-Setup für waera.de, DOMAIN_SETUP:waera.de, MANAGED_WEBSPACE:mim00), + 4604=HsHostingAsset(DOMAIN_SMTP_SETUP, xn--wra-qla.de|SMTP, E-Mail-Versand-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, MANAGED_WEBSPACE:mim00), + 7662=HsHostingAsset(DOMAIN_SMTP_SETUP, dph-netzwerk.de|SMTP, E-Mail-Versand-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, MANAGED_WEBSPACE:dph00) } """); } @@ -587,18 +587,18 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEach(12, emailAddressAssets)).isEqualToIgnoringWhitespace(""" { - 54745=HsHostingAssetRealEntity(EMAIL_ADDRESS, lugmaster@l-u-g.org, lugmaster@l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "lugmaster", "target": [ "nobody" ]}), - 54746=HsHostingAssetRealEntity(EMAIL_ADDRESS, abuse@l-u-g.org, abuse@l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "abuse", "target": [ "lug00" ]}), - 54747=HsHostingAssetRealEntity(EMAIL_ADDRESS, postmaster@l-u-g.org, postmaster@l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "postmaster", "target": [ "nobody" ]}), - 54748=HsHostingAssetRealEntity(EMAIL_ADDRESS, webmaster@l-u-g.org, webmaster@l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "webmaster", "target": [ "nobody" ]}), - 54749=HsHostingAssetRealEntity(EMAIL_ADDRESS, abuse@linuxfanboysngirls.de, abuse@linuxfanboysngirls.de, DOMAIN_MBOX_SETUP:linuxfanboysngirls.de|MBOX, {"local-part": "abuse", "target": [ "lug00-mars" ]}), - 54750=HsHostingAssetRealEntity(EMAIL_ADDRESS, postmaster@linuxfanboysngirls.de, postmaster@linuxfanboysngirls.de, DOMAIN_MBOX_SETUP:linuxfanboysngirls.de|MBOX, {"local-part": "postmaster", "target": [ "m.hinsel@example.org" ]}), - 54751=HsHostingAssetRealEntity(EMAIL_ADDRESS, webmaster@linuxfanboysngirls.de, webmaster@linuxfanboysngirls.de, DOMAIN_MBOX_SETUP:linuxfanboysngirls.de|MBOX, {"local-part": "webmaster", "target": [ "m.hinsel@example.org" ]}), - 54755=HsHostingAssetRealEntity(EMAIL_ADDRESS, abuse@lug-mars.de, abuse@lug-mars.de, DOMAIN_MBOX_SETUP:lug-mars.de|MBOX, {"local-part": "abuse", "target": [ "lug00-marl" ]}), - 54756=HsHostingAssetRealEntity(EMAIL_ADDRESS, postmaster@lug-mars.de, postmaster@lug-mars.de, DOMAIN_MBOX_SETUP:lug-mars.de|MBOX, {"local-part": "postmaster", "target": [ "m.hinsel@example.org" ]}), - 54757=HsHostingAssetRealEntity(EMAIL_ADDRESS, webmaster@lug-mars.de, webmaster@lug-mars.de, DOMAIN_MBOX_SETUP:lug-mars.de|MBOX, {"local-part": "webmaster", "target": [ "m.hinsel@example.org" ]}), - 54760=HsHostingAssetRealEntity(EMAIL_ADDRESS, info@hamburg-west.l-u-g.org, info@hamburg-west.l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "info", "sub-domain": "hamburg-west", "target": [ "peter.lottmann@example.com" ]}), - 54761=HsHostingAssetRealEntity(EMAIL_ADDRESS, lugmaster@hamburg-west.l-u-g.org, lugmaster@hamburg-west.l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "lugmaster", "sub-domain": "hamburg-west", "target": [ "raoul.lottmann@example.com" ]}) + 54745=HsHostingAsset(EMAIL_ADDRESS, lugmaster@l-u-g.org, lugmaster@l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "lugmaster", "target": [ "nobody" ]}), + 54746=HsHostingAsset(EMAIL_ADDRESS, abuse@l-u-g.org, abuse@l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "abuse", "target": [ "lug00" ]}), + 54747=HsHostingAsset(EMAIL_ADDRESS, postmaster@l-u-g.org, postmaster@l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "postmaster", "target": [ "nobody" ]}), + 54748=HsHostingAsset(EMAIL_ADDRESS, webmaster@l-u-g.org, webmaster@l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "webmaster", "target": [ "nobody" ]}), + 54749=HsHostingAsset(EMAIL_ADDRESS, abuse@linuxfanboysngirls.de, abuse@linuxfanboysngirls.de, DOMAIN_MBOX_SETUP:linuxfanboysngirls.de|MBOX, {"local-part": "abuse", "target": [ "lug00-mars" ]}), + 54750=HsHostingAsset(EMAIL_ADDRESS, postmaster@linuxfanboysngirls.de, postmaster@linuxfanboysngirls.de, DOMAIN_MBOX_SETUP:linuxfanboysngirls.de|MBOX, {"local-part": "postmaster", "target": [ "m.hinsel@example.org" ]}), + 54751=HsHostingAsset(EMAIL_ADDRESS, webmaster@linuxfanboysngirls.de, webmaster@linuxfanboysngirls.de, DOMAIN_MBOX_SETUP:linuxfanboysngirls.de|MBOX, {"local-part": "webmaster", "target": [ "m.hinsel@example.org" ]}), + 54755=HsHostingAsset(EMAIL_ADDRESS, abuse@lug-mars.de, abuse@lug-mars.de, DOMAIN_MBOX_SETUP:lug-mars.de|MBOX, {"local-part": "abuse", "target": [ "lug00-marl" ]}), + 54756=HsHostingAsset(EMAIL_ADDRESS, postmaster@lug-mars.de, postmaster@lug-mars.de, DOMAIN_MBOX_SETUP:lug-mars.de|MBOX, {"local-part": "postmaster", "target": [ "m.hinsel@example.org" ]}), + 54757=HsHostingAsset(EMAIL_ADDRESS, webmaster@lug-mars.de, webmaster@lug-mars.de, DOMAIN_MBOX_SETUP:lug-mars.de|MBOX, {"local-part": "webmaster", "target": [ "m.hinsel@example.org" ]}), + 54760=HsHostingAsset(EMAIL_ADDRESS, info@hamburg-west.l-u-g.org, info@hamburg-west.l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "info", "sub-domain": "hamburg-west", "target": [ "peter.lottmann@example.com" ]}), + 54761=HsHostingAsset(EMAIL_ADDRESS, lugmaster@hamburg-west.l-u-g.org, lugmaster@hamburg-west.l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "lugmaster", "sub-domain": "hamburg-west", "target": [ "raoul.lottmann@example.com" ]}) } """); } @@ -878,21 +878,21 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEach(15, unixUserAssets)).isEqualToIgnoringWhitespace(""" { - 5803=HsHostingAssetRealEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102090}), - 5805=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.1, Paul Klemm, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102091}), - 5809=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.2, Walter Müller, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 8, "SSD soft quota": 4, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102093}), - 5811=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102094}), - 5813=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102095}), - 5835=HsHostingAssetRealEntity(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102106}), - 5961=HsHostingAssetRealEntity(UNIX_USER, xyz68, Monitoring h68, MANAGED_WEBSPACE:xyz68, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102141}), - 5964=HsHostingAssetRealEntity(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102147}), - 5966=HsHostingAssetRealEntity(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102148}), - 5990=HsHostingAssetRealEntity(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102160}), - 6705=HsHostingAssetRealEntity(UNIX_USER, hsh00-mim, Michael Mellis, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/false", "userid": 10003}), - 6824=HsHostingAssetRealEntity(UNIX_USER, hsh00, Hostsharing Paket, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 10000}), - 7846=HsHostingAssetRealEntity(UNIX_USER, hsh00-dph, hsh00-uph, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/false", "userid": 110568}), - 9546=HsHostingAssetRealEntity(UNIX_USER, dph00, Reinhard Wiese, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 110593}), - 9596=HsHostingAssetRealEntity(UNIX_USER, dph00-dph, Domain admin, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 110594}) + 5803=HsHostingAsset(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102090}), + 5805=HsHostingAsset(UNIX_USER, lug00-wla.1, Paul Klemm, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102091}), + 5809=HsHostingAsset(UNIX_USER, lug00-wla.2, Walter Müller, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 8, "SSD soft quota": 4, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102093}), + 5811=HsHostingAsset(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102094}), + 5813=HsHostingAsset(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102095}), + 5835=HsHostingAsset(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102106}), + 5961=HsHostingAsset(UNIX_USER, xyz68, Monitoring h68, MANAGED_WEBSPACE:xyz68, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102141}), + 5964=HsHostingAsset(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102147}), + 5966=HsHostingAsset(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102148}), + 5990=HsHostingAsset(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102160}), + 6705=HsHostingAsset(UNIX_USER, hsh00-mim, Michael Mellis, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/false", "userid": 10003}), + 6824=HsHostingAsset(UNIX_USER, hsh00, Hostsharing Paket, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 10000}), + 7846=HsHostingAsset(UNIX_USER, hsh00-dph, hsh00-uph, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/false", "userid": 110568}), + 9546=HsHostingAsset(UNIX_USER, dph00, Reinhard Wiese, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 110593}), + 9596=HsHostingAsset(UNIX_USER, dph00-dph, Domain admin, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 110594}) } """); } -- 2.39.5 From 7d4bdca4541cac84ecd79b9a4e59b83861996a73 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Fri, 16 Aug 2024 17:13:29 +0200 Subject: [PATCH 09/14] HsBookingItem now without relatedHostingAsset, BookingItemRbac->HostingAsset->BookignItemReal cannot be mapped --- ...kingItemEntity.java => HsBookingItem.java} | 121 +++++------------- .../booking/item/HsBookingItemController.java | 12 +- .../item/HsBookingItemEntityPatcher.java | 4 +- .../booking/item/HsBookingItemRbacEntity.java | 83 ++++++++++++ .../item/HsBookingItemRbacRepository.java | 23 ++++ .../booking/item/HsBookingItemRealEntity.java | 24 ++++ .../item/HsBookingItemRealRepository.java | 23 ++++ .../booking/item/HsBookingItemRepository.java | 12 +- .../HsBookingItemEntityValidator.java | 14 +- .../HsBookingItemEntityValidatorRegistry.java | 23 ++-- ...HsManagedWebspaceBookingItemValidator.java | 39 ++++-- .../hs/booking/project/HsBookingProject.java | 2 +- .../hs/hosting/asset/HsHostingAsset.java | 9 +- .../asset/HsHostingAssetController.java | 24 ++-- .../asset/HsHostingAssetRbacEntity.java | 4 +- .../hs/hosting/asset/HsHostingAssetType.java | 4 +- .../HostingAssetEntitySaveProcessor.java | 6 +- .../HostingAssetEntityValidator.java | 8 +- .../HostingAssetEntityValidatorRegistry.java | 10 -- .../hs/validation/HsEntityValidator.java | 12 ++ .../hs/validation/ValidatableProperty.java | 16 +-- .../hsadminng/arch/ArchitectureTest.java | 4 +- .../hs/booking/EntityManagerMock.java | 28 ++++ ...HsBookingItemControllerAcceptanceTest.java | 28 ++-- .../item/HsBookingItemControllerRestTest.java | 6 +- .../HsBookingItemEntityPatcherUnitTest.java | 18 +-- .../item/HsBookingItemEntityUnitTest.java | 6 +- ...sBookingItemRepositoryIntegrationTest.java | 79 ++++++------ .../hs/booking/item/TestHsBookingItem.java | 8 +- .../HsBookingItemEntityValidatorUnitTest.java | 9 +- ...oudServerBookingItemValidatorUnitTest.java | 16 ++- ...gedServerBookingItemValidatorUnitTest.java | 35 +++-- ...dWebspaceBookingItemValidatorUnitTest.java | 8 +- ...vateCloudBookingItemValidatorUnitTest.java | 21 +-- ...HsBookingProjectEntityPatcherUnitTest.java | 5 +- ...okingProjectRepositoryIntegrationTest.java | 14 +- ...sHostingAssetControllerAcceptanceTest.java | 23 ++-- .../HsHostingAssetControllerRestTest.java | 12 +- .../HsHostingAssetEntityPatcherUnitTest.java | 4 +- .../asset/HsHostingAssetEntityUnitTest.java | 6 +- ...ingAssetRbacRepositoryIntegrationTest.java | 18 +-- .../asset/HsHostingAssetTestEntities.java | 12 +- ...udServerHostingAssetValidatorUnitTest.java | 10 +- ...DnsSetupHostingAssetValidatorUnitTest.java | 7 +- ...ttpSetupHostingAssetValidatorUnitTest.java | 4 +- ...mainMboxHostingAssetValidatorUnitTest.java | 4 +- ...ainSetupHostingAssetValidatorUnitTest.java | 4 +- ...mtpSetupHostingAssetValidatorUnitTest.java | 4 +- ...lAddressHostingAssetValidatorUnitTest.java | 4 +- ...ailAliasHostingAssetValidatorUnitTest.java | 4 +- ...v4NumberHostingAssetValidatorUnitTest.java | 4 +- ...v6NumberHostingAssetValidatorUnitTest.java | 4 +- ...edServerHostingAssetValidatorUnitTest.java | 12 +- ...WebspaceHostingAssetValidatorUnitTest.java | 31 +++-- ...DatabaseHostingAssetValidatorUnitTest.java | 8 ++ ...InstanceHostingAssetValidatorUnitTest.java | 4 +- ...iaDbUserHostingAssetValidatorUnitTest.java | 7 +- ...DatabaseHostingAssetValidatorUnitTest.java | 7 +- ...InstanceHostingAssetValidatorUnitTest.java | 4 +- ...UnixUserHostingAssetValidatorUnitTest.java | 10 +- .../hs/migration/ImportHostingAssets.java | 15 ++- 61 files changed, 581 insertions(+), 399 deletions(-) rename src/main/java/net/hostsharing/hsadminng/hs/booking/item/{HsBookingItemEntity.java => HsBookingItem.java} (51%) create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRbacEntity.java create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRbacRepository.java create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRealEntity.java create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRealRepository.java create mode 100644 src/test/java/net/hostsharing/hsadminng/hs/booking/EntityManagerMock.java diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItem.java similarity index 51% rename from src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java rename to src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItem.java index e6d10154..ee9b5547 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItem.java @@ -9,13 +9,11 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import lombok.experimental.SuperBuilder; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProject; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.hs.validation.PropertiesProvider; import net.hostsharing.hsadminng.mapper.PatchableMapWrapper; -import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; -import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.stringify.Stringify; import net.hostsharing.hsadminng.stringify.Stringifyable; @@ -23,7 +21,6 @@ import org.hibernate.annotations.Type; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; -import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; import jakarta.persistence.FetchType; @@ -31,14 +28,12 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import jakarta.persistence.MappedSuperclass; import jakarta.persistence.OneToMany; -import jakarta.persistence.OneToOne; import jakarta.persistence.PostLoad; -import jakarta.persistence.Table; import jakarta.persistence.Transient; import jakarta.persistence.Version; import jakarta.validation.constraints.NotNull; -import java.io.IOException; import java.time.LocalDate; import java.util.HashMap; import java.util.List; @@ -50,36 +45,22 @@ import static java.util.Optional.ofNullable; import static net.hostsharing.hsadminng.mapper.PostgresDateRange.lowerInclusiveFromPostgresDateRange; import static net.hostsharing.hsadminng.mapper.PostgresDateRange.toPostgresDateRange; import static net.hostsharing.hsadminng.mapper.PostgresDateRange.upperInclusiveFromPostgresDateRange; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Column.dependsOnColumn; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.ColumnValue.usingDefaultCase; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Nullable.NULLABLE; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.DELETE; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.INSERT; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.SELECT; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.UPDATE; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.ADMIN; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.AGENT; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.OWNER; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.TENANT; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL.directlyFetchedByDependsOnColumn; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.rbacViewFor; import static net.hostsharing.hsadminng.stringify.Stringify.stringify; -@Entity -@Builder(toBuilder = true) -@Table(name = "hs_booking_item_rv") +@MappedSuperclass @Getter @Setter -@NoArgsConstructor -@AllArgsConstructor -public class HsBookingItemEntity implements Stringifyable, BaseEntity, PropertiesProvider { +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@SuperBuilder(builderMethodName = "baseBuilder", toBuilder = true) +public abstract class HsBookingItem implements Stringifyable, BaseEntity, PropertiesProvider { - private static Stringify stringify = stringify(HsBookingItemEntity.class) - .withProp(HsBookingItemEntity::getType) - .withProp(HsBookingItemEntity::getCaption) - .withProp(HsBookingItemEntity::getProject) + private static Stringify stringify = stringify(HsBookingItem.class) + .withProp(HsBookingItem::getType) + .withProp(HsBookingItem::getCaption) + .withProp(HsBookingItem::getProject) .withProp(e -> e.getValidity().asString()) - .withProp(HsBookingItemEntity::getResources) + .withProp(HsBookingItem::getResources) .quotedValues(false); @Id @@ -95,7 +76,7 @@ public class HsBookingItemEntity implements Stringifyable, BaseEntity resources = new HashMap<>(); @OneToMany(cascade = CascadeType.REFRESH, orphanRemoval = true) - @JoinColumn(name="parentitemuuid", referencedColumnName="uuid") - private List subBookingItems; + @JoinColumn(name = "parentitemuuid", referencedColumnName = "uuid") + private List subBookingItems; - @OneToOne(mappedBy="bookingItem") - private HsHostingAssetRealEntity relatedHostingAsset; +// FIXME + // @OneToOne(targetEntity = HsHostingAssetRealEntity.class, mappedBy="bookingItem") // does not work in case of subclass HsBookingItemRbacEntity +// // because that bookingItem refers to a HsBookingItemRealEntity, not ...Rbac... +// @OneToOne(fetch = FetchType.LAZY) +// @JoinFormula( +// referencedColumnName = "uuid", +// value = """ +// ( +// SELECT DISTINCT asset.uuid +// FROM hs_hosting_asset asset +// WHERE asset.uuid=uuid +// ) +// """) +// private HsHostingAssetRealEntity relatedHostingAsset; @Transient private PatchableMapWrapper resourcesWrapper; @@ -135,7 +128,7 @@ public class HsBookingItemEntity implements Stringifyable, BaseEntity getResources() { - return PatchableMapWrapper.of(resourcesWrapper, (newWrapper) -> {resourcesWrapper = newWrapper; }, resources ); + return PatchableMapWrapper.of(resourcesWrapper, (newWrapper) -> {resourcesWrapper = newWrapper;}, resources); } public void putResources(Map newResources) { @@ -166,10 +159,10 @@ public class HsBookingItemEntity implements Stringifyable, BaseEntity { - with.incomingSuperRole("project", AGENT); - with.incomingSuperRole("parentItem", AGENT); - }) - .createSubRole(ADMIN, (with) -> { - with.permission(UPDATE); - }) - .createSubRole(AGENT) - .createSubRole(TENANT, (with) -> { - with.outgoingSubRole("project", TENANT); - with.outgoingSubRole("parentItem", TENANT); - with.permission(SELECT); - }) - - .limitDiagramTo("bookingItem", "project", "global"); - } - - public static void main(String[] args) throws IOException { - rbac().generateWithBaseFileName("6-hs-booking/630-booking-item/6303-hs-booking-item-rbac"); - } } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemController.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemController.java index 36c16a32..01d2e6a5 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemController.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemController.java @@ -33,7 +33,7 @@ public class HsBookingItemController implements HsBookingItemsApi { private Mapper mapper; @Autowired - private HsBookingItemRepository bookingItemRepo; + private HsBookingItemRbacRepository bookingItemRepo; @PersistenceContext private EntityManager em; @@ -61,9 +61,9 @@ public class HsBookingItemController implements HsBookingItemsApi { context.define(currentUser, assumedRoles); - final var entityToSave = mapper.map(body, HsBookingItemEntity.class, RESOURCE_TO_ENTITY_POSTMAPPER); + final var entityToSave = mapper.map(body, HsBookingItemRbacEntity.class, RESOURCE_TO_ENTITY_POSTMAPPER); - final var saved = HsBookingItemEntityValidatorRegistry.validated(bookingItemRepo.save(entityToSave)); + final var saved = HsBookingItemEntityValidatorRegistry.validated(em, bookingItemRepo.save(entityToSave)); final var uri = MvcUriComponentsBuilder.fromController(getClass()) @@ -119,19 +119,19 @@ public class HsBookingItemController implements HsBookingItemsApi { new HsBookingItemEntityPatcher(current).apply(body); - final var saved = bookingItemRepo.save(HsBookingItemEntityValidatorRegistry.validated(current)); + final var saved = bookingItemRepo.save(HsBookingItemEntityValidatorRegistry.validated(em, current)); final var mapped = mapper.map(saved, HsBookingItemResource.class, ENTITY_TO_RESOURCE_POSTMAPPER); return ResponseEntity.ok(mapped); } - final BiConsumer ENTITY_TO_RESOURCE_POSTMAPPER = (entity, resource) -> { + final BiConsumer ENTITY_TO_RESOURCE_POSTMAPPER = (entity, resource) -> { resource.setValidFrom(entity.getValidity().lower()); if (entity.getValidity().hasUpperBound()) { resource.setValidTo(entity.getValidity().upper().minusDays(1)); } }; - final BiConsumer RESOURCE_TO_ENTITY_POSTMAPPER = (resource, entity) -> { + final BiConsumer RESOURCE_TO_ENTITY_POSTMAPPER = (resource, entity) -> { entity.setValidity(toPostgresDateRange(LocalDate.now(), resource.getValidTo())); entity.putResources(KeyValueMap.from(resource.getResources())); }; diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityPatcher.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityPatcher.java index 24f2f41c..13d11466 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityPatcher.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityPatcher.java @@ -10,9 +10,9 @@ import java.util.Optional; public class HsBookingItemEntityPatcher implements EntityPatcher { - private final HsBookingItemEntity entity; + private final HsBookingItem entity; - public HsBookingItemEntityPatcher(final HsBookingItemEntity entity) { + public HsBookingItemEntityPatcher(final HsBookingItem entity) { this.entity = entity; } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRbacEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRbacEntity.java new file mode 100644 index 00000000..5bd7b15d --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRbacEntity.java @@ -0,0 +1,83 @@ +package net.hostsharing.hsadminng.hs.booking.item; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import net.hostsharing.hsadminng.hs.booking.project.HsBookingProject; +import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; +import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; + +import jakarta.persistence.AttributeOverride; +import jakarta.persistence.AttributeOverrides; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import java.io.IOException; + +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Column.dependsOnColumn; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.ColumnValue.usingDefaultCase; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Nullable.NULLABLE; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.DELETE; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.INSERT; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.SELECT; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.UPDATE; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.ADMIN; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.AGENT; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.OWNER; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.TENANT; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL.directlyFetchedByDependsOnColumn; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.rbacViewFor; + +@Entity +@Table(name = "hs_booking_item_rv") +@SuperBuilder(toBuilder = true) +@Getter +@Setter +@NoArgsConstructor +@AttributeOverrides({ + @AttributeOverride(name = "uuid", column = @Column(name = "uuid")) +}) +public class HsBookingItemRbacEntity extends HsBookingItem { + + public static RbacView rbac() { + return rbacViewFor("bookingItem", HsBookingItemRbacEntity.class) + .withIdentityView(SQL.projection("caption")) + .withRestrictedViewOrderBy(SQL.expression("validity")) + .withUpdatableColumns("version", "caption", "validity", "resources") + .toRole("global", ADMIN).grantPermission(INSERT) // TODO.impl: Why is this necessary to insert test data? + .toRole("global", ADMIN).grantPermission(DELETE) + + .importEntityAlias("project", HsBookingProject.class, usingDefaultCase(), + dependsOnColumn("projectUuid"), + directlyFetchedByDependsOnColumn(), + NULLABLE) + .toRole("project", ADMIN).grantPermission(INSERT) + + .importEntityAlias("parentItem", HsBookingItemRbacEntity.class, usingDefaultCase(), + dependsOnColumn("parentItemUuid"), + directlyFetchedByDependsOnColumn(), + NULLABLE) + .toRole("parentItem", ADMIN).grantPermission(INSERT) + + .createRole(OWNER, (with) -> { + with.incomingSuperRole("project", AGENT); + with.incomingSuperRole("parentItem", AGENT); + }) + .createSubRole(ADMIN, (with) -> { + with.permission(UPDATE); + }) + .createSubRole(AGENT) + .createSubRole(TENANT, (with) -> { + with.outgoingSubRole("project", TENANT); + with.outgoingSubRole("parentItem", TENANT); + with.permission(SELECT); + }) + + .limitDiagramTo("bookingItem", "project", "global"); + } + + public static void main(String[] args) throws IOException { + rbac().generateWithBaseFileName("6-hs-booking/630-booking-item/6303-hs-booking-item-rbac"); + } +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRbacRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRbacRepository.java new file mode 100644 index 00000000..8c230445 --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRbacRepository.java @@ -0,0 +1,23 @@ +package net.hostsharing.hsadminng.hs.booking.item; + +import org.springframework.data.repository.Repository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface HsBookingItemRbacRepository extends HsBookingItemRepository, + Repository { + + Optional findByUuid(final UUID bookingItemUuid); + + List findByCaption(String bookingItemCaption); + + List findAllByProjectUuid(final UUID projectItemUuid); + + HsBookingItemRbacEntity save(HsBookingItemRbacEntity current); + + int deleteByUuid(final UUID uuid); + + long count(); +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRealEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRealEntity.java new file mode 100644 index 00000000..c9e0f8de --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRealEntity.java @@ -0,0 +1,24 @@ +package net.hostsharing.hsadminng.hs.booking.item; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +import jakarta.persistence.AttributeOverride; +import jakarta.persistence.AttributeOverrides; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; + + +@Entity +@Table(name = "hs_booking_item") +@SuperBuilder(toBuilder = true) +@Getter +@Setter +@NoArgsConstructor +@AttributeOverrides({ + @AttributeOverride(name = "uuid", column = @Column(name = "uuid")) +})public class HsBookingItemRealEntity extends HsBookingItem { +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRealRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRealRepository.java new file mode 100644 index 00000000..d9c509cc --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRealRepository.java @@ -0,0 +1,23 @@ +package net.hostsharing.hsadminng.hs.booking.item; + +import org.springframework.data.repository.Repository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface HsBookingItemRealRepository extends HsBookingItemRepository, + Repository { + + Optional findByUuid(final UUID bookingItemUuid); + + List findByCaption(String bookingItemCaption); + + List findAllByProjectUuid(final UUID projectItemUuid); + + HsBookingItemRealEntity save(HsBookingItemRealEntity current); + + int deleteByUuid(final UUID uuid); + + long count(); +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepository.java index 9ee9badc..98ba547c 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepository.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepository.java @@ -1,20 +1,18 @@ package net.hostsharing.hsadminng.hs.booking.item; -import org.springframework.data.repository.Repository; - import java.util.List; import java.util.Optional; import java.util.UUID; -public interface HsBookingItemRepository extends Repository { +public interface HsBookingItemRepository { - Optional findByUuid(final UUID bookingItemUuid); + Optional findByUuid(final UUID bookingItemUuid); - List findByCaption(String bookingItemCaption); + List findByCaption(String bookingItemCaption); - List findAllByProjectUuid(final UUID projectItemUuid); + List findAllByProjectUuid(final UUID projectItemUuid); - HsBookingItemEntity save(HsBookingItemEntity current); + E save(E current); int deleteByUuid(final UUID uuid); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidator.java index 7b596ad5..8176464e 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidator.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.booking.item.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItem; import net.hostsharing.hsadminng.hs.validation.HsEntityValidator; import net.hostsharing.hsadminng.hs.validation.ValidatableProperty; import org.apache.commons.lang3.BooleanUtils; @@ -14,14 +14,14 @@ import static java.util.Arrays.stream; import static java.util.Collections.emptyList; import static java.util.Optional.ofNullable; -public class HsBookingItemEntityValidator extends HsEntityValidator { +public class HsBookingItemEntityValidator extends HsEntityValidator { public HsBookingItemEntityValidator(final ValidatableProperty... properties) { super(properties); } @Override - public List validateEntity(final HsBookingItemEntity bookingItem) { + public List validateEntity(final HsBookingItem bookingItem) { // TODO.impl: HsBookingItemType could do this similar to HsHostingAssetType if ( bookingItem.getParentItem() == null && bookingItem.getProject() == null) { return List.of(bookingItem + ".'parentItem' or .'project' expected to be set, but both are null"); @@ -30,21 +30,21 @@ public class HsBookingItemEntityValidator extends HsEntityValidator validateContext(final HsBookingItemEntity bookingItem) { + public List validateContext(final HsBookingItem bookingItem) { return sequentiallyValidate( () -> optionallyValidate(bookingItem.getParentItem()), () -> validateAgainstSubEntities(bookingItem) ); } - private static List optionallyValidate(final HsBookingItemEntity bookingItem) { + private static List optionallyValidate(final HsBookingItem bookingItem) { return bookingItem != null ? enrich(prefix(bookingItem.toShortString(), ""), HsBookingItemEntityValidatorRegistry.forType(bookingItem.getType()).validateContext(bookingItem)) : emptyList(); } - protected List validateAgainstSubEntities(final HsBookingItemEntity bookingItem) { + protected List validateAgainstSubEntities(final HsBookingItem bookingItem) { return enrich(prefix(bookingItem.toShortString(), "resources"), Stream.concat( stream(propertyValidators) @@ -58,7 +58,7 @@ public class HsBookingItemEntityValidator extends HsEntityValidator propDef) { final var propName = propDef.propertyName(); final var propUnit = ofNullable(propDef.unit()).map(u -> " " + u).orElse(""); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorRegistry.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorRegistry.java index 388855ff..9387973a 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorRegistry.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorRegistry.java @@ -1,10 +1,11 @@ package net.hostsharing.hsadminng.hs.booking.item.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItem; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.validation.HsEntityValidator; import net.hostsharing.hsadminng.errors.MultiValidationException; +import jakarta.persistence.EntityManager; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -18,7 +19,7 @@ import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.PRIVAT public class HsBookingItemEntityValidatorRegistry { - private static final Map, HsEntityValidator> validators = new HashMap<>(); + private static final Map, HsEntityValidator> validators = new HashMap<>(); static { register(PRIVATE_CLOUD, new HsPrivateCloudBookingItemValidator()); register(CLOUD_SERVER, new HsCloudServerBookingItemValidator()); @@ -26,14 +27,14 @@ public class HsBookingItemEntityValidatorRegistry { register(MANAGED_WEBSPACE, new HsManagedWebspaceBookingItemValidator()); } - private static void register(final Enum type, final HsEntityValidator validator) { + private static void register(final Enum type, final HsEntityValidator validator) { stream(validator.propertyValidators).forEach( entry -> { entry.verifyConsistency(Map.entry(type, validator)); }); validators.put(type, validator); } - public static HsEntityValidator forType(final Enum type) { + public static HsEntityValidator forType(final Enum type) { if ( validators.containsKey(type)) { return validators.get(type); } @@ -44,14 +45,16 @@ public class HsBookingItemEntityValidatorRegistry { return validators.keySet(); } - public static List doValidate(final HsBookingItemEntity bookingItem) { - return HsEntityValidator.sequentiallyValidate( - () -> HsBookingItemEntityValidatorRegistry.forType(bookingItem.getType()).validateEntity(bookingItem), - () -> HsBookingItemEntityValidatorRegistry.forType(bookingItem.getType()).validateContext(bookingItem)); + public static List doValidate(final EntityManager em, final HsBookingItem bookingItem) { + return HsEntityValidator.doWithEntityManager(em, () -> + HsEntityValidator.sequentiallyValidate( + () -> HsBookingItemEntityValidatorRegistry.forType(bookingItem.getType()).validateEntity(bookingItem), + () -> HsBookingItemEntityValidatorRegistry.forType(bookingItem.getType()).validateContext(bookingItem)) + ); } - public static HsBookingItemEntity validated(final HsBookingItemEntity entityToSave) { - MultiValidationException.throwIfNotEmpty(doValidate(entityToSave)); + public static E validated(final EntityManager em, final E entityToSave) { + MultiValidationException.throwIfNotEmpty(doValidate(em, entityToSave)); return entityToSave; } } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidator.java index 4b02d4d3..3683e57c 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidator.java @@ -1,13 +1,15 @@ package net.hostsharing.hsadminng.hs.booking.item.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItem; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; +import net.hostsharing.hsadminng.hs.validation.HsEntityValidator; import net.hostsharing.hsadminng.hs.validation.IntegerProperty; import org.apache.commons.lang3.function.TriFunction; import java.util.List; +import java.util.Optional; import static java.util.Collections.emptyList; -import static java.util.Optional.ofNullable; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_MBOX_SETUP; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.EMAIL_ADDRESS; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MARIADB_DATABASE; @@ -38,9 +40,9 @@ class HsManagedWebspaceBookingItemValidator extends HsBookingItemEntityValidator ); } - private static TriFunction, Integer, List> unixUsers() { - return (final HsBookingItemEntity entity, final IntegerProperty prop, final Integer factor) -> { - final var unixUserCount = ofNullable(entity.getRelatedHostingAsset()) + private static TriFunction, Integer, List> unixUsers() { + return (final HsBookingItem entity, final IntegerProperty prop, final Integer factor) -> { + final var unixUserCount = fetchRelatedBookingItem(entity) .map(ha -> ha.getSubHostingAssets().stream() .filter(subAsset -> subAsset.getType() == UNIX_USER) .count()) @@ -53,9 +55,9 @@ class HsManagedWebspaceBookingItemValidator extends HsBookingItemEntityValidator }; } - private static TriFunction, Integer, List> databaseUsers() { - return (final HsBookingItemEntity entity, final IntegerProperty prop, final Integer factor) -> { - final var dbUserCount = ofNullable(entity.getRelatedHostingAsset()) + private static TriFunction, Integer, List> databaseUsers() { + return (final HsBookingItem entity, final IntegerProperty prop, final Integer factor) -> { + final var dbUserCount = fetchRelatedBookingItem(entity) .map(ha -> ha.getSubHostingAssets().stream() .filter(bi -> bi.getType() == PGSQL_USER || bi.getType() == MARIADB_USER ) .count()) @@ -68,9 +70,9 @@ class HsManagedWebspaceBookingItemValidator extends HsBookingItemEntityValidator }; } - private static TriFunction, Integer, List> databases() { - return (final HsBookingItemEntity entity, final IntegerProperty prop, final Integer factor) -> { - final var unixUserCount = ofNullable(entity.getRelatedHostingAsset()) + private static TriFunction, Integer, List> databases() { + return (final HsBookingItem entity, final IntegerProperty prop, final Integer factor) -> { + final var unixUserCount = fetchRelatedBookingItem(entity) .map(ha -> ha.getSubHostingAssets().stream() .filter(bi -> bi.getType()==PGSQL_USER || bi.getType()==MARIADB_USER ) .flatMap(domainEMailSetup -> domainEMailSetup.getSubHostingAssets().stream() @@ -85,9 +87,9 @@ class HsManagedWebspaceBookingItemValidator extends HsBookingItemEntityValidator }; } - private static TriFunction, Integer, List> eMailAddresses() { - return (final HsBookingItemEntity entity, final IntegerProperty prop, final Integer factor) -> { - final var unixUserCount = ofNullable(entity.getRelatedHostingAsset()) + private static TriFunction, Integer, List> eMailAddresses() { + return (final HsBookingItem entity, final IntegerProperty prop, final Integer factor) -> { + final var unixUserCount = fetchRelatedBookingItem(entity) .map(ha -> ha.getSubHostingAssets().stream() .filter(bi -> bi.getType() == DOMAIN_MBOX_SETUP) .flatMap(domainEMailSetup -> domainEMailSetup.getSubHostingAssets().stream() @@ -101,4 +103,13 @@ class HsManagedWebspaceBookingItemValidator extends HsBookingItemEntityValidator return emptyList(); }; } + + private static Optional fetchRelatedBookingItem(final HsBookingItem entity) { + // FIXME: cache the result + return HsEntityValidator.localEntityManager.get().createQuery( + "SELECT asset FROM HsHostingAssetRealEntity asset WHERE asset.bookingItem.uuid=:bookingItemUuid", + HsHostingAssetRealEntity.class) + .setParameter("bookingItemUuid", entity.getUuid()) + .getResultStream().findFirst(); // there are 0 or 1, never more + } } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProject.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProject.java index 9cdb4ecd..6c109ef5 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProject.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProject.java @@ -34,7 +34,7 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) @SuperBuilder(builderMethodName = "baseBuilder", toBuilder = true) -public class HsBookingProject implements Stringifyable, BaseEntity { +public abstract class HsBookingProject implements Stringifyable, BaseEntity { private static Stringify stringify = stringify(HsBookingProject.class) .withProp(HsBookingProject::getDebitor) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAsset.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAsset.java index 4e76adb7..53e3f992 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAsset.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAsset.java @@ -8,7 +8,8 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.Getter; import lombok.experimental.SuperBuilder; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItem; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProject; import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.hs.validation.PropertiesProvider; @@ -48,7 +49,7 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) @SuperBuilder(builderMethodName = "baseBuilder", toBuilder = true) -public class HsHostingAsset implements Stringifyable, BaseEntity, PropertiesProvider { +public abstract class HsHostingAsset implements Stringifyable, BaseEntity, PropertiesProvider { static Stringify stringify = stringify(HsHostingAsset.class) .withProp(HsHostingAsset::getType) @@ -69,7 +70,7 @@ public class HsHostingAsset implements Stringifyable, BaseEntity @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "bookingitemuuid") - private HsBookingItemEntity bookingItem; + private HsBookingItemRealEntity bookingItem; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "parentassetuuid") @@ -129,7 +130,7 @@ public class HsHostingAsset implements Stringifyable, BaseEntity public HsBookingProject getRelatedProject() { return Optional.ofNullable(getBookingItem()) - .map(HsBookingItemEntity::getRelatedProject) + .map(HsBookingItem::getRelatedProject) .orElseGet(() -> Optional.ofNullable(getParentAsset()) .map(HsHostingAsset::getRelatedProject) .orElse(null)); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetController.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetController.java index 6291f11c..b988d510 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetController.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetController.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRepository; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealRepository; import net.hostsharing.hsadminng.hs.hosting.asset.validators.HostingAssetEntitySaveProcessor; import net.hostsharing.hsadminng.hs.hosting.asset.validators.HostingAssetEntityValidatorRegistry; import net.hostsharing.hsadminng.hs.hosting.generated.api.v1.api.HsHostingAssetsApi; @@ -39,13 +39,13 @@ public class HsHostingAssetController implements HsHostingAssetsApi { private Mapper mapper; @Autowired - private HsHostingAssetRbacRepository assetRbacRepo; + private HsHostingAssetRbacRepository rbacAssetRepo; @Autowired - private HsHostingAssetRealRepository assetRealRepo; + private HsHostingAssetRealRepository realAssetRepo; @Autowired - private HsBookingItemRepository bookingItemRepo; + private HsBookingItemRealRepository relBookingItemRepo; @Override @Transactional(readOnly = true) @@ -57,7 +57,7 @@ public class HsHostingAssetController implements HsHostingAssetsApi { final HsHostingAssetTypeResource type) { context.define(currentUser, assumedRoles); - final var entities = assetRbacRepo.findAllByCriteria(debitorUuid, parentAssetUuid, HsHostingAssetType.of(type)); + final var entities = rbacAssetRepo.findAllByCriteria(debitorUuid, parentAssetUuid, HsHostingAssetType.of(type)); final var resources = mapper.mapList(entities, HsHostingAssetResource.class, ENTITY_TO_RESOURCE_POSTMAPPER); return ResponseEntity.ok(resources); @@ -79,7 +79,7 @@ public class HsHostingAssetController implements HsHostingAssetsApi { .preprocessEntity() .validateEntity() .prepareForSave() - .saveUsing(assetRbacRepo::save) + .saveUsing(rbacAssetRepo::save) .validateContext() .mapUsing(e -> mapper.map(e, HsHostingAssetResource.class)) .revampProperties(); @@ -101,7 +101,7 @@ public class HsHostingAssetController implements HsHostingAssetsApi { context.define(currentUser, assumedRoles); - final var result = assetRbacRepo.findByUuid(assetUuid); + final var result = rbacAssetRepo.findByUuid(assetUuid); return result .map(assetEntity -> ResponseEntity.ok( mapper.map(assetEntity, HsHostingAssetResource.class, ENTITY_TO_RESOURCE_POSTMAPPER))) @@ -116,7 +116,7 @@ public class HsHostingAssetController implements HsHostingAssetsApi { final UUID assetUuid) { context.define(currentUser, assumedRoles); - final var result = assetRbacRepo.deleteByUuid(assetUuid); + final var result = rbacAssetRepo.deleteByUuid(assetUuid); return result == 0 ? ResponseEntity.notFound().build() : ResponseEntity.noContent().build(); @@ -132,7 +132,7 @@ public class HsHostingAssetController implements HsHostingAssetsApi { context.define(currentUser, assumedRoles); - final var entity = assetRbacRepo.findByUuid(assetUuid).orElseThrow(); + final var entity = rbacAssetRepo.findByUuid(assetUuid).orElseThrow(); new HsHostingAssetEntityPatcher(em, entity).apply(body); @@ -140,7 +140,7 @@ public class HsHostingAssetController implements HsHostingAssetsApi { .preprocessEntity() .validateEntity() .prepareForSave() - .saveUsing(assetRbacRepo::save) + .saveUsing(rbacAssetRepo::save) .validateContext() .mapUsing(e -> mapper.map(e, HsHostingAssetResource.class)) .revampProperties(); @@ -151,12 +151,12 @@ public class HsHostingAssetController implements HsHostingAssetsApi { final BiConsumer RESOURCE_TO_ENTITY_POSTMAPPER = (resource, entity) -> { entity.putConfig(KeyValueMap.from(resource.getConfig())); if (resource.getBookingItemUuid() != null) { - entity.setBookingItem(bookingItemRepo.findByUuid(resource.getBookingItemUuid()) + entity.setBookingItem(relBookingItemRepo.findByUuid(resource.getBookingItemUuid()) .orElseThrow(() -> new EntityNotFoundException("ERROR: [400] bookingItemUuid %s not found".formatted( resource.getBookingItemUuid())))); } if (resource.getParentAssetUuid() != null) { - entity.setParentAsset(assetRealRepo.findByUuid(resource.getParentAssetUuid()) + entity.setParentAsset(realAssetRepo.findByUuid(resource.getParentAssetUuid()) .orElseThrow(() -> new EntityNotFoundException("ERROR: [400] parentAssetUuid %s not found".formatted( resource.getParentAssetUuid())))); } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacEntity.java index 18b68c62..be568944 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacEntity.java @@ -4,7 +4,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItem; import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRbacEntity; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; @@ -47,7 +47,7 @@ public class HsHostingAssetRbacEntity extends HsHostingAsset { .withUpdatableColumns("version", "caption", "config", "assignedToAssetUuid", "alarmContactUuid") .toRole(GLOBAL, ADMIN).grantPermission(INSERT) // TODO.impl: Why is this necessary to insert test data? - .importEntityAlias("bookingItem", HsBookingItemEntity.class, usingDefaultCase(), + .importEntityAlias("bookingItem", HsBookingItem.class, usingDefaultCase(), dependsOnColumn("bookingItemUuid"), directlyFetchedByDependsOnColumn(), NULLABLE) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java index 9b8e1403..51b6de46 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java @@ -1,7 +1,7 @@ package net.hostsharing.hsadminng.hs.hosting.asset; import lombok.AllArgsConstructor; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItem; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.booking.item.Node; @@ -376,7 +376,7 @@ class EntityTypeRelation { return (Set) result; } - static EntityTypeRelation requires(final HsBookingItemType bookingItemType) { + static EntityTypeRelation requires(final HsBookingItemType bookingItemType) { return new EntityTypeRelation<>( REQUIRED, BOOKING_ITEM, diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntitySaveProcessor.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntitySaveProcessor.java index b622c2fa..c5951f45 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntitySaveProcessor.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntitySaveProcessor.java @@ -72,8 +72,10 @@ public class HostingAssetEntitySaveProcessor { /// validates the entity within it's parent and child hierarchy (e.g. totals validators and other limits) public HostingAssetEntitySaveProcessor validateContext() { step("validateContext", "mapUsing"); - MultiValidationException.throwIfNotEmpty(validator.validateContext(entity)); - return this; + return HsEntityValidator.doWithEntityManager(em, () -> { + MultiValidationException.throwIfNotEmpty(validator.validateContext(entity)); + return this; + }); } /// maps entity to JSON resource representation diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntityValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntityValidator.java index 472502f6..24b3a1cc 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntityValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntityValidator.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItem; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.booking.item.validators.HsBookingItemEntityValidatorRegistry; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAsset; @@ -27,7 +27,7 @@ public abstract class HostingAssetEntityValidator extends HsEntityValidator[] NO_EXTRA_PROPERTIES = new ValidatableProperty[0]; - private final ReferenceValidator bookingItemReferenceValidation; + private final ReferenceValidator bookingItemReferenceValidation; private final ReferenceValidator parentAssetReferenceValidation; private final ReferenceValidator assignedToAssetReferenceValidation; private final HostingAssetEntityValidator.AlarmContact alarmContactValidation; @@ -41,7 +41,7 @@ public abstract class HostingAssetEntityValidator extends HsEntityValidator( assetType.parentAssetPolicy(), assetType.parentAssetTypes(), @@ -104,7 +104,7 @@ public abstract class HostingAssetEntityValidator extends HsEntityValidator optionallyValidate(final HsBookingItemEntity bookingItem) { + private static List optionallyValidate(final HsBookingItem bookingItem) { return bookingItem != null ? enrich( prefix(bookingItem.toShortString(), "bookingItem"), diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntityValidatorRegistry.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntityValidatorRegistry.java index 20fef401..5f7a453c 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntityValidatorRegistry.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntityValidatorRegistry.java @@ -3,7 +3,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAsset; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAsset; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; -import net.hostsharing.hsadminng.hs.hosting.generated.api.v1.model.HsHostingAssetResource; import net.hostsharing.hsadminng.hs.validation.HsEntityValidator; import java.util.*; @@ -54,13 +53,4 @@ public class HostingAssetEntityValidatorRegistry { public static Set> types() { return validators.keySet(); } - - @SuppressWarnings("unchecked") - private static Map asMap(final HsHostingAssetResource resource) { - if (resource.getConfig() instanceof Map map) { - return map; - } - throw new IllegalArgumentException("expected a Map, but got a " + resource.getConfig().getClass()); - } - } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java index dfa55752..2b9c8c54 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java @@ -21,6 +21,8 @@ import static net.hostsharing.hsadminng.hs.validation.ValidatableProperty.Comput // TODO.refa: rename to HsEntityProcessor, also subclasses public abstract class HsEntityValidator { + public static final ThreadLocal localEntityManager = new ThreadLocal<>(); + public final ValidatableProperty[] propertyValidators; public > HsEntityValidator(final ValidatableProperty... validators) { @@ -39,6 +41,16 @@ public abstract class HsEntityValidator { return String.join(".", parts); } + public static R doWithEntityManager(final EntityManager em, final Supplier code) { + localEntityManager.set(em); + try { + return code.get(); + } catch (final RuntimeException e) { + localEntityManager.remove(); + throw e; + } + } + public abstract List validateEntity(final E entity); public abstract List validateContext(final E entity); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/validation/ValidatableProperty.java b/src/main/java/net/hostsharing/hsadminng/hs/validation/ValidatableProperty.java index 696f645b..d0966a5e 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/validation/ValidatableProperty.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/validation/ValidatableProperty.java @@ -5,7 +5,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.experimental.Accessors; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItem; import net.hostsharing.hsadminng.mapper.Array; import org.apache.commons.lang3.function.TriFunction; @@ -73,7 +73,7 @@ public abstract class ValidatableProperty

, T private boolean isTotalsValidator = false; @JsonIgnore - private List>> asTotalLimitValidators; // TODO.impl: move to BookingItemIntegerProperty + private List>> asTotalLimitValidators; // TODO.impl: move to BookingItemIntegerProperty private Integer thresholdPercentage; // TODO.impl: move to IntegerProperty @@ -151,8 +151,8 @@ public abstract class ValidatableProperty

, T if (asTotalLimitValidators == null) { asTotalLimitValidators = new ArrayList<>(); } - final TriFunction, Integer, List> validator = - (final HsBookingItemEntity entity, final IntegerProperty prop, final Integer factor) -> { + final TriFunction, Integer, List> validator = + (final HsBookingItem entity, final IntegerProperty prop, final Integer factor) -> { final var total = entity.getSubBookingItems().stream() .map(server -> server.getResources().get(propertyName)) @@ -167,7 +167,7 @@ public abstract class ValidatableProperty

, T } return emptyList(); }; - asTotalLimitValidators.add((final HsBookingItemEntity entity) -> validator.apply(entity, (IntegerProperty)this, 1)); + asTotalLimitValidators.add((final HsBookingItem entity) -> validator.apply(entity, (IntegerProperty)this, 1)); return self(); } @@ -183,11 +183,11 @@ public abstract class ValidatableProperty

, T return thresholdPercentage; } - public ValidatableProperty eachComprising(final int factor, final TriFunction, Integer, List> validator) { + public ValidatableProperty eachComprising(final int factor, final TriFunction, Integer, List> validator) { if (asTotalLimitValidators == null) { asTotalLimitValidators = new ArrayList<>(); } - asTotalLimitValidators.add((final HsBookingItemEntity entity) -> validator.apply(entity, (IntegerProperty)this, factor)); + asTotalLimitValidators.add((final HsBookingItem entity) -> validator.apply(entity, (IntegerProperty)this, factor)); return this; } @@ -323,7 +323,7 @@ public abstract class ValidatableProperty

, T return value; } - public List validateTotals(final HsBookingItemEntity bookingItem) { + public List validateTotals(final HsBookingItem bookingItem) { if (asTotalLimitValidators==null) { return emptyList(); } diff --git a/src/test/java/net/hostsharing/hsadminng/arch/ArchitectureTest.java b/src/test/java/net/hostsharing/hsadminng/arch/ArchitectureTest.java index 8bc7aad0..8a51a3f2 100644 --- a/src/test/java/net/hostsharing/hsadminng/arch/ArchitectureTest.java +++ b/src/test/java/net/hostsharing/hsadminng/arch/ArchitectureTest.java @@ -11,7 +11,7 @@ import com.tngtech.archunit.lang.ArchRule; import com.tngtech.archunit.lang.ConditionEvents; import com.tngtech.archunit.lang.SimpleConditionEvent; import net.hostsharing.hsadminng.HsadminNgApplication; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItem; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.rbac.context.ContextBasedTest; import net.hostsharing.hsadminng.rbac.rbacgrant.RbacGrantsDiagramService; @@ -330,7 +330,7 @@ public class ArchitectureTest { ContextBasedTest.class, RbacGrantsDiagramService.class) .ignoreDependency( - HsBookingItemEntity.class, + HsBookingItem.class, HsHostingAssetRbacEntity.class); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/EntityManagerMock.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/EntityManagerMock.java new file mode 100644 index 00000000..3dfe6973 --- /dev/null +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/EntityManagerMock.java @@ -0,0 +1,28 @@ +package net.hostsharing.hsadminng.hs.booking; + +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; +import org.jetbrains.annotations.NotNull; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.TypedQuery; +import java.util.Optional; +import java.util.stream.Stream; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class EntityManagerMock { + public static @NotNull EntityManager createEntityManagerMockWithAssetQueryFake(final HsHostingAssetRealEntity asset) { + final var em = mock(EntityManager.class); + final var assetQuery = mock(TypedQuery.class); + final var assetStream = mock(Stream.class); + + when(em.createQuery(any(), any(Class.class))).thenReturn(assetQuery); + when(assetQuery.getResultStream()).thenReturn(assetStream); + when(assetQuery.setParameter(anyString(), any())).thenReturn(assetQuery); + when(assetStream.findFirst()).thenReturn(Optional.ofNullable(asset)); + return em; + } +} diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerAcceptanceTest.java index 00a868ef..539df3e5 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerAcceptanceTest.java @@ -44,7 +44,7 @@ class HsBookingItemControllerAcceptanceTest extends ContextBasedTestWithCleanup private Integer port; @Autowired - HsBookingItemRepository bookingItemRepo; + HsBookingItemRealRepository realBookingItemRepo; @Autowired HsBookingProjectRealRepository realProjectRepo; @@ -191,9 +191,9 @@ class HsBookingItemControllerAcceptanceTest extends ContextBasedTestWithCleanup @Order(1) void globalAdmin_canGetArbitraryBookingItem() { context.define("superuser-alex@hostsharing.net"); - final var givenBookingItemUuid = bookingItemRepo.findByCaption("separate ManagedWebspace").stream() + final var givenBookingItemUuid = realBookingItemRepo.findByCaption("separate ManagedWebspace").stream() .filter(bi -> belongsToProject(bi, "D-1000111 default project")) - .map(HsBookingItemEntity::getUuid) + .map(HsBookingItem::getUuid) .findAny().orElseThrow(); RestAssured // @formatter:off @@ -225,9 +225,9 @@ class HsBookingItemControllerAcceptanceTest extends ContextBasedTestWithCleanup @Order(2) void normalUser_canNotGetUnrelatedBookingItem() { context.define("superuser-alex@hostsharing.net"); - final var givenBookingItemUuid = bookingItemRepo.findByCaption("separate ManagedServer").stream() + final var givenBookingItemUuid = realBookingItemRepo.findByCaption("separate ManagedServer").stream() .filter(bi -> belongsToProject(bi, "D-1000212 default project")) - .map(HsBookingItemEntity::getUuid) + .map(HsBookingItem::getUuid) .findAny().orElseThrow(); RestAssured // @formatter:off @@ -244,7 +244,7 @@ class HsBookingItemControllerAcceptanceTest extends ContextBasedTestWithCleanup @Order(3) void projectAdmin_canGetRelatedBookingItem() { context.define("superuser-alex@hostsharing.net"); - final var givenBookingItem = bookingItemRepo.findByCaption("separate ManagedServer").stream() + final var givenBookingItem = realBookingItemRepo.findByCaption("separate ManagedServer").stream() .filter(bi -> belongsToProject(bi, "D-1000313 default project")) .findAny().orElseThrow(); @@ -274,9 +274,9 @@ class HsBookingItemControllerAcceptanceTest extends ContextBasedTestWithCleanup """)); // @formatter:on } - private static boolean belongsToProject(final HsBookingItemEntity bi, final String projectCaption) { + private static boolean belongsToProject(final HsBookingItem bi, final String projectCaption) { return ofNullable(bi) - .map(HsBookingItemEntity::getProject) + .map(HsBookingItem::getProject) .filter(bp -> bp.getCaption().equals(projectCaption)) .isPresent(); } @@ -328,7 +328,7 @@ class HsBookingItemControllerAcceptanceTest extends ContextBasedTestWithCleanup // finally, the bookingItem is actually updated context.define("superuser-alex@hostsharing.net"); - assertThat(bookingItemRepo.findByUuid(givenBookingItem.getUuid())).isPresent().get() + assertThat(realBookingItemRepo.findByUuid(givenBookingItem.getUuid())).isPresent().get() .matches(mandate -> { assertThat(mandate.getProject().getDebitor().toString()).isEqualTo("booking-debitor(D-1000111: fir)"); assertThat(mandate.getValidFrom()).isEqualTo("2022-11-01"); @@ -358,7 +358,7 @@ class HsBookingItemControllerAcceptanceTest extends ContextBasedTestWithCleanup .statusCode(204); // @formatter:on // then the given bookingItem is gone - assertThat(bookingItemRepo.findByUuid(givenBookingItem.getUuid())).isEmpty(); + assertThat(realBookingItemRepo.findByUuid(givenBookingItem.getUuid())).isEmpty(); } @Test @@ -377,18 +377,18 @@ class HsBookingItemControllerAcceptanceTest extends ContextBasedTestWithCleanup .statusCode(404); // @formatter:on // then the given bookingItem is still there - assertThat(bookingItemRepo.findByUuid(givenBookingItem.getUuid())).isNotEmpty(); + assertThat(realBookingItemRepo.findByUuid(givenBookingItem.getUuid())).isNotEmpty(); } } @SafeVarargs - private HsBookingItemEntity givenSomeNewBookingItem(final String projectCaption, + private HsBookingItem givenSomeNewBookingItem(final String projectCaption, final HsBookingItemType hsBookingItemType, final Map.Entry... resources) { return jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net"); final var givenProject = realProjectRepo.findByCaption(projectCaption).stream() .findAny().orElseThrow(); - final var newBookingItem = HsBookingItemEntity.builder() + final var newBookingItem = HsBookingItemRealEntity.builder() .uuid(UUID.randomUUID()) .project(givenProject) .type(hsBookingItemType) @@ -398,7 +398,7 @@ class HsBookingItemControllerAcceptanceTest extends ContextBasedTestWithCleanup LocalDate.parse("2022-11-01"), LocalDate.parse("2023-03-31"))) .build(); - return bookingItemRepo.save(newBookingItem); + return realBookingItemRepo.save(newBookingItem); }).assertSuccessful().returnedValue(); } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerRestTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerRestTest.java index d3578bbd..55893753 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerRestTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemControllerRestTest.java @@ -54,7 +54,7 @@ class HsBookingItemControllerRestTest { HsBookingProjectRealRepository realProjectRepo; @MockBean - HsBookingItemRepository bookingItemRepo; + HsBookingItemRbacRepository rbacBookingItemRepo; @BeforeEach void init() { @@ -78,7 +78,7 @@ class HsBookingItemControllerRestTest { .uuid(invocation.getArgument(1)) .build() ); - when(bookingItemRepo.save(any())).thenAnswer(invocation -> invocation.getArgument(0)); + when(rbacBookingItemRepo.save(any())).thenAnswer(invocation -> invocation.getArgument(0)); // when mockMvc.perform(MockMvcRequestBuilders @@ -128,7 +128,7 @@ class HsBookingItemControllerRestTest { .uuid(invocation.getArgument(1)) .build() ); - when(bookingItemRepo.save(any())).thenAnswer(invocation -> invocation.getArgument(0)); + when(rbacBookingItemRepo.save(any())).thenAnswer(invocation -> invocation.getArgument(0)); // when mockMvc.perform(MockMvcRequestBuilders diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityPatcherUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityPatcherUnitTest.java index 40b45884..2113166c 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityPatcherUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityPatcherUnitTest.java @@ -29,7 +29,7 @@ import static org.mockito.Mockito.lenient; @ExtendWith(MockitoExtension.class) class HsBookingItemEntityPatcherUnitTest extends PatchUnitTestBase< HsBookingItemPatchResource, - HsBookingItemEntity + HsBookingItem > { private static final UUID INITIAL_BOOKING_ITEM_UUID = UUID.randomUUID(); @@ -62,13 +62,13 @@ class HsBookingItemEntityPatcherUnitTest extends PatchUnitTestBase< void initMocks() { lenient().when(em.getReference(eq(HsOfficeDebitorEntity.class), any())).thenAnswer(invocation -> HsOfficeDebitorEntity.builder().uuid(invocation.getArgument(1)).build()); - lenient().when(em.getReference(eq(HsBookingItemEntity.class), any())).thenAnswer(invocation -> - HsBookingItemEntity.builder().uuid(invocation.getArgument(1)).build()); + lenient().when(em.getReference(eq(HsBookingItem.class), any())).thenAnswer(invocation -> + HsBookingItemRbacEntity.builder().uuid(invocation.getArgument(1)).build()); } @Override - protected HsBookingItemEntity newInitialEntity() { - final var entity = new HsBookingItemEntity(); + protected HsBookingItem newInitialEntity() { + final var entity = new HsBookingItemRbacEntity(); entity.setUuid(INITIAL_BOOKING_ITEM_UUID); entity.setProject(PROJECT_TEST_ENTITY); entity.getResources().putAll(KeyValueMap.from(INITIAL_RESOURCES)); @@ -83,7 +83,7 @@ class HsBookingItemEntityPatcherUnitTest extends PatchUnitTestBase< } @Override - protected HsBookingItemEntityPatcher createPatcher(final HsBookingItemEntity bookingItem) { + protected HsBookingItemEntityPatcher createPatcher(final HsBookingItem bookingItem) { return new HsBookingItemEntityPatcher(bookingItem); } @@ -94,19 +94,19 @@ class HsBookingItemEntityPatcherUnitTest extends PatchUnitTestBase< "caption", HsBookingItemPatchResource::setCaption, PATCHED_CAPTION, - HsBookingItemEntity::setCaption), + HsBookingItem::setCaption), new SimpleProperty<>( "resources", HsBookingItemPatchResource::setResources, PATCH_RESOURCES, - HsBookingItemEntity::putResources, + HsBookingItem::putResources, PATCHED_RESOURCES) .notNullable(), new JsonNullableProperty<>( "validto", HsBookingItemPatchResource::setValidTo, PATCHED_VALID_TO, - HsBookingItemEntity::setValidTo) + HsBookingItem::setValidTo) ); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityUnitTest.java index 8085bbca..ef4ea740 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntityUnitTest.java @@ -20,7 +20,7 @@ class HsBookingItemEntityUnitTest { private MockedStatic localDateMockedStatic = Mockito.mockStatic(LocalDate.class, Mockito.CALLS_REAL_METHODS); - final HsBookingItemEntity givenBookingItem = HsBookingItemEntity.builder() + final HsBookingItem givenBookingItem = HsBookingItemRbacEntity.builder() .project(PROJECT_TEST_ENTITY) .type(HsBookingItemType.CLOUD_SERVER) .caption("some caption") @@ -43,7 +43,7 @@ class HsBookingItemEntityUnitTest { localDateMockedStatic.when(LocalDate::now).thenReturn(fakedToday); // when - final var newBookingItem = HsBookingItemEntity.builder().build(); + final var newBookingItem = HsBookingItemRbacEntity.builder().build(); // then assertThat(newBookingItem.getValidity().toString()).isEqualTo("Range{lower=2024-05-01, upper=null, mask=82, clazz=class java.time.LocalDate}"); @@ -53,7 +53,7 @@ class HsBookingItemEntityUnitTest { void toStringContainsAllPropertiesAndResourcesSortedByKey() { final var result = givenBookingItem.toString(); - assertThat(result).isEqualToIgnoringWhitespace("HsBookingItemEntity(CLOUD_SERVER, some caption, D-1234500:test project, [2020-01-01,2031-01-01), { \"CPU\": 2, \"HDD-storage\": 2048, \"SSD-storage\": 512 })"); + assertThat(result).isEqualToIgnoringWhitespace("HsBookingItem(CLOUD_SERVER, some caption, D-1234500:test project, [2020-01-01,2031-01-01), { \"CPU\": 2, \"HDD-storage\": 2048, \"SSD-storage\": 512 })"); } @Test diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java index e91cdd95..0a40aabf 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java @@ -39,7 +39,7 @@ import static org.assertj.core.api.Assertions.assertThat; class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup { @Autowired - HsBookingItemRepository bookingItemRepo; + HsBookingItemRbacRepository rbacBookingItemRepo; @Autowired HsBookingProjectRealRepository realProjectRepo; @@ -69,27 +69,27 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup public void testHostsharingAdmin_withoutAssumedRole_canCreateNewBookingItem() { // given context("superuser-alex@hostsharing.net"); - final var count = bookingItemRepo.count(); + final var count = rbacBookingItemRepo.count(); final var givenDebitor = debitorRepo.findDebitorByOptionalNameLike("First").get(0); final var givenProject = realProjectRepo.findAllByDebitorUuid(givenDebitor.getUuid()).get(0); // when final var result = attempt(em, () -> { - final var newBookingItem = HsBookingItemEntity.builder() + final var newBookingItem = HsBookingItemRbacEntity.builder() .project(givenProject) .type(HsBookingItemType.CLOUD_SERVER) .caption("some new booking item") .validity(Range.closedOpen( LocalDate.parse("2020-01-01"), LocalDate.parse("2023-01-01"))) .build(); - return toCleanup(bookingItemRepo.save(newBookingItem)); + return toCleanup(rbacBookingItemRepo.save(newBookingItem)); }); // then result.assertSuccessful(); - assertThat(result.returnedValue()).isNotNull().extracting(HsBookingItemEntity::getUuid).isNotNull(); + assertThat(result.returnedValue()).isNotNull().extracting(HsBookingItem::getUuid).isNotNull(); assertThatBookingItemIsPersisted(result.returnedValue()); - assertThat(bookingItemRepo.count()).isEqualTo(count + 1); + assertThat(rbacBookingItemRepo.count()).isEqualTo(count + 1); } @Test @@ -103,14 +103,14 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup attempt(em, () -> { final var givenDebitor = debitorRepo.findDebitorByOptionalNameLike("First").get(0); final var givenProject = realProjectRepo.findAllByDebitorUuid(givenDebitor.getUuid()).get(0); - final var newBookingItem = HsBookingItemEntity.builder() + final var newBookingItem = HsBookingItemRbacEntity.builder() .project(givenProject) .type(MANAGED_WEBSPACE) .caption("some new booking item") .validity(Range.closedOpen( LocalDate.parse("2020-01-01"), LocalDate.parse("2023-01-01"))) .build(); - return toCleanup(bookingItemRepo.save(newBookingItem)); + return toCleanup(rbacBookingItemRepo.save(newBookingItem)); }); // then @@ -146,9 +146,9 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup null)); } - private void assertThatBookingItemIsPersisted(final HsBookingItemEntity saved) { - final var found = bookingItemRepo.findByUuid(saved.getUuid()); - assertThat(found).isNotEmpty().map(HsBookingItemEntity::toString).get().isEqualTo(saved.toString()); + private void assertThatBookingItemIsPersisted(final HsBookingItem saved) { + final var found = rbacBookingItemRepo.findByUuid(saved.getUuid()); + assertThat(found).isNotEmpty().map(HsBookingItem::toString).get().isEqualTo(saved.toString()); } } @@ -165,17 +165,14 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup .findAny().orElseThrow().getUuid(); // when - final var result = bookingItemRepo.findAllByProjectUuid(projectUuid); + final var result = rbacBookingItemRepo.findAllByProjectUuid(projectUuid); // then allTheseBookingItemsAreReturned( result, - "HsBookingItemEntity(MANAGED_SERVER, separate ManagedServer, D-1000212:D-1000212 default project, [2022-10-01,), { CPU: 2, RAM: 8, SSD: 500, Traffic: 500 })", - "HsBookingItemEntity(MANAGED_WEBSPACE, separate ManagedWebspace, D-1000212:D-1000212 default project, [2022-10-01,), { Daemons: 0, Multi: 1, SSD: 100, Traffic: 50 })", - "HsBookingItemEntity(PRIVATE_CLOUD, some PrivateCloud, D-1000212:D-1000212 default project, [2024-04-01,), { CPU: 10, HDD: 10000, RAM: 32, SSD: 4000, Traffic: 2000 })"); - assertThat(result.stream().filter(bi -> bi.getRelatedHostingAsset()!=null).findAny()) - .as("at least one relatedProject expected, but none found => fetching relatedProject does not work") - .isNotEmpty(); + "HsBookingItem(MANAGED_SERVER, separate ManagedServer, D-1000212:D-1000212 default project, [2022-10-01,), { CPU: 2, RAM: 8, SSD: 500, Traffic: 500 })", + "HsBookingItem(MANAGED_WEBSPACE, separate ManagedWebspace, D-1000212:D-1000212 default project, [2022-10-01,), { Daemons: 0, Multi: 1, SSD: 100, Traffic: 50 })", + "HsBookingItem(PRIVATE_CLOUD, some PrivateCloud, D-1000212:D-1000212 default project, [2024-04-01,), { CPU: 10, HDD: 10000, RAM: 32, SSD: 4000, Traffic: 2000 })"); } @Test @@ -190,14 +187,14 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup .findAny().orElseThrow().getUuid(); // when: - final var result = bookingItemRepo.findAllByProjectUuid(projectUuid); + final var result = rbacBookingItemRepo.findAllByProjectUuid(projectUuid); // then: exactlyTheseBookingItemsAreReturned( result, - "HsBookingItemEntity(MANAGED_SERVER, separate ManagedServer, D-1000111:D-1000111 default project, [2022-10-01,), { CPU : 2, RAM : 8, SSD : 500, Traffic : 500 })", - "HsBookingItemEntity(MANAGED_WEBSPACE, separate ManagedWebspace, D-1000111:D-1000111 default project, [2022-10-01,), { Daemons : 0, Multi : 1, SSD : 100, Traffic : 50 })", - "HsBookingItemEntity(PRIVATE_CLOUD, some PrivateCloud, D-1000111:D-1000111 default project, [2024-04-01,), { CPU : 10, HDD : 10000, RAM : 32, SSD : 4000, Traffic : 2000 })"); + "HsBookingItem(MANAGED_SERVER, separate ManagedServer, D-1000111:D-1000111 default project, [2022-10-01,), { CPU : 2, RAM : 8, SSD : 500, Traffic : 500 })", + "HsBookingItem(MANAGED_WEBSPACE, separate ManagedWebspace, D-1000111:D-1000111 default project, [2022-10-01,), { Daemons : 0, Multi : 1, SSD : 100, Traffic : 50 })", + "HsBookingItem(PRIVATE_CLOUD, some PrivateCloud, D-1000111:D-1000111 default project, [2024-04-01,), { CPU : 10, HDD : 10000, RAM : 32, SSD : 4000, Traffic : 2000 })"); } } @@ -212,13 +209,13 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup // when final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); - final var foundBookingItem = em.find(HsBookingItemEntity.class, givenBookingItemUuid); + final var foundBookingItem = em.find(HsBookingItemRbacEntity.class, givenBookingItemUuid); foundBookingItem.getResources().put("CPU", 2); foundBookingItem.getResources().remove("SSD-storage"); foundBookingItem.getResources().put("HSD-storage", 2048); foundBookingItem.setValidity(Range.closedOpen( LocalDate.parse("2019-05-17"), LocalDate.parse("2023-01-01"))); - return toCleanup(bookingItemRepo.save(foundBookingItem)); + return toCleanup(rbacBookingItemRepo.save(foundBookingItem)); }); // then @@ -229,10 +226,10 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup }).assertSuccessful(); } - private void assertThatBookingItemActuallyInDatabase(final HsBookingItemEntity saved) { - final var found = bookingItemRepo.findByUuid(saved.getUuid()); + private void assertThatBookingItemActuallyInDatabase(final HsBookingItem saved) { + final var found = rbacBookingItemRepo.findByUuid(saved.getUuid()); assertThat(found).isNotEmpty().get().isNotSameAs(saved) - .extracting(HsBookingItemEntity::getResources) + .extracting(HsBookingItem::getResources) .extracting(Object::toString) .isEqualTo(saved.getResources().toString()); } @@ -250,14 +247,14 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup // when final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - bookingItemRepo.deleteByUuid(givenBookingItem.getUuid()); + rbacBookingItemRepo.deleteByUuid(givenBookingItem.getUuid()); }); // then result.assertSuccessful(); assertThat(jpaAttempt.transacted(() -> { context("superuser-fran@hostsharing.net", null); - return bookingItemRepo.findByUuid(givenBookingItem.getUuid()); + return rbacBookingItemRepo.findByUuid(givenBookingItem.getUuid()); }).assertSuccessful().returnedValue()).isEmpty(); } @@ -270,9 +267,9 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup // when final var result = jpaAttempt.transacted(() -> { context("person-FirbySusan@example.com", "hs_booking_project#D-1000111-D-1000111defaultproject:AGENT"); - assertThat(bookingItemRepo.findByUuid(givenBookingItem.getUuid())).isPresent(); + assertThat(rbacBookingItemRepo.findByUuid(givenBookingItem.getUuid())).isPresent(); - bookingItemRepo.deleteByUuid(givenBookingItem.getUuid()); + rbacBookingItemRepo.deleteByUuid(givenBookingItem.getUuid()); }); // then @@ -281,7 +278,7 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup "[403] Subject ", " is not allowed to delete hs_booking_item"); assertThat(jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - return bookingItemRepo.findByUuid(givenBookingItem.getUuid()); + return rbacBookingItemRepo.findByUuid(givenBookingItem.getUuid()); }).assertSuccessful().returnedValue()).isPresent(); // still there } @@ -296,7 +293,7 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup // when final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - return bookingItemRepo.deleteByUuid(givenBookingItem.getUuid()); + return rbacBookingItemRepo.deleteByUuid(givenBookingItem.getUuid()); }); // then @@ -314,7 +311,7 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup select currentTask, targetTable, targetOp from tx_journal_v where targettable = 'hs_booking_item'; - """); + """); // when @SuppressWarnings("unchecked") final List customerLogEntries = query.getResultList(); @@ -326,12 +323,12 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup "[creating booking-item test-data 1000313, hs_booking_item, INSERT]"); } - private HsBookingItemEntity givenSomeTemporaryBookingItem(final String projectCaption) { + private HsBookingItem givenSomeTemporaryBookingItem(final String projectCaption) { return jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); final var givenProject = realProjectRepo.findByCaption(projectCaption).stream() .findAny().orElseThrow(); - final var newBookingItem = HsBookingItemEntity.builder() + final var newBookingItem = HsBookingItemRbacEntity.builder() .project(givenProject) .type(MANAGED_SERVER) .caption("some temp booking item") @@ -342,23 +339,23 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup entry("SSD-storage", 256))) .build(); - return toCleanup(bookingItemRepo.save(newBookingItem)); + return toCleanup(rbacBookingItemRepo.save(newBookingItem)); }).assertSuccessful().returnedValue(); } void exactlyTheseBookingItemsAreReturned( - final List actualResult, + final List actualResult, final String... bookingItemNames) { assertThat(actualResult) - .extracting(HsBookingItemEntity::toString) + .extracting(HsBookingItem::toString) .extracting(string-> string.replaceAll("\\s+", " ")) .extracting(string-> string.replaceAll("\"", "")) .containsExactlyInAnyOrder(bookingItemNames); } - void allTheseBookingItemsAreReturned(final List actualResult, final String... bookingItemNames) { + void allTheseBookingItemsAreReturned(final List actualResult, final String... bookingItemNames) { assertThat(actualResult) - .extracting(HsBookingItemEntity::toString) + .extracting(HsBookingItem::toString) .extracting(string -> string.replaceAll("\\s+", " ")) .extracting(string -> string.replaceAll("\"", "")) .extracting(string -> string.replaceAll(" : ", ": ")) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/TestHsBookingItem.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/TestHsBookingItem.java index ec4cd2b4..3ea16dba 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/TestHsBookingItem.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/TestHsBookingItem.java @@ -12,7 +12,7 @@ import static net.hostsharing.hsadminng.hs.booking.project.TestHsBookingProject. @UtilityClass public class TestHsBookingItem { - public static final HsBookingItemEntity TEST_CLOUD_SERVER_BOOKING_ITEM = HsBookingItemEntity.builder() + public static final HsBookingItemRealEntity CLOUD_SERVER_BOOKING_ITEM_REAL_ENTITY = HsBookingItemRealEntity.builder() .project(PROJECT_TEST_ENTITY) .type(HsBookingItemType.CLOUD_SERVER) .caption("test cloud server booking item") @@ -25,7 +25,7 @@ public class TestHsBookingItem { .validity(Range.closedInfinite(LocalDate.of(2020, 1, 15))) .build(); - public static final HsBookingItemEntity TEST_MANAGED_SERVER_BOOKING_ITEM = HsBookingItemEntity.builder() + public static final HsBookingItemRealEntity MANAGED_SERVER_BOOKING_ITEM_REAL_ENTITY = HsBookingItemRealEntity.builder() .project(PROJECT_TEST_ENTITY) .type(HsBookingItemType.MANAGED_SERVER) .caption("test project booking item") @@ -38,8 +38,8 @@ public class TestHsBookingItem { .validity(Range.closedInfinite(LocalDate.of(2020, 1, 15))) .build(); - public static final HsBookingItemEntity TEST_MANAGED_WEBSPACE_BOOKING_ITEM = HsBookingItemEntity.builder() - .parentItem(TEST_MANAGED_SERVER_BOOKING_ITEM) + public static final HsBookingItemRealEntity MANAGED_WEBSPACE_BOOKING_ITEM_REAL_ENTITY = HsBookingItemRealEntity.builder() + .parentItem(MANAGED_SERVER_BOOKING_ITEM_REAL_ENTITY) .type(HsBookingItemType.MANAGED_WEBSPACE) .caption("test managed webspace item") .resources(Map.ofEntries( diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorUnitTest.java index d8423508..ddd3c5e0 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsBookingItemEntityValidatorUnitTest.java @@ -1,10 +1,11 @@ package net.hostsharing.hsadminng.hs.booking.item.validators; import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; import org.junit.jupiter.api.Test; +import jakarta.persistence.EntityManager; import jakarta.validation.ValidationException; import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.PRIVATE_CLOUD; @@ -23,17 +24,19 @@ class HsBookingItemEntityValidatorUnitTest { .caption("test project") .build(); + private EntityManager em; + @Test void rejectsInvalidEntity() { // given - final var cloudServerBookingItemEntity = HsBookingItemEntity.builder() + final var cloudServerBookingItemEntity = HsBookingItemRealEntity.builder() .type(CLOUD_SERVER) .project(project) .caption("Test-Server") .build(); // when - final var result = catchThrowable( ()-> HsBookingItemEntityValidatorRegistry.validated(cloudServerBookingItemEntity)); + final var result = catchThrowable( ()-> HsBookingItemEntityValidatorRegistry.validated(em, cloudServerBookingItemEntity)); // then assertThat(result).isInstanceOf(ValidationException.class) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsCloudServerBookingItemValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsCloudServerBookingItemValidatorUnitTest.java index 8a411bcc..ae7b9508 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsCloudServerBookingItemValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsCloudServerBookingItemValidatorUnitTest.java @@ -1,10 +1,11 @@ package net.hostsharing.hsadminng.hs.booking.item.validators; import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; import org.junit.jupiter.api.Test; +import jakarta.persistence.EntityManager; import java.util.Map; import static java.util.List.of; @@ -24,11 +25,12 @@ class HsCloudServerBookingItemValidatorUnitTest { .debitor(debitor) .caption("Test-Project") .build(); + private EntityManager em; @Test void validatesProperties() { // given - final var cloudServerBookingItemEntity = HsBookingItemEntity.builder() + final var cloudServerBookingItemEntity = HsBookingItemRealEntity.builder() .type(CLOUD_SERVER) .project(project) .caption("Test-Server") @@ -42,7 +44,7 @@ class HsCloudServerBookingItemValidatorUnitTest { .build(); // when - final var result = HsBookingItemEntityValidatorRegistry.doValidate(cloudServerBookingItemEntity); + final var result = HsBookingItemEntityValidatorRegistry.doValidate(em, cloudServerBookingItemEntity); // then assertThat(result).containsExactly("'D-12345:Test-Project:Test-Server.resources.SLA-EMail' is not expected but is set to 'true'"); @@ -68,7 +70,7 @@ class HsCloudServerBookingItemValidatorUnitTest { @Test void validatesExceedingPropertyTotals() { // given - final var subCloudServerBookingItemEntity = HsBookingItemEntity.builder() + final var subCloudServerBookingItemEntity = HsBookingItemRealEntity.builder() .type(CLOUD_SERVER) .caption("Test Cloud-Server") .resources(ofEntries( @@ -78,7 +80,7 @@ class HsCloudServerBookingItemValidatorUnitTest { entry("Traffic", 2500) )) .build(); - final HsBookingItemEntity subManagedServerBookingItemEntity = HsBookingItemEntity.builder() + final HsBookingItemRealEntity subManagedServerBookingItemEntity = HsBookingItemRealEntity.builder() .type(MANAGED_SERVER) .caption("Test Managed-Server") .resources(ofEntries( @@ -88,7 +90,7 @@ class HsCloudServerBookingItemValidatorUnitTest { entry("Traffic", 3000) )) .build(); - final var privateCloudBookingItemEntity = HsBookingItemEntity.builder() + final var privateCloudBookingItemEntity = HsBookingItemRealEntity.builder() .type(PRIVATE_CLOUD) .project(project) .caption("Test Cloud") @@ -107,7 +109,7 @@ class HsCloudServerBookingItemValidatorUnitTest { subCloudServerBookingItemEntity.setParentItem(privateCloudBookingItemEntity); // when - final var result = HsBookingItemEntityValidatorRegistry.doValidate(subCloudServerBookingItemEntity); + final var result = HsBookingItemEntityValidatorRegistry.doValidate(em, subCloudServerBookingItemEntity); // then assertThat(result).containsExactlyInAnyOrder( diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java index 2f8df1a9..d823277f 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java @@ -1,11 +1,14 @@ package net.hostsharing.hsadminng.hs.booking.item.validators; +import net.hostsharing.hsadminng.hs.booking.EntityManagerMock; import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; import java.util.Collection; import java.util.List; @@ -17,12 +20,14 @@ import static java.util.Arrays.stream; import static java.util.List.of; import static java.util.Map.entry; import static java.util.Map.ofEntries; +import static net.hostsharing.hsadminng.hs.booking.EntityManagerMock.createEntityManagerMockWithAssetQueryFake; import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.CLOUD_SERVER; import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_SERVER; import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_WEBSPACE; import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.PRIVATE_CLOUD; import static org.assertj.core.api.Assertions.assertThat; +@ExtendWith(MockitoExtension.class) class HsManagedServerBookingItemValidatorUnitTest { final HsBookingDebitorEntity debitor = HsBookingDebitorEntity.builder() @@ -36,7 +41,7 @@ class HsManagedServerBookingItemValidatorUnitTest { @Test void validatesProperties() { // given - final var mangedServerBookingItemEntity = HsBookingItemEntity.builder() + final var mangedServerBookingItemEntity = HsBookingItemRealEntity.builder() .type(MANAGED_SERVER) .project(project) .resources(Map.ofEntries( @@ -48,9 +53,10 @@ class HsManagedServerBookingItemValidatorUnitTest { entry("SLA-EMail", true) )) .build(); + final var em = EntityManagerMock.createEntityManagerMockWithAssetQueryFake(null); // when - final var result = HsBookingItemEntityValidatorRegistry.doValidate(mangedServerBookingItemEntity); + final var result = HsBookingItemEntityValidatorRegistry.doValidate(em, mangedServerBookingItemEntity); // then assertThat(result).containsExactly("'D-12345:Test-Project:null.resources.SLA-EMail' is expected to be false because SLA-Platform=BASIC but is true"); @@ -80,7 +86,7 @@ class HsManagedServerBookingItemValidatorUnitTest { @Test void validatesExceedingPropertyTotals() { // given - final var subCloudServerBookingItemEntity = HsBookingItemEntity.builder() + final var subCloudServerBookingItemEntity = HsBookingItemRealEntity.builder() .type(CLOUD_SERVER) .resources(ofEntries( entry("CPU", 2), @@ -89,7 +95,7 @@ class HsManagedServerBookingItemValidatorUnitTest { entry("Traffic", 2500) )) .build(); - final HsBookingItemEntity subManagedServerBookingItemEntity = HsBookingItemEntity.builder() + final HsBookingItemRealEntity subManagedServerBookingItemEntity = HsBookingItemRealEntity.builder() .type(MANAGED_SERVER) .resources(ofEntries( entry("CPU", 3), @@ -98,7 +104,7 @@ class HsManagedServerBookingItemValidatorUnitTest { entry("Traffic", 3000) )) .build(); - final var privateCloudBookingItemEntity = HsBookingItemEntity.builder() + final var privateCloudBookingItemEntity = HsBookingItemRealEntity.builder() .type(PRIVATE_CLOUD) .project(project) .resources(ofEntries( @@ -116,8 +122,10 @@ class HsManagedServerBookingItemValidatorUnitTest { subManagedServerBookingItemEntity.setParentItem(privateCloudBookingItemEntity); subCloudServerBookingItemEntity.setParentItem(privateCloudBookingItemEntity); + final var em = EntityManagerMock.createEntityManagerMockWithAssetQueryFake(null); + // when - final var result = HsBookingItemEntityValidatorRegistry.doValidate(subManagedServerBookingItemEntity); + final var result = HsBookingItemEntityValidatorRegistry.doValidate(em, subManagedServerBookingItemEntity); // then assertThat(result).containsExactlyInAnyOrder( @@ -131,7 +139,7 @@ class HsManagedServerBookingItemValidatorUnitTest { @Test void validatesExceedingTotals() { // given - final var managedWebspaceBookingItem = HsBookingItemEntity.builder() + final var managedWebspaceBookingItem = HsBookingItemRealEntity.builder() .type(MANAGED_WEBSPACE) .project(project) .caption("test Managed-Webspace") @@ -140,7 +148,8 @@ class HsManagedServerBookingItemValidatorUnitTest { entry("Traffic", 1000), entry("Multi", 1) )) - .relatedHostingAsset(HsHostingAssetRealEntity.builder() + .build(); + final var em = createEntityManagerMockWithAssetQueryFake(HsHostingAssetRealEntity.builder() .type(HsHostingAssetType.MANAGED_WEBSPACE) .identifier("abc00") .subHostingAssets(concat( @@ -157,13 +166,11 @@ class HsManagedServerBookingItemValidatorUnitTest { "%c%c.example.com", 10, HsHostingAssetType.EMAIL_ADDRESS ) - )) - .build() - ) - .build(); + )) + .build()); // when - final var result = HsBookingItemEntityValidatorRegistry.doValidate(managedWebspaceBookingItem); + final var result = HsBookingItemEntityValidatorRegistry.doValidate(em, managedWebspaceBookingItem); // then assertThat(result).containsExactlyInAnyOrder( diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidatorUnitTest.java index 3df01c5f..526c7b92 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidatorUnitTest.java @@ -1,10 +1,11 @@ package net.hostsharing.hsadminng.hs.booking.item.validators; import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; import org.junit.jupiter.api.Test; +import jakarta.persistence.EntityManager; import java.util.Map; import static java.util.Map.entry; @@ -20,11 +21,12 @@ class HsManagedWebspaceBookingItemValidatorUnitTest { .debitor(debitor) .caption("Test-Project") .build(); + private EntityManager em; @Test void validatesProperties() { // given - final var mangedServerBookingItemEntity = HsBookingItemEntity.builder() + final var mangedServerBookingItemEntity = HsBookingItemRealEntity.builder() .type(MANAGED_WEBSPACE) .project(project) .caption("Test Managed-Webspace") @@ -37,7 +39,7 @@ class HsManagedWebspaceBookingItemValidatorUnitTest { .build(); // when - final var result = HsBookingItemEntityValidatorRegistry.doValidate(mangedServerBookingItemEntity); + final var result = HsBookingItemEntityValidatorRegistry.doValidate(em, mangedServerBookingItemEntity); // then assertThat(result).containsExactlyInAnyOrder( diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsPrivateCloudBookingItemValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsPrivateCloudBookingItemValidatorUnitTest.java index 8f828e36..67e35806 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsPrivateCloudBookingItemValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsPrivateCloudBookingItemValidatorUnitTest.java @@ -1,10 +1,12 @@ package net.hostsharing.hsadminng.hs.booking.item.validators; import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; import org.junit.jupiter.api.Test; +import jakarta.persistence.EntityManager; + import static java.util.List.of; import static java.util.Map.entry; import static java.util.Map.ofEntries; @@ -23,11 +25,12 @@ class HsPrivateCloudBookingItemValidatorUnitTest { .debitor(debitor) .caption("Test-Project") .build(); + private EntityManager em; @Test void validatesPropertyTotals() { // given - final var privateCloudBookingItemEntity = HsBookingItemEntity.builder() + final var privateCloudBookingItemEntity = HsBookingItemRealEntity.builder() .type(PRIVATE_CLOUD) .project(PROJECT_TEST_ENTITY) .caption("myPC") @@ -40,7 +43,7 @@ class HsPrivateCloudBookingItemValidatorUnitTest { entry("SLA-EMail", 2) )) .subBookingItems(of( - HsBookingItemEntity.builder() + HsBookingItemRealEntity.builder() .type(MANAGED_SERVER) .caption("myMS-1") .resources(ofEntries( @@ -52,7 +55,7 @@ class HsPrivateCloudBookingItemValidatorUnitTest { entry("SLA-EMail", true) )) .build(), - HsBookingItemEntity.builder() + HsBookingItemRealEntity.builder() .type(CLOUD_SERVER) .caption("myMS-2") .resources(ofEntries( @@ -68,7 +71,7 @@ class HsPrivateCloudBookingItemValidatorUnitTest { .build(); // when - final var result = HsBookingItemEntityValidatorRegistry.doValidate(privateCloudBookingItemEntity); + final var result = HsBookingItemEntityValidatorRegistry.doValidate(em, privateCloudBookingItemEntity); // then assertThat(result).isEmpty(); @@ -77,7 +80,7 @@ class HsPrivateCloudBookingItemValidatorUnitTest { @Test void validatesExceedingPropertyTotals() { // given - final var privateCloudBookingItemEntity = HsBookingItemEntity.builder() + final var privateCloudBookingItemEntity = HsBookingItemRealEntity.builder() .project(project) .type(PRIVATE_CLOUD) .caption("myPC") @@ -90,7 +93,7 @@ class HsPrivateCloudBookingItemValidatorUnitTest { entry("SLA-EMail", 1) )) .subBookingItems(of( - HsBookingItemEntity.builder() + HsBookingItemRealEntity.builder() .type(MANAGED_SERVER) .caption("myMS-1") .resources(ofEntries( @@ -102,7 +105,7 @@ class HsPrivateCloudBookingItemValidatorUnitTest { entry("SLA-EMail", true) )) .build(), - HsBookingItemEntity.builder() + HsBookingItemRealEntity.builder() .type(CLOUD_SERVER) .caption("myMS-2") .resources(ofEntries( @@ -122,7 +125,7 @@ class HsPrivateCloudBookingItemValidatorUnitTest { .build(); // when - final var result = HsBookingItemEntityValidatorRegistry.doValidate(privateCloudBookingItemEntity); + final var result = HsBookingItemEntityValidatorRegistry.doValidate(em, privateCloudBookingItemEntity); // then assertThat(result).containsExactlyInAnyOrder( diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityPatcherUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityPatcherUnitTest.java index bfceb370..43f9c2b4 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityPatcherUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntityPatcherUnitTest.java @@ -38,14 +38,11 @@ class HsBookingProjectEntityPatcherUnitTest extends PatchUnitTestBase< void initMocks() { lenient().when(em.getReference(eq(HsOfficeDebitorEntity.class), any())).thenAnswer(invocation -> HsOfficeDebitorEntity.builder().uuid(invocation.getArgument(1)).build()); -// FIXME -// lenient().when(em.getReference(eq(HsBookingProject.class), any())).thenAnswer(invocation -> -// HsBookingProject.builder().uuid(invocation.getArgument(1)).build()); } @Override protected HsBookingProject newInitialEntity() { - final var entity = new HsBookingProject(); + final var entity = new HsBookingProjectRbacEntity(); entity.setUuid(INITIAL_BOOKING_PROJECT_UUID); entity.setDebitor(TEST_BOOKING_DEBITOR); entity.setCaption(INITIAL_CAPTION); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepositoryIntegrationTest.java index 21069a4e..b03b6c76 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectRepositoryIntegrationTest.java @@ -60,9 +60,8 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea @Nested class CreateBookingProject { - @ParameterizedTest - @EnumSource(TestCase.class) - public void testHostsharingAdmin_withoutAssumedRole_canCreateNewBookingProject(final TestCase testCase) { + @Test + public void testHostsharingAdmin_withoutAssumedRole_canCreateNewBookingProject() { // given context("superuser-alex@hostsharing.net"); // TODO.test: remove once we have a realDebitorRepo final var count = realProjectRepo.count(); @@ -74,7 +73,7 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea .debitor(givenDebitor) .caption("some new booking project") .build(); - return toCleanup(repoUnderTest(testCase).save(newBookingProject)); + return toCleanup(rbacProjectRepo.save(newBookingProject)); }); // then @@ -84,9 +83,8 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea assertThat(realProjectRepo.count()).isEqualTo(count + 1); } - @ParameterizedTest - @EnumSource(TestCase.class) - public void createsAndGrantsRoles(final TestCase testCase) { + @Test + public void createsAndGrantsRoles() { // given context("superuser-alex@hostsharing.net"); final var initialRoleNames = distinctRoleNamesOf(rawRoleRepo.findAll()); @@ -101,7 +99,7 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea .debitor(givenDebitor) .caption("some new booking project") .build(); - return toCleanup(repoUnderTest(testCase).save(newBookingProject)); + return toCleanup(rbacProjectRepo.save(newBookingProject)); }); // then diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java index 8234b349..3e3dd10a 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java @@ -4,8 +4,9 @@ import io.restassured.RestAssured; import io.restassured.http.ContentType; import net.hostsharing.hsadminng.HsadminNgApplication; import net.hostsharing.hsadminng.hash.HashGenerator; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRepository; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItem; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealRepository; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealRepository; import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; @@ -53,16 +54,16 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup HsHostingAssetRealRepository realAssetRepo; @Autowired - HsHostingAssetRbacRepository rbacAssetRepo; + HsHostingAssetRbacRepository rbacAssetRepo; // FIXME: remove? @Autowired - HsBookingItemRepository bookingItemRepo; + HsBookingItemRealRepository realBookingItemRepo; @Autowired HsBookingProjectRealRepository realProjectRepo; @Autowired - HsOfficeDebitorRepository debitorRepo; + HsOfficeDebitorRepository debitorRepo; // FIXME: remove? @Autowired HsOfficeContactRealRepository realContactRepo; @@ -680,24 +681,24 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup .findAny().orElseThrow(); } - HsBookingItemEntity newBookingItem( + HsBookingItem newBookingItem( final String projectCaption, final HsBookingItemType type, final String bookingItemCaption, final Map resources) { return jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net"); final var project = realProjectRepo.findByCaption(projectCaption).stream() .findAny().orElseThrow(); - final var bookingItem = HsBookingItemEntity.builder() + final var bookingItem = HsBookingItemRealEntity.builder() .project(project) .type(type) .caption(bookingItemCaption) .resources(resources) .build(); - return toCleanup(bookingItemRepo.save(bookingItem)); + return toCleanup(realBookingItemRepo.save(bookingItem)); }).assertSuccessful().returnedValue(); } - HsBookingItemEntity givenSomeNewBookingItem( + HsBookingItemRealEntity givenSomeNewBookingItem( final String projectCaption, final HsBookingItemType bookingItemType, final String bookingItemCaption) { @@ -711,13 +712,13 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup entry("Traffic", 250)); default -> new HashMap(); }; - final var newBookingItem = HsBookingItemEntity.builder() + final var newBookingItem = HsBookingItemRealEntity.builder() .project(project) .type(bookingItemType) .caption(bookingItemCaption) .resources(resources) .build(); - return toCleanup(bookingItemRepo.save(newBookingItem)); + return toCleanup(realBookingItemRepo.save(newBookingItem)); }).assertSuccessful().returnedValue(); } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerRestTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerRestTest.java index 9bd6b123..79e9908e 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerRestTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerRestTest.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.SneakyThrows; import net.hostsharing.hsadminng.context.Context; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRepository; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealRepository; import net.hostsharing.hsadminng.mapper.Array; import net.hostsharing.hsadminng.mapper.Mapper; import org.junit.jupiter.api.BeforeEach; @@ -28,8 +28,8 @@ import java.util.List; import java.util.Map; import static java.util.Map.entry; -import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_CLOUD_SERVER_BOOKING_ITEM; -import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.CLOUD_SERVER_BOOKING_ITEM_REAL_ENTITY; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.MANAGED_SERVER_BOOKING_ITEM_REAL_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY; import static net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealTestEntity.TEST_REAL_CONTACT; @@ -62,7 +62,7 @@ public class HsHostingAssetControllerRestTest { @MockBean @SuppressWarnings("unused") // bean needs to be present for HsHostingAssetController - private HsBookingItemRepository bookingItemRepo; + private HsBookingItemRealRepository realBookingItemRepo; @MockBean private HsHostingAssetRealRepository realAssetRepo; @@ -75,7 +75,7 @@ public class HsHostingAssetControllerRestTest { List.of( HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.CLOUD_SERVER) - .bookingItem(TEST_CLOUD_SERVER_BOOKING_ITEM) + .bookingItem(CLOUD_SERVER_BOOKING_ITEM_REAL_ENTITY) .identifier("vm1234") .caption("some fake cloud-server") .alarmContact(TEST_REAL_CONTACT) @@ -101,7 +101,7 @@ public class HsHostingAssetControllerRestTest { List.of( HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.MANAGED_SERVER) - .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) + .bookingItem(MANAGED_SERVER_BOOKING_ITEM_REAL_ENTITY) .identifier("vm1234") .caption("some fake managed-server") .alarmContact(TEST_REAL_CONTACT) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcherUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcherUnitTest.java index 2768cbbc..51020b16 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcherUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcherUnitTest.java @@ -15,7 +15,7 @@ import java.util.Map; import java.util.UUID; import java.util.stream.Stream; -import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_CLOUD_SERVER_BOOKING_ITEM; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.CLOUD_SERVER_BOOKING_ITEM_REAL_ENTITY; import static net.hostsharing.hsadminng.mapper.PatchMap.entry; import static net.hostsharing.hsadminng.mapper.PatchMap.patchMap; import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS; @@ -70,7 +70,7 @@ class HsHostingAssetEntityPatcherUnitTest extends PatchUnitTestBase< protected HsHostingAssetRbacEntity newInitialEntity() { final var entity = new HsHostingAssetRbacEntity(); entity.setUuid(INITIAL_BOOKING_ITEM_UUID); - entity.setBookingItem(TEST_CLOUD_SERVER_BOOKING_ITEM); + entity.setBookingItem(CLOUD_SERVER_BOOKING_ITEM_REAL_ENTITY); entity.getConfig().putAll(KeyValueMap.from(INITIAL_CONFIG)); entity.setCaption(INITIAL_CAPTION); entity.setAlarmContact(givenInitialContact); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityUnitTest.java index b5539292..4fe581e3 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityUnitTest.java @@ -5,13 +5,13 @@ import org.junit.jupiter.api.Test; import java.util.Map; import static java.util.Map.entry; -import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_CLOUD_SERVER_BOOKING_ITEM; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.CLOUD_SERVER_BOOKING_ITEM_REAL_ENTITY; import static org.assertj.core.api.Assertions.assertThat; class HsHostingAssetEntityUnitTest { final HsHostingAssetRealEntity givenParentAsset = HsHostingAssetRealEntity.builder() - .bookingItem(TEST_CLOUD_SERVER_BOOKING_ITEM) + .bookingItem(CLOUD_SERVER_BOOKING_ITEM_REAL_ENTITY) .type(HsHostingAssetType.MANAGED_SERVER) .identifier("vm1234") .caption("some managed asset") @@ -21,7 +21,7 @@ class HsHostingAssetEntityUnitTest { entry("HDD-storage", 2048))) .build(); final HsHostingAssetRealEntity givenWebspace = HsHostingAssetRealEntity.builder() - .bookingItem(TEST_CLOUD_SERVER_BOOKING_ITEM) + .bookingItem(CLOUD_SERVER_BOOKING_ITEM_REAL_ENTITY) .type(HsHostingAssetType.MANAGED_WEBSPACE) .parentAsset(givenParentAsset) .identifier("xyz00") diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepositoryIntegrationTest.java index fdecf223..f4a2bb4c 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepositoryIntegrationTest.java @@ -1,8 +1,8 @@ package net.hostsharing.hsadminng.hs.hosting.asset; import net.hostsharing.hsadminng.context.Context; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRepository; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealRepository; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRbacRepository; import net.hostsharing.hsadminng.rbac.rbacgrant.RawRbacGrantRepository; @@ -48,7 +48,7 @@ class HsHostingAssetRbacRepositoryIntegrationTest extends ContextBasedTestWithCl HsHostingAssetRbacRepository rbacAssetRepo; @Autowired - HsBookingItemRepository bookingItemRepo; + HsBookingItemRealRepository realBookingItemRepo; @Autowired HsBookingProjectRbacRepository projectRepo; @@ -425,8 +425,8 @@ class HsHostingAssetRbacRepositoryIntegrationTest extends ContextBasedTestWithCl }).assertSuccessful().returnedValue(); } - HsBookingItemEntity givenBookingItem(final String projectCaption, final String bookingItemCaption) { - return bookingItemRepo.findByCaption(bookingItemCaption).stream() + HsBookingItemRealEntity givenBookingItem(final String projectCaption, final String bookingItemCaption) { + return realBookingItemRepo.findByCaption(bookingItemCaption).stream() .filter(i -> i.getRelatedProject().getCaption().equals(projectCaption)) .findAny().orElseThrow(); } @@ -438,16 +438,16 @@ class HsHostingAssetRbacRepositoryIntegrationTest extends ContextBasedTestWithCl .findAny().orElseThrow(); } - HsBookingItemEntity newBookingItem( - final HsBookingItemEntity parentBookingItem, + HsBookingItemRealEntity newBookingItem( + final HsBookingItemRealEntity parentBookingItem, final HsBookingItemType type, final String caption) { - final var newBookingItem = HsBookingItemEntity.builder() + final var newBookingItem = HsBookingItemRealEntity.builder() .parentItem(parentBookingItem) .type(type) .caption(caption) .build(); - return toCleanup(bookingItemRepo.save(newBookingItem)); + return toCleanup(realBookingItemRepo.save(newBookingItem)); } void exactlyTheseAssetsAreReturned( diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetTestEntities.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetTestEntities.java index f85fbcb6..33a22b1b 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetTestEntities.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetTestEntities.java @@ -1,7 +1,7 @@ package net.hostsharing.hsadminng.hs.hosting.asset; -import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; -import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_WEBSPACE_BOOKING_ITEM; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.MANAGED_SERVER_BOOKING_ITEM_REAL_ENTITY; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.MANAGED_WEBSPACE_BOOKING_ITEM_REAL_ENTITY; public class HsHostingAssetTestEntities { @@ -9,28 +9,28 @@ public class HsHostingAssetTestEntities { .type(HsHostingAssetType.MANAGED_SERVER) .identifier("vm1234") .caption("some managed server") - .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) + .bookingItem(MANAGED_SERVER_BOOKING_ITEM_REAL_ENTITY) .build(); public static final HsHostingAssetRealEntity MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY = HsHostingAssetRealEntity.builder() .type(HsHostingAssetType.MANAGED_SERVER) .identifier("vm1234") .caption("some managed server") - .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) + .bookingItem(MANAGED_SERVER_BOOKING_ITEM_REAL_ENTITY) .build(); public static final HsHostingAssetRbacEntity MANAGED_WEBSPACE_HOSTING_ASSET_RBAC_TEST_ENTITY = HsHostingAssetRbacEntity.builder() .type(HsHostingAssetType.MANAGED_WEBSPACE) .identifier("xyz00") .caption("some managed webspace") - .bookingItem(TEST_MANAGED_WEBSPACE_BOOKING_ITEM) + .bookingItem(MANAGED_WEBSPACE_BOOKING_ITEM_REAL_ENTITY) .build(); public static final HsHostingAssetRealEntity MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY = HsHostingAssetRealEntity.builder() .type(HsHostingAssetType.MANAGED_WEBSPACE) .identifier("xyz00") .caption("some managed webspace") - .bookingItem(TEST_MANAGED_WEBSPACE_BOOKING_ITEM) + .bookingItem(MANAGED_WEBSPACE_BOOKING_ITEM_REAL_ENTITY) .build(); } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidatorUnitTest.java index 6dd21fb8..669a0c46 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidatorUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; @@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test; import java.util.Map; import static java.util.Map.entry; -import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_CLOUD_SERVER_BOOKING_ITEM; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.CLOUD_SERVER_BOOKING_ITEM_REAL_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.CLOUD_SERVER; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_SERVER; import static org.assertj.core.api.Assertions.assertThat; @@ -44,7 +44,7 @@ class HsCloudServerHostingAssetValidatorUnitTest { final var cloudServerHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(CLOUD_SERVER) .identifier("xyz99") - .bookingItem(TEST_CLOUD_SERVER_BOOKING_ITEM) + .bookingItem(CLOUD_SERVER_BOOKING_ITEM_REAL_ENTITY) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(cloudServerHostingAssetEntity.getType()); @@ -72,7 +72,7 @@ class HsCloudServerHostingAssetValidatorUnitTest { final var mangedServerHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_SERVER) .identifier("xyz00") - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) + .bookingItem(HsBookingItemRealEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); @@ -90,7 +90,7 @@ class HsCloudServerHostingAssetValidatorUnitTest { final var mangedServerHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(CLOUD_SERVER) .identifier("vm1234") - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) + .bookingItem(HsBookingItemRealEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_SERVER).build()) .assignedToAsset(HsHostingAssetRealEntity.builder().type(CLOUD_SERVER).build()) .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java index 3be5fbe4..41684c3b 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; @@ -8,6 +8,7 @@ import net.hostsharing.hsadminng.mapper.Array; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import jakarta.persistence.EntityManager; import java.util.ArrayList; import java.util.Map; @@ -30,6 +31,8 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest { .identifier("example.org") .build(); + private EntityManager em; + static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder validEntityBuilder() { return HsHostingAssetRbacEntity.builder() .type(DOMAIN_DNS_SETUP) @@ -139,7 +142,7 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest { void rejectsInvalidReferencedEntities() { // given final var mangedServerHostingAssetEntity = validEntityBuilder() - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) + .bookingItem(HsBookingItemRealEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) .parentAsset(null) .assignedToAsset(HsHostingAssetRealEntity.builder().type(DOMAIN_SETUP).build()) .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainHttpSetupHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainHttpSetupHostingAssetValidatorUnitTest.java index 6bd5e536..4705a99e 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainHttpSetupHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainHttpSetupHostingAssetValidatorUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; @@ -109,7 +109,7 @@ class HsDomainHttpSetupHostingAssetValidatorUnitTest { void rejectsInvalidReferencedEntities() { // given final var mangedServerHostingAssetEntity = validEntityBuilder() - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) + .bookingItem(HsBookingItemRealEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .assignedToAsset(null) .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainMboxHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainMboxHostingAssetValidatorUnitTest.java index e8940f13..f8540d34 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainMboxHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainMboxHostingAssetValidatorUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; @@ -84,7 +84,7 @@ class HsDomainMboxHostingAssetValidatorUnitTest { void rejectsInvalidReferencedEntities() { // given final var mangedServerHostingAssetEntity = validEntityBuilder() - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) + .bookingItem(HsBookingItemRealEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .assignedToAsset(null) .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidatorUnitTest.java index 42e2ce66..3c8c8e2c 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidatorUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; @@ -96,7 +96,7 @@ class HsDomainSetupHostingAssetValidatorUnitTest { final var mangedServerHostingAssetEntity = validEntityBuilder() .parentAsset(HsHostingAssetRealEntity.builder().type(CLOUD_SERVER).build()) .assignedToAsset(HsHostingAssetRealEntity.builder().type(MANAGED_SERVER).build()) - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) + .bookingItem(HsBookingItemRealEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSmtpSetupHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSmtpSetupHostingAssetValidatorUnitTest.java index 8d87298e..e8242260 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSmtpSetupHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSmtpSetupHostingAssetValidatorUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder; @@ -85,7 +85,7 @@ class HsDomainSmtpSetupHostingAssetValidatorUnitTest { void rejectsInvalidReferencedEntities() { // given final var mangedServerHostingAssetEntity = validEntityBuilder() - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) + .bookingItem(HsBookingItemRealEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .assignedToAsset(null) .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidatorUnitTest.java index 8d27b9df..a06d3c5b 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidatorUnitTest.java @@ -9,7 +9,7 @@ import java.util.HashMap; import java.util.Map; import static java.util.Map.ofEntries; -import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.MANAGED_SERVER_BOOKING_ITEM_REAL_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_MBOX_SETUP; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.EMAIL_ADDRESS; @@ -174,7 +174,7 @@ class HsEMailAddressHostingAssetValidatorUnitTest { void validatesInvalidReferences() { // given final var emailAddressHostingAssetEntity = validEntityBuilder() - .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) + .bookingItem(MANAGED_SERVER_BOOKING_ITEM_REAL_ENTITY) .parentAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) .assignedToAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAliasHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAliasHostingAssetValidatorUnitTest.java index 6c197d07..7d43b129 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAliasHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAliasHostingAssetValidatorUnitTest.java @@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test; import java.util.Map; import static java.util.Map.entry; -import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.MANAGED_SERVER_BOOKING_ITEM_REAL_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetTestEntities.MANAGED_WEBSPACE_HOSTING_ASSET_REAL_TEST_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.EMAIL_ALIAS; @@ -127,7 +127,7 @@ class HsEMailAliasHostingAssetValidatorUnitTest { // given final var emailAliasHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(EMAIL_ALIAS) - .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) + .bookingItem(MANAGED_SERVER_BOOKING_ITEM_REAL_ENTITY) .parentAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) .assignedToAsset(MANAGED_SERVER_HOSTING_ASSET_REAL_TEST_ENTITY) .identifier("abc00-office") diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv4NumberHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv4NumberHostingAssetValidatorUnitTest.java index 6361dfb2..ea10190a 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv4NumberHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv4NumberHostingAssetValidatorUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; @@ -84,7 +84,7 @@ class HsIPv4NumberHostingAssetValidatorUnitTest { void rejectsInvalidReferencedEntities() { // given final var ipNumberHostingAssetEntity = validEntityBuilder() - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) + .bookingItem(HsBookingItemRealEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .assignedToAsset(HsHostingAssetRealEntity.builder().type(UNIX_USER).build()) .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv6NumberHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv6NumberHostingAssetValidatorUnitTest.java index 28220641..ce7fae6c 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv6NumberHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsIPv6NumberHostingAssetValidatorUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; @@ -84,7 +84,7 @@ class HsIPv6NumberHostingAssetValidatorUnitTest { void rejectsInvalidReferencedEntities() { // given final var ipNumberHostingAssetEntity = validEntityBuilder() - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) + .bookingItem(HsBookingItemRealEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .assignedToAsset(HsHostingAssetRealEntity.builder().type(UNIX_USER).build()) .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidatorUnitTest.java index 22d9aa54..d657f91c 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidatorUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; @@ -9,8 +9,8 @@ import org.junit.jupiter.api.Test; import java.util.Map; import static java.util.Map.entry; -import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_CLOUD_SERVER_BOOKING_ITEM; -import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.CLOUD_SERVER_BOOKING_ITEM_REAL_ENTITY; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.MANAGED_SERVER_BOOKING_ITEM_REAL_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.CLOUD_SERVER; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_SERVER; import static org.assertj.core.api.Assertions.assertThat; @@ -23,7 +23,7 @@ class HsManagedServerHostingAssetValidatorUnitTest { final var mangedWebspaceHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_SERVER) .identifier("vm1234") - .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) + .bookingItem(MANAGED_SERVER_BOOKING_ITEM_REAL_ENTITY) .parentAsset(HsHostingAssetRealEntity.builder().type(CLOUD_SERVER).build()) .assignedToAsset(HsHostingAssetRealEntity.builder().type(CLOUD_SERVER).build()) .config(Map.ofEntries( @@ -52,7 +52,7 @@ class HsManagedServerHostingAssetValidatorUnitTest { final var mangedServerHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_SERVER) .identifier("xyz00") - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.MANAGED_SERVER).build()) + .bookingItem(HsBookingItemRealEntity.builder().type(HsBookingItemType.MANAGED_SERVER).build()) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType()); @@ -70,7 +70,7 @@ class HsManagedServerHostingAssetValidatorUnitTest { final var mangedServerHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_SERVER) .identifier("xyz00") - .bookingItem(TEST_CLOUD_SERVER_BOOKING_ITEM) + .bookingItem(CLOUD_SERVER_BOOKING_ITEM_REAL_ENTITY) .parentAsset(HsHostingAssetRealEntity.builder().type(CLOUD_SERVER).build()) .assignedToAsset(HsHostingAssetRealEntity.builder().type(MANAGED_SERVER).build()) .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java index 6f195030..edb9924e 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java @@ -1,11 +1,15 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.EntityManagerMock; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; +import net.hostsharing.hsadminng.hs.validation.HsEntityValidator; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; import java.util.Map; import java.util.stream.Stream; @@ -16,9 +20,10 @@ import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANA import static org.assertj.core.api.Assertions.assertThat; import static net.hostsharing.hsadminng.hs.booking.project.TestHsBookingProject.PROJECT_TEST_ENTITY; +@ExtendWith(MockitoExtension.class) class HsManagedWebspaceHostingAssetValidatorUnitTest { - final HsBookingItemEntity managedServerBookingItem = HsBookingItemEntity.builder() + final HsBookingItemRealEntity managedServerBookingItem = HsBookingItemRealEntity.builder() .project(PROJECT_TEST_ENTITY) .type(HsBookingItemType.MANAGED_SERVER) .caption("Test Managed-Server") @@ -31,7 +36,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { entry("SLA-EMail", true) )) .build(); - final HsBookingItemEntity cloudServerBookingItem = managedServerBookingItem.toBuilder() + final HsBookingItemRealEntity cloudServerBookingItem = managedServerBookingItem.toBuilder() .type(HsBookingItemType.CLOUD_SERVER) .caption("Test Cloud-Server") .build(); @@ -63,7 +68,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { final var validator = HostingAssetEntityValidatorRegistry.forType(MANAGED_WEBSPACE); final var mangedWebspaceHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_WEBSPACE) - .bookingItem(HsBookingItemEntity.builder() + .bookingItem(HsBookingItemRealEntity.builder() .type(HsBookingItemType.MANAGED_WEBSPACE) .resources(Map.ofEntries(entry("SSD", 25), entry("Traffic", 250))) .build()) @@ -71,9 +76,11 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { .identifier("xyz00") .isLoaded(true) .build(); + final var em = EntityManagerMock.createEntityManagerMockWithAssetQueryFake(null); // when - final var result = validator.validateContext(mangedWebspaceHostingAssetEntity); + final var result = HsEntityValidator.doWithEntityManager(em, () -> + validator.validateContext(mangedWebspaceHostingAssetEntity)); // then assertThat(result).isEmpty(); @@ -85,7 +92,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { final var validator = HostingAssetEntityValidatorRegistry.forType(MANAGED_WEBSPACE); final var mangedWebspaceHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_WEBSPACE) - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.MANAGED_WEBSPACE).build()) + .bookingItem(HsBookingItemRealEntity.builder().type(HsBookingItemType.MANAGED_WEBSPACE).build()) .parentAsset(mangedServerAssetEntity) .identifier("xyz00") .build(); @@ -103,7 +110,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { final var validator = HostingAssetEntityValidatorRegistry.forType(MANAGED_WEBSPACE); final var mangedWebspaceHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_WEBSPACE) - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.MANAGED_WEBSPACE).build()) + .bookingItem(HsBookingItemRealEntity.builder().type(HsBookingItemType.MANAGED_WEBSPACE).build()) .parentAsset(mangedServerAssetEntity) .identifier("abc00") .config(Map.ofEntries( @@ -124,7 +131,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { final var validator = HostingAssetEntityValidatorRegistry.forType(MANAGED_WEBSPACE); final var mangedWebspaceHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_WEBSPACE) - .bookingItem(HsBookingItemEntity.builder() + .bookingItem(HsBookingItemRealEntity.builder() .type(HsBookingItemType.MANAGED_WEBSPACE) .project(PROJECT_TEST_ENTITY) .caption("some ManagedWebspace") @@ -133,12 +140,14 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { .parentAsset(mangedServerAssetEntity) .identifier("abc00") .build(); + final var em = EntityManagerMock.createEntityManagerMockWithAssetQueryFake(null); // when - final var result = Stream.concat( + final var result = HsEntityValidator.doWithEntityManager(em, () -> + Stream.concat( validator.validateEntity(mangedWebspaceHostingAssetEntity).stream(), validator.validateContext(mangedWebspaceHostingAssetEntity).stream()) - .toList(); + .toList()); // then assertThat(result).isEmpty(); @@ -150,7 +159,7 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest { final var validator = HostingAssetEntityValidatorRegistry.forType(MANAGED_WEBSPACE); final var mangedWebspaceHostingAssetEntity = HsHostingAssetRbacEntity.builder() .type(MANAGED_WEBSPACE) - .bookingItem(HsBookingItemEntity.builder() + .bookingItem(HsBookingItemRealEntity.builder() .type(HsBookingItemType.MANAGED_SERVER) .caption("some ManagedServer") .resources(Map.ofEntries(entry("SSD", 25), entry("Traffic", 250))) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbDatabaseHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbDatabaseHostingAssetValidatorUnitTest.java index 33982abc..e96694f8 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbDatabaseHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbDatabaseHostingAssetValidatorUnitTest.java @@ -3,7 +3,11 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import jakarta.persistence.EntityManager; import java.util.HashMap; import java.util.stream.Stream; @@ -16,6 +20,7 @@ import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MARI import static net.hostsharing.hsadminng.mapper.PatchMap.entry; import static org.assertj.core.api.Assertions.assertThat; +@ExtendWith(MockitoExtension.class) class HsMariaDbDatabaseHostingAssetValidatorUnitTest { private static final HsHostingAssetRealEntity GIVEN_MARIADB_INSTANCE = HsHostingAssetRealEntity.builder() @@ -36,6 +41,9 @@ class HsMariaDbDatabaseHostingAssetValidatorUnitTest { ))) .build(); + @Mock + private EntityManager em; + private static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder givenValidMariaDbDatabaseBuilder() { return HsHostingAssetRbacEntity.builder() .type(MARIADB_DATABASE) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbInstanceHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbInstanceHostingAssetValidatorUnitTest.java index 212bb7a7..c569a4cf 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbInstanceHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbInstanceHostingAssetValidatorUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; @@ -80,7 +80,7 @@ class HsMariaDbInstanceHostingAssetValidatorUnitTest { void rejectsInvalidReferencedEntities() { // given final var mangedServerHostingAssetEntity = validEntityBuilder() - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) + .bookingItem(HsBookingItemRealEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .assignedToAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbUserHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbUserHostingAssetValidatorUnitTest.java index e675dc90..1c818c33 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbUserHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbUserHostingAssetValidatorUnitTest.java @@ -3,6 +3,9 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import jakarta.persistence.EntityManager; import java.util.HashMap; @@ -16,6 +19,7 @@ import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MARI import static net.hostsharing.hsadminng.mapper.PatchMap.entry; import static org.assertj.core.api.Assertions.assertThat; +@ExtendWith(MockitoExtension.class) class HsMariaDbUserHostingAssetValidatorUnitTest { private static final HsHostingAssetRealEntity GIVEN_MARIADB_INSTANCE = HsHostingAssetRealEntity.builder() @@ -25,7 +29,8 @@ class HsMariaDbUserHostingAssetValidatorUnitTest { .caption("some valid test MariaDB-Instance") .build(); - private EntityManager em = null; // not actually needed in these test cases + @Mock + private EntityManager em; private static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder givenValidMariaDbUserBuilder() { return HsHostingAssetRbacEntity.builder() diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlDatabaseHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlDatabaseHostingAssetValidatorUnitTest.java index 5abefdee..a74edd5a 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlDatabaseHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlDatabaseHostingAssetValidatorUnitTest.java @@ -1,10 +1,12 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; import java.util.HashMap; import java.util.stream.Stream; @@ -18,6 +20,7 @@ import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.PGSQ import static net.hostsharing.hsadminng.mapper.PatchMap.entry; import static org.assertj.core.api.Assertions.assertThat; +@ExtendWith(MockitoExtension.class) class HsPostgreSqlDatabaseHostingAssetValidatorUnitTest { private static final HsHostingAssetRealEntity GIVEN_PGSQL_INSTANCE = HsHostingAssetRealEntity.builder() @@ -83,7 +86,7 @@ class HsPostgreSqlDatabaseHostingAssetValidatorUnitTest { void rejectsInvalidReferences() { // given final var givenPgSqlUserHostingAsset = givenValidPgSqlDatabaseBuilder() - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) + .bookingItem(HsBookingItemRealEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) .parentAsset(HsHostingAssetRealEntity.builder().type(PGSQL_INSTANCE).build()) .assignedToAsset(HsHostingAssetRealEntity.builder().type(PGSQL_INSTANCE).build()) .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlInstanceHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlInstanceHostingAssetValidatorUnitTest.java index 5a1424fe..e277d202 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlInstanceHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlInstanceHostingAssetValidatorUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; @@ -80,7 +80,7 @@ class HsPostgreSqlInstanceHostingAssetValidatorUnitTest { void rejectsInvalidReferencedEntities() { // given final var mangedServerHostingAssetEntity = validEntityBuilder() - .bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) + .bookingItem(HsBookingItemRealEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build()) .parentAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .assignedToAsset(HsHostingAssetRealEntity.builder().type(MANAGED_WEBSPACE).build()) .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java index d776038d..922ad152 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java @@ -16,8 +16,8 @@ import java.util.HashMap; import java.util.stream.Stream; import static java.util.Map.ofEntries; -import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; -import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_WEBSPACE_BOOKING_ITEM; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.MANAGED_SERVER_BOOKING_ITEM_REAL_ENTITY; +import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.MANAGED_WEBSPACE_BOOKING_ITEM_REAL_ENTITY; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_WEBSPACE; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.UNIX_USER; import static net.hostsharing.hsadminng.mapper.PatchMap.entry; @@ -32,17 +32,17 @@ class HsUnixUserHostingAssetValidatorUnitTest { .type(HsHostingAssetType.MANAGED_SERVER) .identifier("vm1234") .caption("some managed server") - .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) + .bookingItem(MANAGED_SERVER_BOOKING_ITEM_REAL_ENTITY) .build(); private final HsHostingAssetRealEntity TEST_MANAGED_WEBSPACE_HOSTING_ASSET_REAL_ENTITY = HsHostingAssetRealEntity.builder() .type(MANAGED_WEBSPACE) - .bookingItem(TEST_MANAGED_WEBSPACE_BOOKING_ITEM) + .bookingItem(MANAGED_WEBSPACE_BOOKING_ITEM_REAL_ENTITY) .parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET_REAL_ENTITY) .identifier("abc00") .build(); private final HsHostingAssetRbacEntity TEST_MANAGED_WEBSPACE_HOSTING_ASSET_RBAC_ENTITY = HsHostingAssetRbacEntity.builder() .type(MANAGED_WEBSPACE) - .bookingItem(TEST_MANAGED_WEBSPACE_BOOKING_ITEM) + .bookingItem(MANAGED_WEBSPACE_BOOKING_ITEM_REAL_ENTITY) .parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET_REAL_ENTITY) .identifier("abc00") .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java index 4d2cb12b..83917afe 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java @@ -6,7 +6,8 @@ import net.hostsharing.hsadminng.context.Context; import net.hostsharing.hsadminng.hash.HashGenerator; import net.hostsharing.hsadminng.hash.HashGenerator.Algorithm; import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItem; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.booking.item.validators.HsBookingItemEntityValidatorRegistry; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; @@ -132,7 +133,7 @@ public class ImportHostingAssets extends ImportOfficeData { record Hive(int hive_id, String hive_name, int inet_addr_id, AtomicReference serverRef) {} static Map bookingProjects = new WriteOnceMap<>(); - static Map bookingItems = new WriteOnceMap<>(); + static Map bookingItems = new WriteOnceMap<>(); static Map hives = new WriteOnceMap<>(); static Map ipNumberAssets = new WriteOnceMap<>(); @@ -610,7 +611,7 @@ public class ImportHostingAssets extends ImportOfficeData { void validateBookingItems() { bookingItems.forEach((id, bi) -> { try { - HsBookingItemEntityValidatorRegistry.validated(bi); + HsBookingItemEntityValidatorRegistry.validated(em, bi); } catch (final Exception exc) { errors.add("validation failed for id:" + id + "( " + bi + "): " + exc.getMessage()); } @@ -959,11 +960,11 @@ public class ImportHostingAssets extends ImportOfficeData { return zonenfileName.substring(zonenfileName.length() - "vm0000.json".length()).substring(0, 6); } - private void persistRecursively(final Integer key, final HsBookingItemEntity bi) { + private void persistRecursively(final Integer key, final HsBookingItem bi) { if (bi.getParentItem() != null) { - persistRecursively(key, HsBookingItemEntityValidatorRegistry.validated(bi.getParentItem())); + persistRecursively(key, HsBookingItemEntityValidatorRegistry.validated(em, bi.getParentItem())); } - persist(key, HsBookingItemEntityValidatorRegistry.validated(bi)); + persist(key, HsBookingItemEntityValidatorRegistry.validated(em, bi)); } private void persistHostingAssets(final Map assets) { @@ -1065,7 +1066,7 @@ public class ImportHostingAssets extends ImportOfficeData { .isNull(); final var biType = determineBiType(basepacket_code); - final var bookingItem = HsBookingItemEntity.builder() + final var bookingItem = HsBookingItemRealEntity.builder() .type(biType) .caption("BI " + packet_name) .project(bookingProjects.get(bp_id)) -- 2.39.5 From 21f25ed888b00d9a4fe1b71c8c09363d804110be Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Mon, 19 Aug 2024 09:43:53 +0200 Subject: [PATCH 10/14] some cleanup --- .../hsadminng/hs/booking/item/HsBookingItem.java | 15 --------------- ...ManagedServerBookingItemValidatorUnitTest.java | 4 ++-- .../asset}/EntityManagerMock.java | 3 +-- .../HsHostingAssetControllerAcceptanceTest.java | 7 ------- ...agedWebspaceHostingAssetValidatorUnitTest.java | 2 +- 5 files changed, 4 insertions(+), 27 deletions(-) rename src/test/java/net/hostsharing/hsadminng/hs/{booking => hosting/asset}/EntityManagerMock.java (89%) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItem.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItem.java index ee9b5547..215f7d94 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItem.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItem.java @@ -101,21 +101,6 @@ public abstract class HsBookingItem implements Stringifyable, BaseEntity subBookingItems; -// FIXME - // @OneToOne(targetEntity = HsHostingAssetRealEntity.class, mappedBy="bookingItem") // does not work in case of subclass HsBookingItemRbacEntity -// // because that bookingItem refers to a HsBookingItemRealEntity, not ...Rbac... -// @OneToOne(fetch = FetchType.LAZY) -// @JoinFormula( -// referencedColumnName = "uuid", -// value = """ -// ( -// SELECT DISTINCT asset.uuid -// FROM hs_hosting_asset asset -// WHERE asset.uuid=uuid -// ) -// """) -// private HsHostingAssetRealEntity relatedHostingAsset; - @Transient private PatchableMapWrapper resourcesWrapper; diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java index d823277f..5d38b372 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedServerBookingItemValidatorUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.booking.item.validators; -import net.hostsharing.hsadminng.hs.booking.EntityManagerMock; +import net.hostsharing.hsadminng.hs.hosting.asset.EntityManagerMock; import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealEntity; @@ -20,7 +20,7 @@ import static java.util.Arrays.stream; import static java.util.List.of; import static java.util.Map.entry; import static java.util.Map.ofEntries; -import static net.hostsharing.hsadminng.hs.booking.EntityManagerMock.createEntityManagerMockWithAssetQueryFake; +import static net.hostsharing.hsadminng.hs.hosting.asset.EntityManagerMock.createEntityManagerMockWithAssetQueryFake; import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.CLOUD_SERVER; import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_SERVER; import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_WEBSPACE; diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/EntityManagerMock.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/EntityManagerMock.java similarity index 89% rename from src/test/java/net/hostsharing/hsadminng/hs/booking/EntityManagerMock.java rename to src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/EntityManagerMock.java index 3dfe6973..7b22695e 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/EntityManagerMock.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/EntityManagerMock.java @@ -1,6 +1,5 @@ -package net.hostsharing.hsadminng.hs.booking; +package net.hostsharing.hsadminng.hs.hosting.asset; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import org.jetbrains.annotations.NotNull; import jakarta.persistence.EntityManager; diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java index 3e3dd10a..9f689591 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java @@ -11,7 +11,6 @@ import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRealRepository; import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealRepository; -import net.hostsharing.hsadminng.hs.office.debitor.HsOfficeDebitorRepository; import net.hostsharing.hsadminng.rbac.test.ContextBasedTestWithCleanup; import net.hostsharing.hsadminng.rbac.test.JpaAttempt; import org.junit.jupiter.api.ClassOrderer; @@ -53,18 +52,12 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup @Autowired HsHostingAssetRealRepository realAssetRepo; - @Autowired - HsHostingAssetRbacRepository rbacAssetRepo; // FIXME: remove? - @Autowired HsBookingItemRealRepository realBookingItemRepo; @Autowired HsBookingProjectRealRepository realProjectRepo; - @Autowired - HsOfficeDebitorRepository debitorRepo; // FIXME: remove? - @Autowired HsOfficeContactRealRepository realContactRepo; diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java index edb9924e..386282f6 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidatorUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.EntityManagerMock; +import net.hostsharing.hsadminng.hs.hosting.asset.EntityManagerMock; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; -- 2.39.5 From 1da306470079e7dfb420ff585d4c5699bf2c68e1 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Mon, 19 Aug 2024 10:26:16 +0200 Subject: [PATCH 11/14] FIXME to TODO.perf --- .../item/validators/HsManagedWebspaceBookingItemValidator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidator.java index 3683e57c..a3248439 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/validators/HsManagedWebspaceBookingItemValidator.java @@ -105,7 +105,7 @@ class HsManagedWebspaceBookingItemValidator extends HsBookingItemEntityValidator } private static Optional fetchRelatedBookingItem(final HsBookingItem entity) { - // FIXME: cache the result + // TODO.perf: maybe we need to cache the result at least for a single valiationrun return HsEntityValidator.localEntityManager.get().createQuery( "SELECT asset FROM HsHostingAssetRealEntity asset WHERE asset.bookingItem.uuid=:bookingItemUuid", HsHostingAssetRealEntity.class) -- 2.39.5 From aa342d5dea7afe08044053cd22afbbd5f91ab2d0 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Mon, 19 Aug 2024 10:30:18 +0200 Subject: [PATCH 12/14] fix missing lenient --- .../hsadminng/hs/hosting/asset/EntityManagerMock.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/EntityManagerMock.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/EntityManagerMock.java index 7b22695e..5f6bdbcc 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/EntityManagerMock.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/EntityManagerMock.java @@ -9,8 +9,8 @@ import java.util.stream.Stream; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class EntityManagerMock { public static @NotNull EntityManager createEntityManagerMockWithAssetQueryFake(final HsHostingAssetRealEntity asset) { @@ -18,10 +18,10 @@ public class EntityManagerMock { final var assetQuery = mock(TypedQuery.class); final var assetStream = mock(Stream.class); - when(em.createQuery(any(), any(Class.class))).thenReturn(assetQuery); - when(assetQuery.getResultStream()).thenReturn(assetStream); - when(assetQuery.setParameter(anyString(), any())).thenReturn(assetQuery); - when(assetStream.findFirst()).thenReturn(Optional.ofNullable(asset)); + lenient().when(em.createQuery(any(), any(Class.class))).thenReturn(assetQuery); + lenient().when(assetQuery.getResultStream()).thenReturn(assetStream); + lenient().when(assetQuery.setParameter(anyString(), any())).thenReturn(assetQuery); + lenient().when(assetStream.findFirst()).thenReturn(Optional.ofNullable(asset)); return em; } } -- 2.39.5 From 048a976a1abfb709fc9b38ffbc6336a5df8e11da Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Mon, 19 Aug 2024 15:48:09 +0200 Subject: [PATCH 13/14] fix issues from code-review --- .../asset/HsHostingAssetController.java | 4 +- .../asset/HsHostingAssetRbacRepository.java | 2 +- .../asset/HsHostingAssetRealRepository.java | 4 +- .../asset/HsHostingAssetRepository.java | 24 ++++++++++ .../hs/validation/HsEntityValidator.java | 3 +- ...ostingAssetRepositoryIntegrationTest.java} | 47 ++++++++++++++++--- .../test/ContextBasedTestWithCleanup.java | 9 ++++ 7 files changed, 80 insertions(+), 13 deletions(-) create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepository.java rename src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/{HsHostingAssetRbacRepositoryIntegrationTest.java => HsHostingAssetRepositoryIntegrationTest.java} (92%) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetController.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetController.java index b988d510..4ae94c00 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetController.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetController.java @@ -45,7 +45,7 @@ public class HsHostingAssetController implements HsHostingAssetsApi { private HsHostingAssetRealRepository realAssetRepo; @Autowired - private HsBookingItemRealRepository relBookingItemRepo; + private HsBookingItemRealRepository realBookingItemRepo; @Override @Transactional(readOnly = true) @@ -151,7 +151,7 @@ public class HsHostingAssetController implements HsHostingAssetsApi { final BiConsumer RESOURCE_TO_ENTITY_POSTMAPPER = (resource, entity) -> { entity.putConfig(KeyValueMap.from(resource.getConfig())); if (resource.getBookingItemUuid() != null) { - entity.setBookingItem(relBookingItemRepo.findByUuid(resource.getBookingItemUuid()) + entity.setBookingItem(realBookingItemRepo.findByUuid(resource.getBookingItemUuid()) .orElseThrow(() -> new EntityNotFoundException("ERROR: [400] bookingItemUuid %s not found".formatted( resource.getBookingItemUuid())))); } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepository.java index af9908cc..c7f5aa34 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepository.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepository.java @@ -8,7 +8,7 @@ import java.util.Optional; import java.util.UUID; -public interface HsHostingAssetRbacRepository extends Repository { +public interface HsHostingAssetRbacRepository extends HsHostingAssetRepository, Repository { Optional findByUuid(final UUID serverUuid); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRealRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRealRepository.java index 2b40c96a..15a7de84 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRealRepository.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRealRepository.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -public interface HsHostingAssetRealRepository extends Repository { +public interface HsHostingAssetRealRepository extends HsHostingAssetRepository, Repository { Optional findByUuid(final UUID serverUuid); @@ -38,7 +38,7 @@ public interface HsHostingAssetRealRepository extends Repository { + + Optional findByUuid(final UUID serverUuid); + + List findByIdentifier(String assetIdentifier); + + List findAllByCriteriaImpl(UUID projectUuid, UUID parentAssetUuid, String type); + + default List findAllByCriteria(final UUID projectUuid, final UUID parentAssetUuid, final HsHostingAssetType type) { + return findAllByCriteriaImpl(projectUuid, parentAssetUuid, HsHostingAssetType.asString(type)); + } + + E save(HsHostingAsset current); + + int deleteByUuid(final UUID uuid); + + long count(); +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java index 2b9c8c54..ce353a7d 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/validation/HsEntityValidator.java @@ -45,9 +45,8 @@ public abstract class HsEntityValidator { localEntityManager.set(em); try { return code.get(); - } catch (final RuntimeException e) { + } finally { localEntityManager.remove(); - throw e; } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java similarity index 92% rename from src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepositoryIntegrationTest.java rename to src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java index f4a2bb4c..469fbdf1 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRbacRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java @@ -12,6 +12,8 @@ import net.hostsharing.hsadminng.rbac.test.ContextBasedTestWithCleanup; import net.hostsharing.hsadminng.rbac.test.JpaAttempt; 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.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -39,7 +41,7 @@ import static org.assertj.core.api.Assertions.assertThat; @DataJpaTest @Import({ Context.class, JpaAttempt.class }) -class HsHostingAssetRbacRepositoryIntegrationTest extends ContextBasedTestWithCleanup { +class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanup { @Autowired HsHostingAssetRealRepository realAssetRepo; @@ -203,13 +205,14 @@ class HsHostingAssetRbacRepositoryIntegrationTest extends ContextBasedTestWithCl @Nested class FindAssets { - @Test - public void globalAdmin_withoutAssumedRole_canViewArbitraryAssetsOfAllDebitors() { + @ParameterizedTest + @EnumSource(TestCase.class) + public void globalAdmin_withoutAssumedRole_canViewArbitraryAssetsOfAllDebitors(final TestCase testCase) { // given context("superuser-alex@hostsharing.net"); // when - final var result = rbacAssetRepo.findAllByCriteria(null, null, MANAGED_WEBSPACE); + final var result = repoUnderTest(testCase).findAllByCriteria(null, null, MANAGED_WEBSPACE); // then exactlyTheseAssetsAreReturned( @@ -451,13 +454,45 @@ class HsHostingAssetRbacRepositoryIntegrationTest extends ContextBasedTestWithCl } void exactlyTheseAssetsAreReturned( - final List actualResult, + final List actualResult, final String... serverNames) { assertThat(actualResult) - .extracting(HsHostingAssetRbacEntity::toString) + .extracting(HsHostingAsset::toString) .extracting(input -> input.replaceAll("\\s+", " ")) .extracting(input -> input.replaceAll("\"", "")) .extracting(input -> input.replaceAll("\" : ", "\": ")) .containsExactlyInAnyOrder(serverNames); } + + void allTheseBookingProjectsAreReturned( + final List actualResult, + final String... serverNames) { + assertThat(actualResult) + .extracting(HsHostingAsset::toString) + .extracting(input -> input.replaceAll("\\s+", " ")) + .extracting(input -> input.replaceAll("\"", "")) + .extracting(input -> input.replaceAll("\" : ", "\": ")) + .contains(serverNames); + } + + private HsHostingAssetRepository repoUnderTest(final HsHostingAssetRepositoryIntegrationTest.TestCase testCase) { + return testCase.repo(HsHostingAssetRepositoryIntegrationTest.this); + } + + enum TestCase { + REAL { + @Override + HsHostingAssetRepository repo(final HsHostingAssetRepositoryIntegrationTest test) { + return test.realAssetRepo; + } + }, + RBAC { + @Override + HsHostingAssetRepository repo(final HsHostingAssetRepositoryIntegrationTest test) { + return test.rbacAssetRepo; + } + }; + + abstract HsHostingAssetRepository repo(final HsHostingAssetRepositoryIntegrationTest test); + } } diff --git a/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java b/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java index 173ea031..5fb1c4e6 100644 --- a/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java +++ b/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java @@ -293,7 +293,10 @@ public abstract class ContextBasedTestWithCleanup extends ContextBasedTest { /** * @return an array of all RBAC roles matching the given pattern + * + * Usually unused, but for temporary debugging purposes of findind role names for new tests. */ + @SuppressWarnings("unused") protected String[] roleNames(final String sqlLikeExpression) { final var pattern = Pattern.compile(sqlLikeExpression); //noinspection unchecked @@ -307,7 +310,10 @@ public abstract class ContextBasedTestWithCleanup extends ContextBasedTest { /** * Generates a diagram of the RBAC-Grants to the current subjects (user or assumed roles). + * + * Usually unused, but for temporary use for debugging and other analysis. */ + @SuppressWarnings("unused") protected void generateRbacDiagramForCurrentSubjects(final EnumSet include, final String name) { RbacGrantsDiagramService.writeToFile( name, @@ -318,7 +324,10 @@ public abstract class ContextBasedTestWithCleanup extends ContextBasedTest { /** * Generates a diagram of the RBAC-Grants for the given object and permission. + * + * Usually unused, but for temporary use for debugging and other analysis. */ + @SuppressWarnings("unused") protected void generateRbacDiagramForObjectPermission(final UUID targetObject, final String rbacOp, final String name) { RbacGrantsDiagramService.writeToFile( name, -- 2.39.5 From e7f26b0f9def330daca844d23f5104360e9c0327 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Tue, 20 Aug 2024 17:23:24 +0200 Subject: [PATCH 14/14] all tests green as long as import tests don't run --- .../rbac/test/cust/TestCustomerEntity.java | 2 + ...DatabaseHostingAssetValidatorUnitTest.java | 12 ++-- ...iaDbUserHostingAssetValidatorUnitTest.java | 7 ++- ...DatabaseHostingAssetValidatorUnitTest.java | 7 ++- ...eSqlUserHostingAssetValidatorUnitTest.java | 7 ++- ...UnixUserHostingAssetValidatorUnitTest.java | 7 ++- ...fficeDebitorRepositoryIntegrationTest.java | 3 +- ...fficeRelationControllerAcceptanceTest.java | 2 +- .../test/ContextBasedTestWithCleanup.java | 59 ++++++++++--------- ...TestCustomerRepositoryIntegrationTest.java | 6 +- 10 files changed, 66 insertions(+), 46 deletions(-) diff --git a/src/main/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerEntity.java b/src/main/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerEntity.java index e9541dd7..72df9c48 100644 --- a/src/main/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerEntity.java @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import lombok.ToString; import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; @@ -24,6 +25,7 @@ import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.rbacViewFor; @Setter @NoArgsConstructor @AllArgsConstructor +@ToString public class TestCustomerEntity implements BaseEntity { @Id diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbDatabaseHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbDatabaseHostingAssetValidatorUnitTest.java index e96694f8..1d9cd8a1 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbDatabaseHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbDatabaseHostingAssetValidatorUnitTest.java @@ -1,13 +1,13 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; +import net.hostsharing.hsadminng.hs.hosting.asset.EntityManagerMock; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; +import net.hostsharing.hsadminng.hs.validation.HsEntityValidator; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import jakarta.persistence.EntityManager; import java.util.HashMap; import java.util.stream.Stream; @@ -41,9 +41,6 @@ class HsMariaDbDatabaseHostingAssetValidatorUnitTest { ))) .build(); - @Mock - private EntityManager em; - private static HsHostingAssetRbacEntity.HsHostingAssetRbacEntityBuilder givenValidMariaDbDatabaseBuilder() { return HsHostingAssetRbacEntity.builder() .type(MARIADB_DATABASE) @@ -74,12 +71,13 @@ class HsMariaDbDatabaseHostingAssetValidatorUnitTest { // given final var givenMariaDbUserHostingAsset = givenValidMariaDbDatabaseBuilder().build(); final var validator = HostingAssetEntityValidatorRegistry.forType(givenMariaDbUserHostingAsset.getType()); + final var em = EntityManagerMock.createEntityManagerMockWithAssetQueryFake(null); // when - final var result = Stream.concat( + final var result = HsEntityValidator.doWithEntityManager(em, () -> Stream.concat( validator.validateEntity(givenMariaDbUserHostingAsset).stream(), validator.validateContext(givenMariaDbUserHostingAsset).stream() - ).toList(); + ).toList()); // then assertThat(result).isEmpty(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbUserHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbUserHostingAssetValidatorUnitTest.java index 1c818c33..ff882e91 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbUserHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsMariaDbUserHostingAssetValidatorUnitTest.java @@ -1,7 +1,9 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; +import net.hostsharing.hsadminng.hs.hosting.asset.EntityManagerMock; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; +import net.hostsharing.hsadminng.hs.validation.HsEntityValidator; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; @@ -79,12 +81,13 @@ class HsMariaDbUserHostingAssetValidatorUnitTest { // given final var givenMariaDbUserHostingAsset = givenValidMariaDbUserBuilder().build(); final var validator = HostingAssetEntityValidatorRegistry.forType(givenMariaDbUserHostingAsset.getType()); + final var em = EntityManagerMock.createEntityManagerMockWithAssetQueryFake(null); // when - final var result = Stream.concat( + final var result = HsEntityValidator.doWithEntityManager(em, () -> Stream.concat( validator.validateEntity(givenMariaDbUserHostingAsset).stream(), validator.validateContext(givenMariaDbUserHostingAsset).stream() - ).toList(); + ).toList()); // then assertThat(result).isEmpty(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlDatabaseHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlDatabaseHostingAssetValidatorUnitTest.java index a74edd5a..b20df86d 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlDatabaseHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlDatabaseHostingAssetValidatorUnitTest.java @@ -2,8 +2,10 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; +import net.hostsharing.hsadminng.hs.hosting.asset.EntityManagerMock; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; +import net.hostsharing.hsadminng.hs.validation.HsEntityValidator; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; @@ -71,12 +73,13 @@ class HsPostgreSqlDatabaseHostingAssetValidatorUnitTest { // given final var givenPgSqlUserHostingAsset = givenValidPgSqlDatabaseBuilder().build(); final var validator = HostingAssetEntityValidatorRegistry.forType(givenPgSqlUserHostingAsset.getType()); + final var em = EntityManagerMock.createEntityManagerMockWithAssetQueryFake(null); // when - final var result = Stream.concat( + final var result = HsEntityValidator.doWithEntityManager(em, () -> Stream.concat( validator.validateEntity(givenPgSqlUserHostingAsset).stream(), validator.validateContext(givenPgSqlUserHostingAsset).stream() - ).toList(); + ).toList()); // then assertThat(result).isEmpty(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlUserHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlUserHostingAssetValidatorUnitTest.java index 89091fd3..91b38508 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlUserHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsPostgreSqlUserHostingAssetValidatorUnitTest.java @@ -1,8 +1,10 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hash.HashGenerator; +import net.hostsharing.hsadminng.hs.hosting.asset.EntityManagerMock; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; +import net.hostsharing.hsadminng.hs.validation.HsEntityValidator; import org.junit.jupiter.api.Test; import jakarta.persistence.EntityManager; @@ -77,12 +79,13 @@ class HsPostgreSqlUserHostingAssetValidatorUnitTest { // given final var givenMariaDbUserHostingAsset = givenValidMariaDbUserBuilder().build(); final var validator = HostingAssetEntityValidatorRegistry.forType(givenMariaDbUserHostingAsset.getType()); + final var em = EntityManagerMock.createEntityManagerMockWithAssetQueryFake(null); // when - final var result = Stream.concat( + final var result = HsEntityValidator.doWithEntityManager(em, () -> Stream.concat( validator.validateEntity(givenMariaDbUserHostingAsset).stream(), validator.validateContext(givenMariaDbUserHostingAsset).stream() - ).toList(); + ).toList()); // then assertThat(result).isEmpty(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java index 922ad152..04768707 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidatorUnitTest.java @@ -1,9 +1,11 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; import net.hostsharing.hsadminng.hash.HashGenerator; +import net.hostsharing.hsadminng.hs.hosting.asset.EntityManagerMock; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRbacEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetRealEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; +import net.hostsharing.hsadminng.hs.validation.HsEntityValidator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -96,12 +98,13 @@ class HsUnixUserHostingAssetValidatorUnitTest { // given final var unixUserHostingAsset = GIVEN_VALID_UNIX_USER_HOSTING_ASSET; final var validator = HostingAssetEntityValidatorRegistry.forType(unixUserHostingAsset.getType()); + final var em = EntityManagerMock.createEntityManagerMockWithAssetQueryFake(null); // when - final var result = Stream.concat( + final var result = HsEntityValidator.doWithEntityManager(em, () -> Stream.concat( validator.validateEntity(unixUserHostingAsset).stream(), validator.validateContext(unixUserHostingAsset).stream() - ).toList(); + ).toList()); // then assertThat(result).isEmpty(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepositoryIntegrationTest.java index d2960862..a1fccbb9 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepositoryIntegrationTest.java @@ -140,7 +140,8 @@ class HsOfficeDebitorRepositoryIntegrationTest extends ContextBasedTestWithClean }); // then - result.assertExceptionWithRootCauseMessage(org.hibernate.exception.ConstraintViolationException.class); + result.assertExceptionWithRootCauseMessage(org.hibernate.exception.ConstraintViolationException.class, + "ERROR: new row for relation \"hs_office_debitor\" violates check constraint \"check_default_prefix\""); } @Test diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationControllerAcceptanceTest.java index 4f397199..265a65e3 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationControllerAcceptanceTest.java @@ -161,7 +161,7 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean .extract().header("Location"); // @formatter:on // finally, the new relation can be accessed under the generated UUID - final var newUserUuid = toCleanup(HsOfficeRelation.class, UUID.fromString( + final var newUserUuid = toCleanup(HsOfficeRelationRealEntity.class, UUID.fromString( location.substring(location.lastIndexOf('/') + 1))); assertThat(newUserUuid).isNotNull(); } diff --git a/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java b/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java index 5fb1c4e6..8e5f9683 100644 --- a/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java +++ b/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java @@ -7,6 +7,7 @@ import net.hostsharing.hsadminng.rbac.rbacgrant.RbacGrantRepository; import net.hostsharing.hsadminng.rbac.rbacgrant.RbacGrantsDiagramService; import net.hostsharing.hsadminng.rbac.rbacrole.RbacRoleEntity; import net.hostsharing.hsadminng.rbac.rbacrole.RbacRoleRepository; +import org.apache.commons.collections4.SetUtils; import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -56,9 +57,10 @@ public abstract class ContextBasedTestWithCleanup extends ContextBasedTest { private static Long latestIntialTestDataSerialId; private static boolean countersInitialized = false; private static boolean initialTestDataValidated = false; - private static Long initialRbacObjectCount = null; - private static Long initialRbacRoleCount = null; - private static Long initialRbacGrantCount = null; + static private Long previousRbacObjectCount; + private Long initialRbacObjectCount = null; + private Long initialRbacRoleCount = null; + private Long initialRbacGrantCount = null; private Set initialRbacObjects; private Set initialRbacRoles; private Set initialRbacGrants; @@ -120,6 +122,7 @@ public abstract class ContextBasedTestWithCleanup extends ContextBasedTest { @BeforeEach //@Transactional -- TODO: check why this does not work but jpaAttempt.transacted does work void retrieveInitialTestData(final TestInfo testInfo) { + this.testInfo = testInfo; out.println(ContextBasedTestWithCleanup.class.getSimpleName() + ".retrieveInitialTestData"); if (latestIntialTestDataSerialId == null ) { @@ -127,7 +130,7 @@ public abstract class ContextBasedTestWithCleanup extends ContextBasedTest { } if (initialRbacObjects != null){ - assertNoNewRbacObjectsRolesAndGrantsLeaked(); + assertNoNewRbacObjectsRolesAndGrantsLeaked("before"); } initialTestDataValidated = false; @@ -157,7 +160,10 @@ public abstract class ContextBasedTestWithCleanup extends ContextBasedTest { assertThat(countersInitialized).as("error while retrieving initial test data").isTrue(); assertThat(initialTestDataValidated).as("check previous test for leaked test data").isTrue(); - out.println("TOTAL OBJECT COUNT (before): " + initialRbacObjectCount); + out.println(testInfo.getDisplayName() + ": TOTAL OBJECT COUNT (initial): " + previousRbacObjectCount + " -> " + initialRbacObjectCount); + if (previousRbacObjectCount != null) { + assertThat(initialRbacObjectCount).as("TOTAL OBJECT COUNT changed from " + previousRbacObjectCount + " to " + initialRbacObjectCount).isEqualTo(previousRbacObjectCount); + } } private Long assumeSameInitialCount(final Long countBefore, final long currentCount, final String name) { @@ -167,23 +173,15 @@ public abstract class ContextBasedTestWithCleanup extends ContextBasedTest { return currentCount; } - @BeforeEach - void keepTestInfo(final TestInfo testInfo) { - this.testInfo = testInfo; - } - @AfterEach void cleanupAndCheckCleanup(final TestInfo testInfo) { - // If the whole test method has its own transaction, cleanup makes no sense. - // If that transaction even failed, cleaunup would cause an exception. - if (!tm.getTransaction(null).isRollbackOnly()) { - out.println(ContextBasedTestWithCleanup.class.getSimpleName() + ".cleanupAndCheckCleanup"); - cleanupTemporaryTestData(); - repeatUntilTrue(3, this::deleteLeakedRbacObjects); + this.testInfo = testInfo; - long rbacObjectCount = assertNoNewRbacObjectsRolesAndGrantsLeaked(); - out.println("TOTAL OBJECT COUNT (after): " + rbacObjectCount); - } + out.println(ContextBasedTestWithCleanup.class.getSimpleName() + ".cleanupAndCheckCleanup"); + cleanupTemporaryTestData(); + repeatUntilTrue(3, this::deleteLeakedRbacObjects); + + assertNoNewRbacObjectsRolesAndGrantsLeaked("after"); } private void cleanupTemporaryTestData() { @@ -208,8 +206,8 @@ public abstract class ContextBasedTestWithCleanup extends ContextBasedTest { } } - private long assertNoNewRbacObjectsRolesAndGrantsLeaked() { - return jpaAttempt.transacted(() -> { + private void assertNoNewRbacObjectsRolesAndGrantsLeaked(final String event) { + long rbacObjectCount = jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net"); assertEqual(initialRbacObjects, allRbacObjects()); if (DETAILED_BUT_SLOW_CHECK) { @@ -219,21 +217,27 @@ public abstract class ContextBasedTestWithCleanup extends ContextBasedTest { // The detailed check works with sets, thus it cannot determine duplicates. // Therefore, we always compare the counts as well. - long rbacObjectCount = 0; - assertThat(rbacObjectCount = rbacObjectRepo.count()).as("not all business objects got cleaned up (by current test)") + long count = rbacObjectRepo.count(); + out.println(testInfo.getDisplayName() + ": TOTAL OBJECT COUNT (" + event+ "): " + previousRbacObjectCount+ " -> " + count); + assertThat(count).as("not all business objects got cleaned up (by current test)") .isEqualTo(initialRbacObjectCount); assertThat(rbacRoleRepo.count()).as("not all rbac roles got cleaned up (by current test)") .isEqualTo(initialRbacRoleCount); assertThat(rbacGrantRepo.count()).as("not all rbac grants got cleaned up (by current test)") .isEqualTo(initialRbacGrantCount); - return rbacObjectCount; + return count; }).assertSuccessful().returnedValue(); + + if (previousRbacObjectCount != null) { + assertThat(rbacObjectCount).as("TOTAL OBJECT COUNT changed from " + previousRbacObjectCount + " to " + rbacObjectCount).isEqualTo(previousRbacObjectCount); + } + previousRbacObjectCount = rbacObjectCount; } private boolean deleteLeakedRbacObjects() { final var deletionSuccessful = new AtomicBoolean(true); - rbacObjectRepo.findAll().stream() - .filter(o -> o.serialId > latestIntialTestDataSerialId) + jpaAttempt.transacted(() -> rbacObjectRepo.findAll()).assertSuccessful().returnedValue().stream() + .filter(o -> latestIntialTestDataSerialId != null && o.serialId > latestIntialTestDataSerialId) .sorted(comparing(o -> o.serialId)) .forEach(o -> { final var exception = jpaAttempt.transacted(() -> { @@ -257,7 +261,8 @@ public abstract class ContextBasedTestWithCleanup extends ContextBasedTest { private void assertEqual(final Set before, final Set after) { assertThat(before).isNotNull(); assertThat(after).isNotNull(); - assertThat(difference(before, after)).as("missing entities (deleted initial test data)").isEmpty(); + final SetUtils.SetView difference = difference(before, after); + assertThat(difference).as("missing entities (deleted initial test data)").isEmpty(); assertThat(difference(after, before)).as("spurious entities (test data not cleaned up by this test)").isEmpty(); } diff --git a/src/test/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerRepositoryIntegrationTest.java index 04175d04..831a2976 100644 --- a/src/test/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerRepositoryIntegrationTest.java @@ -66,7 +66,8 @@ class TestCustomerRepositoryIntegrationTest extends ContextBasedTest { // then result.assertExceptionWithRootCauseMessage( PersistenceException.class, - "ERROR: [403] insert into test_customer not allowed for current subjects {test_customer#xxx:ADMIN}"); + "ERROR: [403] insert into test_customer ", + "not allowed for current subjects {test_customer#xxx:ADMIN}"); } @Test @@ -84,7 +85,8 @@ class TestCustomerRepositoryIntegrationTest extends ContextBasedTest { // then result.assertExceptionWithRootCauseMessage( PersistenceException.class, - "ERROR: [403] insert into test_customer not allowed for current subjects {customer-admin@xxx.example.com}"); + "ERROR: [403] insert into test_customer ", + " not allowed for current subjects {customer-admin@xxx.example.com}"); } -- 2.39.5