add person business object at db level
This commit is contained in:
@@ -3,8 +3,10 @@ package net.hostsharing.hsadminng.hs.admin.contact;
|
||||
import net.hostsharing.hsadminng.context.Context;
|
||||
import net.hostsharing.hsadminng.context.ContextBasedTest;
|
||||
import net.hostsharing.test.JpaAttempt;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Nested;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.modelmapper.internal.bytebuddy.utility.RandomString;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
|
||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
@@ -52,7 +54,7 @@ class HsAdminContactRepositoryIntegrationTest extends ContextBasedTest {
|
||||
hsAdminContact("a new contact", "contact-admin@www.example.com")));
|
||||
|
||||
// then
|
||||
assertThat(result.wasSuccessful()).isTrue();
|
||||
result.assertSuccessful();
|
||||
assertThat(result.returnedValue()).isNotNull().extracting(HsAdminContactEntity::getUuid).isNotNull();
|
||||
assertThatContactIsPersisted(result.returnedValue());
|
||||
assertThat(contactRepo.count()).isEqualTo(count + 1);
|
||||
@@ -61,7 +63,7 @@ class HsAdminContactRepositoryIntegrationTest extends ContextBasedTest {
|
||||
@Test
|
||||
public void arbitraryUser_canCreateNewContact() {
|
||||
// given
|
||||
context("pac-admin-xxx00@xxx.example.com");
|
||||
context("drew@hostsharing.org");
|
||||
final var count = contactRepo.count();
|
||||
|
||||
// when
|
||||
@@ -69,7 +71,7 @@ class HsAdminContactRepositoryIntegrationTest extends ContextBasedTest {
|
||||
hsAdminContact("another new contact", "another-new-contact@example.com")));
|
||||
|
||||
// then
|
||||
assertThat(result.wasSuccessful()).isTrue();
|
||||
result.assertSuccessful();
|
||||
assertThat(result.returnedValue()).isNotNull().extracting(HsAdminContactEntity::getUuid).isNotNull();
|
||||
assertThatContactIsPersisted(result.returnedValue());
|
||||
assertThat(contactRepo.count()).isEqualTo(count + 1);
|
||||
@@ -99,10 +101,10 @@ class HsAdminContactRepositoryIntegrationTest extends ContextBasedTest {
|
||||
@Test
|
||||
public void arbitraryUser_canViewOnlyItsOwnContact() {
|
||||
// given:
|
||||
final var givenContact = givenSomeTemporaryContact("pac-admin-xxx00@xxx.example.com");
|
||||
final var givenContact = givenSomeTemporaryContact("drew@hostsharing.org");
|
||||
|
||||
// when:
|
||||
context("pac-admin-xxx00@xxx.example.com");
|
||||
context("drew@hostsharing.org");
|
||||
final var result = contactRepo.findContactByOptionalLabelLike(null);
|
||||
|
||||
// then:
|
||||
@@ -128,10 +130,10 @@ class HsAdminContactRepositoryIntegrationTest extends ContextBasedTest {
|
||||
@Test
|
||||
public void arbitraryUser_withoutAssumedRole_canViewOnlyItsOwnContact() {
|
||||
// given:
|
||||
final var givenContact = givenSomeTemporaryContact("pac-admin-xxx00@xxx.example.com");
|
||||
final var givenContact = givenSomeTemporaryContact("drew@hostsharing.org");
|
||||
|
||||
// when:
|
||||
context("pac-admin-xxx00@xxx.example.com");
|
||||
context("drew@hostsharing.org");
|
||||
final var result = contactRepo.findContactByOptionalLabelLike(givenContact.getLabel());
|
||||
|
||||
// then:
|
||||
@@ -145,7 +147,7 @@ class HsAdminContactRepositoryIntegrationTest extends ContextBasedTest {
|
||||
@Test
|
||||
public void globalAdmin_withoutAssumedRole_canDeleteAnyContact() {
|
||||
// given
|
||||
final var givenContact = givenSomeTemporaryContact("pac-admin-xxx00@xxx.example.com");
|
||||
final var givenContact = givenSomeTemporaryContact("drew@hostsharing.org");
|
||||
|
||||
// when
|
||||
final var result = jpaAttempt.transacted(() -> {
|
||||
@@ -164,11 +166,11 @@ class HsAdminContactRepositoryIntegrationTest extends ContextBasedTest {
|
||||
@Test
|
||||
public void arbitraryUser_withoutAssumedRole_canDeleteAContactCreatedByItself() {
|
||||
// given
|
||||
final var givenContact = givenSomeTemporaryContact("pac-admin-xxx00@xxx.example.com");
|
||||
final var givenContact = givenSomeTemporaryContact("drew@hostsharing.org");
|
||||
|
||||
// when
|
||||
final var result = jpaAttempt.transacted(() -> {
|
||||
context("pac-admin-xxx00@xxx.example.com", null);
|
||||
context("drew@hostsharing.org", null);
|
||||
contactRepo.deleteByUuid(givenContact.getUuid());
|
||||
});
|
||||
|
||||
@@ -190,16 +192,26 @@ class HsAdminContactRepositoryIntegrationTest extends ContextBasedTest {
|
||||
}).assumeSuccessful().returnedValue();
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
void cleanup() {
|
||||
context("alex@hostsharing.net", null);
|
||||
final var result = contactRepo.findContactByOptionalLabelLike("some temporary contact");
|
||||
result.forEach(tempPerson -> {
|
||||
System.out.println("DELETING contact: " + tempPerson.getLabel());
|
||||
contactRepo.deleteByUuid(tempPerson.getUuid());
|
||||
});
|
||||
}
|
||||
|
||||
private HsAdminContactEntity givenSomeTemporaryContact(final String createdByUser) {
|
||||
final var random = RandomString.make(12);
|
||||
return givenSomeTemporaryContact(createdByUser, () ->
|
||||
hsAdminContact(
|
||||
"some temporary contact #" + Math.random(),
|
||||
"some-temporary-contact" + Math.random() + "@example.com"));
|
||||
"some temporary contact #" + random,
|
||||
"some-temporary-contact" + random + "@example.com"));
|
||||
}
|
||||
|
||||
void exactlyTheseContactsAreReturned(final List<HsAdminContactEntity> actualResult, final String... contactLabels) {
|
||||
assertThat(actualResult)
|
||||
.hasSize(contactLabels.length)
|
||||
.extracting(HsAdminContactEntity::getLabel)
|
||||
.containsExactlyInAnyOrder(contactLabels);
|
||||
}
|
||||
|
@@ -1,12 +1,11 @@
|
||||
package net.hostsharing.hsadminng.hs.admin.partner;
|
||||
|
||||
import net.hostsharing.hsadminng.hs.admin.contact.HsAdminContactEntity;
|
||||
import net.hostsharing.hsadminng.hs.admin.partner.HsAdminPartnerEntity;
|
||||
import net.hostsharing.hsadminng.hs.admin.person.HsAdminPersonEntity;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import static net.hostsharing.hsadminng.hs.admin.person.HsAdminPersonEntity.PersonType.LEGAL;
|
||||
import static net.hostsharing.hsadminng.hs.admin.person.HsAdminPersonType.LEGAL;
|
||||
|
||||
public class TestHsAdminPartner {
|
||||
|
||||
@@ -16,7 +15,7 @@ public class TestHsAdminPartner {
|
||||
return HsAdminPartnerEntity.builder()
|
||||
.uuid(UUID.randomUUID())
|
||||
.person(HsAdminPersonEntity.builder()
|
||||
.type(LEGAL)
|
||||
.personType(LEGAL)
|
||||
.tradeName(tradeName)
|
||||
.build())
|
||||
.contact(HsAdminContactEntity.builder()
|
||||
|
@@ -0,0 +1,227 @@
|
||||
package net.hostsharing.hsadminng.hs.admin.person;
|
||||
|
||||
import net.hostsharing.hsadminng.context.Context;
|
||||
import net.hostsharing.hsadminng.context.ContextBasedTest;
|
||||
import net.hostsharing.test.JpaAttempt;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Nested;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.modelmapper.internal.bytebuddy.utility.RandomString;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
|
||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
import org.springframework.test.annotation.DirtiesContext;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.random.RandomGenerator;
|
||||
|
||||
import static net.hostsharing.hsadminng.hs.admin.person.TestHsAdminPerson.hsAdminPerson;
|
||||
import static net.hostsharing.test.JpaAttempt.attempt;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@DataJpaTest
|
||||
@ComponentScan(basePackageClasses = { HsAdminPersonRepository.class, Context.class, JpaAttempt.class })
|
||||
@DirtiesContext
|
||||
class HsAdminPersonRepositoryIntegrationTest extends ContextBasedTest {
|
||||
|
||||
@Autowired
|
||||
HsAdminPersonRepository personRepo;
|
||||
|
||||
@Autowired
|
||||
EntityManager em;
|
||||
|
||||
@Autowired
|
||||
JpaAttempt jpaAttempt;
|
||||
|
||||
@MockBean
|
||||
HttpServletRequest request;
|
||||
|
||||
@Nested
|
||||
class CreatePerson {
|
||||
|
||||
@Test
|
||||
public void globalAdmin_withoutAssumedRole_canCreateNewPerson() {
|
||||
// given
|
||||
context("alex@hostsharing.net");
|
||||
final var count = personRepo.count();
|
||||
|
||||
// when
|
||||
|
||||
final var result = attempt(em, () -> personRepo.save(
|
||||
hsAdminPerson("a new person")));
|
||||
|
||||
// then
|
||||
result.assertSuccessful();
|
||||
assertThat(result.returnedValue()).isNotNull().extracting(HsAdminPersonEntity::getUuid).isNotNull();
|
||||
assertThatPersonIsPersisted(result.returnedValue());
|
||||
assertThat(personRepo.count()).isEqualTo(count + 1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void arbitraryUser_canCreateNewPerson() {
|
||||
// given
|
||||
context("drew@hostsharing.org");
|
||||
final var count = personRepo.count();
|
||||
|
||||
// when
|
||||
final var result = attempt(em, () -> personRepo.save(
|
||||
hsAdminPerson("another new person")));
|
||||
|
||||
// then
|
||||
result.assertSuccessful();
|
||||
assertThat(result.returnedValue()).isNotNull().extracting(HsAdminPersonEntity::getUuid).isNotNull();
|
||||
assertThatPersonIsPersisted(result.returnedValue());
|
||||
assertThat(personRepo.count()).isEqualTo(count + 1);
|
||||
}
|
||||
|
||||
private void assertThatPersonIsPersisted(final HsAdminPersonEntity saved) {
|
||||
final var found = personRepo.findByUuid(saved.getUuid());
|
||||
assertThat(found).isNotEmpty().get().usingRecursiveComparison().isEqualTo(saved);
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
class FindAllPersons {
|
||||
|
||||
@Test
|
||||
public void globalAdmin_withoutAssumedRole_canViewAllPersons() {
|
||||
// given
|
||||
context("alex@hostsharing.net");
|
||||
|
||||
// when
|
||||
final var result = personRepo.findPersonByOptionalNameLike(null);
|
||||
|
||||
// then
|
||||
allThesePersonsAreReturned(result,
|
||||
"Peter, Smith",
|
||||
"Rockshop e.K.",
|
||||
"Ostfriesische Stahlhandel OHG",
|
||||
"Erbengemeinschaft Bessler");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void arbitraryUser_canViewOnlyItsOwnPerson() {
|
||||
// given:
|
||||
final var givenPerson = givenSomeTemporaryPerson("pac-admin-zzz00@zzz.example.com");
|
||||
|
||||
// when:
|
||||
context("pac-admin-zzz00@zzz.example.com");
|
||||
final var result = personRepo.findPersonByOptionalNameLike(null);
|
||||
|
||||
// then:
|
||||
exactlyThesePersonsAreReturned(result, givenPerson.getTradeName());
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
class FindByLabelLike {
|
||||
|
||||
@Test
|
||||
public void globalAdmin_withoutAssumedRole_canViewAllPersons() {
|
||||
// given
|
||||
context("alex@hostsharing.net", null);
|
||||
|
||||
// when
|
||||
final var result = personRepo.findPersonByOptionalNameLike("Rockshop");
|
||||
|
||||
// then
|
||||
exactlyThesePersonsAreReturned(result, "Rockshop e.K.");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void arbitraryUser_withoutAssumedRole_canViewOnlyItsOwnPerson() {
|
||||
// given:
|
||||
final var givenPerson = givenSomeTemporaryPerson("drew@hostsharing.org");
|
||||
|
||||
// when:
|
||||
context("drew@hostsharing.org");
|
||||
final var result = personRepo.findPersonByOptionalNameLike(givenPerson.getTradeName());
|
||||
|
||||
// then:
|
||||
exactlyThesePersonsAreReturned(result, givenPerson.getTradeName());
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
class DeleteByUuid {
|
||||
|
||||
@Test
|
||||
public void globalAdmin_withoutAssumedRole_canDeleteAnyPerson() {
|
||||
// given
|
||||
final var givenPerson = givenSomeTemporaryPerson("drew@hostsharing.org");
|
||||
|
||||
// when
|
||||
final var result = jpaAttempt.transacted(() -> {
|
||||
context("alex@hostsharing.net", null);
|
||||
personRepo.deleteByUuid(givenPerson.getUuid());
|
||||
});
|
||||
|
||||
// then
|
||||
result.assertSuccessful();
|
||||
assertThat(jpaAttempt.transacted(() -> {
|
||||
context("alex@hostsharing.net", null);
|
||||
return personRepo.findPersonByOptionalNameLike(givenPerson.getTradeName());
|
||||
}).assertSuccessful().returnedValue()).hasSize(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void arbitraryUser_withoutAssumedRole_canDeleteAPersonCreatedByItself() {
|
||||
// given
|
||||
final var givenPerson = givenSomeTemporaryPerson("drew@hostsharing.org");
|
||||
|
||||
// when
|
||||
final var result = jpaAttempt.transacted(() -> {
|
||||
context("drew@hostsharing.org", null);
|
||||
personRepo.deleteByUuid(givenPerson.getUuid());
|
||||
});
|
||||
|
||||
// then
|
||||
result.assertSuccessful();
|
||||
assertThat(jpaAttempt.transacted(() -> {
|
||||
context("alex@hostsharing.net", null);
|
||||
return personRepo.findPersonByOptionalNameLike(givenPerson.getTradeName());
|
||||
}).assertSuccessful().returnedValue()).hasSize(0);
|
||||
}
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
void cleanup() {
|
||||
context("alex@hostsharing.net", null);
|
||||
final var result = personRepo.findPersonByOptionalNameLike("some temporary person");
|
||||
result.forEach(tempPerson -> {
|
||||
System.out.println("DELETING person: " + tempPerson.getDisplayName());
|
||||
personRepo.deleteByUuid(tempPerson.getUuid());
|
||||
});
|
||||
}
|
||||
|
||||
private HsAdminPersonEntity givenSomeTemporaryPerson(
|
||||
final String createdByUser,
|
||||
Supplier<HsAdminPersonEntity> entitySupplier) {
|
||||
return jpaAttempt.transacted(() -> {
|
||||
context(createdByUser);
|
||||
return personRepo.save(entitySupplier.get());
|
||||
}).assumeSuccessful().returnedValue();
|
||||
}
|
||||
|
||||
private HsAdminPersonEntity givenSomeTemporaryPerson(final String createdByUser) {
|
||||
return givenSomeTemporaryPerson(createdByUser, () ->
|
||||
hsAdminPerson("some temporary person #" + RandomString.make(12)));
|
||||
}
|
||||
|
||||
void exactlyThesePersonsAreReturned(final List<HsAdminPersonEntity> actualResult, final String... personLabels) {
|
||||
assertThat(actualResult)
|
||||
.extracting(HsAdminPersonEntity::getTradeName)
|
||||
.containsExactlyInAnyOrder(personLabels);
|
||||
}
|
||||
|
||||
void allThesePersonsAreReturned(final List<HsAdminPersonEntity> actualResult, final String... personLabels) {
|
||||
assertThat(actualResult)
|
||||
.extracting(HsAdminPersonEntity::getDisplayName)
|
||||
.contains(personLabels);
|
||||
}
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package net.hostsharing.hsadminng.hs.admin.person;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class TestHsAdminPerson {
|
||||
|
||||
public static final HsAdminPersonEntity somePerson = hsAdminPerson("some person");
|
||||
|
||||
static public HsAdminPersonEntity hsAdminPerson(final String tradeName) {
|
||||
return HsAdminPersonEntity.builder()
|
||||
.uuid(UUID.randomUUID())
|
||||
.personType(HsAdminPersonType.NATURAL)
|
||||
.tradeName(tradeName)
|
||||
.build();
|
||||
}
|
||||
}
|
@@ -153,7 +153,9 @@ class RbacGrantControllerAcceptanceTest extends ContextBasedTest {
|
||||
hasEntry("granteeUserName", "pac-admin-yyy00@yyy.example.com")
|
||||
)
|
||||
))
|
||||
.body("size()", is(1));
|
||||
.body("[0].grantedByRoleIdName", is("test_customer#yyy.admin"))
|
||||
.body("[0].grantedRoleIdName", is("test_package#yyy00.admin"))
|
||||
.body("[0].granteeUserName", is("pac-admin-yyy00@yyy.example.com"));
|
||||
// @formatter:on
|
||||
}
|
||||
}
|
||||
|
@@ -79,11 +79,20 @@ class RbacRoleControllerAcceptanceTest {
|
||||
.assertThat()
|
||||
.statusCode(200)
|
||||
.contentType("application/json")
|
||||
|
||||
.body("", hasItem(hasEntry("roleName", "test_customer#yyy.tenant")))
|
||||
.body("", hasItem(hasEntry("roleName", "test_domain#yyy00-aaaa.owner")))
|
||||
.body("", hasItem(hasEntry("roleName", "test_domain#yyy00-aaaa.admin")))
|
||||
.body("", hasItem(hasEntry("roleName", "test_domain#yyy00-aaab.owner")))
|
||||
.body("", hasItem(hasEntry("roleName", "test_domain#yyy00-aaab.admin")))
|
||||
.body("", hasItem(hasEntry("roleName", "test_package#yyy00.admin")))
|
||||
.body("", hasItem(hasEntry("roleName", "test_package#yyy00.tenant")))
|
||||
.body("size()", is(7)); // increases with new test data
|
||||
|
||||
.body("", not(hasItem(hasEntry("roleName", "test_customer#xxx.tenant"))))
|
||||
.body("", not(hasItem(hasEntry("roleName", "test_domain#xxx00-aaaa.admin"))))
|
||||
.body("", not(hasItem(hasEntry("roleName", "test_package#xxx00.admin"))))
|
||||
.body("", not(hasItem(hasEntry("roleName", "test_package#xxx00.tenant"))))
|
||||
;
|
||||
// @formatter:on
|
||||
}
|
||||
|
||||
@@ -101,11 +110,16 @@ class RbacRoleControllerAcceptanceTest {
|
||||
.then().assertThat()
|
||||
.statusCode(200)
|
||||
.contentType("application/json")
|
||||
|
||||
.body("", hasItem(hasEntry("roleName", "test_customer#zzz.tenant")))
|
||||
.body("", hasItem(hasEntry("roleName", "test_domain#zzz00-aaaa.admin")))
|
||||
.body("", hasItem(hasEntry("roleName", "test_package#zzz00.admin")))
|
||||
.body("", hasItem(hasEntry("roleName", "test_package#zzz00.tenant")))
|
||||
.body("size()", is(7)); // increases with new test data
|
||||
|
||||
.body("", not(hasItem(hasEntry("roleName", "test_customer#yyy.tenant"))))
|
||||
.body("", not(hasItem(hasEntry("roleName", "test_domain#yyy00-aaaa.admin"))))
|
||||
.body("", not(hasItem(hasEntry("roleName", "test_package#yyy00.admin"))))
|
||||
.body("", not(hasItem(hasEntry("roleName", "test_package#yyy00.tenant"))));
|
||||
// @formatter:on
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user