|
4 | 4 | import com.auth0.jwt.algorithms.Algorithm; |
5 | 5 | import io.agroal.api.AgroalDataSource; |
6 | 6 | import io.quarkus.narayana.jta.QuarkusTransaction; |
| 7 | +import io.quarkus.test.InjectMock; |
7 | 8 | import io.quarkus.test.junit.QuarkusTest; |
8 | 9 | import io.quarkus.test.security.TestSecurity; |
9 | 10 | import io.quarkus.test.security.oidc.Claim; |
|
14 | 15 | import jakarta.validation.Validator; |
15 | 16 | import org.cryptomator.hub.entities.EffectiveVaultAccess; |
16 | 17 | import org.cryptomator.hub.entities.Vault; |
| 18 | +import org.cryptomator.hub.entities.VaultAccess; |
| 19 | +import org.cryptomator.hub.entities.events.EventLogger; |
17 | 20 | import org.cryptomator.hub.rollback.DBRollbackAfter; |
18 | 21 | import org.cryptomator.hub.rollback.DBRollbackBefore; |
19 | 22 | import org.flywaydb.core.Flyway; |
|
32 | 35 | import org.junit.jupiter.api.TestMethodOrder; |
33 | 36 | import org.junit.jupiter.params.ParameterizedTest; |
34 | 37 | import org.junit.jupiter.params.provider.CsvSource; |
| 38 | +import org.mockito.Mockito; |
35 | 39 |
|
36 | 40 | import java.security.GeneralSecurityException; |
37 | 41 | import java.security.KeyFactory; |
|
56 | 60 | import static org.hamcrest.Matchers.comparesEqualTo; |
57 | 61 | import static org.hamcrest.Matchers.equalTo; |
58 | 62 | import static org.hamcrest.Matchers.hasSize; |
59 | | -import static org.hamcrest.Matchers.nullValue; |
60 | 63 | import static org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase; |
61 | 64 |
|
62 | 65 | @QuarkusTest |
63 | 66 | @DisplayName("Resource /vaults") |
64 | 67 | public class VaultResourceIT { |
65 | 68 |
|
| 69 | + @InjectMock |
| 70 | + EventLogger eventLogger; |
| 71 | + |
66 | 72 | @Inject |
67 | 73 | AgroalDataSource dataSource; |
68 | 74 | @Inject |
@@ -344,7 +350,7 @@ public void testUpdateVault() { |
344 | 350 | } |
345 | 351 |
|
346 | 352 | @Nested |
347 | | - @DisplayName("As vault admin user1") |
| 353 | + @DisplayName("As vault owner user1") |
348 | 354 | @TestSecurity(user = "User Name 1", roles = {"user"}) |
349 | 355 | @OidcSecurity(claims = { |
350 | 356 | @Claim(key = "sub", value = "user1") |
@@ -565,12 +571,52 @@ public void testRevokeAccess() { // previously added in testGrantAccess() |
565 | 571 |
|
566 | 572 | @Test |
567 | 573 | @Order(14) |
| 574 | + @DisplayName("PUT /vaults/7E57C0DE-0000-4000-8000-000100002222/members adds, removes and updates members") |
| 575 | + public void setMembersOfVault2() { |
| 576 | + given().when().contentType(ContentType.JSON).body(""" |
| 577 | + { |
| 578 | + "user1": "MEMBER", |
| 579 | + "user2": "OWNER", |
| 580 | + "group2": "MEMBER" |
| 581 | + } |
| 582 | + """).put("/vaults/{vaultId}/members", "7E57C0DE-0000-4000-8000-000100002222") |
| 583 | + .then().statusCode(204); |
| 584 | + var vaultId = UUID.fromString("7E57C0DE-0000-4000-8000-000100002222"); |
| 585 | + Mockito.verify(eventLogger).logVaultMemberAdded("user2", vaultId, "user1", VaultAccess.Role.MEMBER); |
| 586 | + Mockito.verify(eventLogger).logVaultMemberAdded("user2", vaultId, "user2", VaultAccess.Role.OWNER); |
| 587 | + Mockito.verify(eventLogger).logVaultMemberRemoved("user2", vaultId, "group1"); |
| 588 | + Mockito.verify(eventLogger).logVaultMemberUpdated("user2", vaultId, "group2", VaultAccess.Role.MEMBER); |
| 589 | + } |
| 590 | + |
| 591 | + @Test |
| 592 | + @Order(15) |
| 593 | + @DisplayName("PUT /vaults/7E57C0DE-0000-4000-8000-000100002222/members restores original members") |
| 594 | + public void restoreOriginalMembersOfVault2() { // as defined in V9999__Tst_Data.sql |
| 595 | + given().when().contentType(ContentType.JSON).body(""" |
| 596 | + { |
| 597 | + "group1": "MEMBER", |
| 598 | + "group2": "OWNER" |
| 599 | + } |
| 600 | + """).put("/vaults/{vaultId}/members", "7E57C0DE-0000-4000-8000-000100002222") |
| 601 | + .then().statusCode(204); |
| 602 | + var vaultId = UUID.fromString("7E57C0DE-0000-4000-8000-000100002222"); |
| 603 | + Mockito.verify(eventLogger).logVaultMemberRemoved("user2", vaultId, "user1"); |
| 604 | + Mockito.verify(eventLogger).logVaultMemberRemoved("user2", vaultId, "user2"); |
| 605 | + Mockito.verify(eventLogger).logVaultMemberAdded("user2", vaultId, "group1", VaultAccess.Role.MEMBER); |
| 606 | + Mockito.verify(eventLogger).logVaultMemberUpdated("user2", vaultId, "group2", VaultAccess.Role.OWNER); |
| 607 | + |
| 608 | + } |
| 609 | + |
| 610 | + @Test |
| 611 | + @Order(16) |
568 | 612 | @DisplayName("GET /vaults/7E57C0DE-0000-4000-8000-000100002222/members does not contain user2") |
569 | 613 | @DBRollbackAfter |
570 | 614 | public void getMembersOfVault2c() { |
571 | 615 | given().when().get("/vaults/{vaultId}/members", "7E57C0DE-0000-4000-8000-000100002222") |
572 | 616 | .then().statusCode(200) |
573 | | - .body("id", not(hasItems("user2"))); |
| 617 | + .body("id", not(hasItems("user2"))) |
| 618 | + .body("id", hasItems("group1", "group2")) |
| 619 | + ; |
574 | 620 | } |
575 | 621 | } |
576 | 622 |
|
@@ -1078,6 +1124,7 @@ public class AsAnonymous { |
1078 | 1124 | "GET, /vaults/accessible", |
1079 | 1125 | "GET, /vaults/7E57C0DE-0000-4000-8000-000100001111", |
1080 | 1126 | "GET, /vaults/7E57C0DE-0000-4000-8000-000100001111/members", |
| 1127 | + "PUT, /vaults/7E57C0DE-0000-4000-8000-000100001111/members", |
1081 | 1128 | "PUT, /vaults/7E57C0DE-0000-4000-8000-000100001111/users/user1", |
1082 | 1129 | "DELETE, /vaults/7E57C0DE-0000-4000-8000-000100001111/authority/user1", |
1083 | 1130 | "GET, /vaults/7E57C0DE-0000-4000-8000-000100001111/users-requiring-access-grant", |
|
0 commit comments