1
0

add person business object at db level

This commit is contained in:
Michael Hoennig
2022-09-07 20:24:35 +02:00
parent 9720b37d85
commit 37e7b5179d
17 changed files with 707 additions and 36 deletions

View File

@@ -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);
}

View File

@@ -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()

View File

@@ -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);
}
}

View File

@@ -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();
}
}

View File

@@ -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
}
}

View File

@@ -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
}
}