Shares and Assets.
This commit is contained in:
		| @@ -21,6 +21,8 @@ import org.hostsharing.hsadminng.domain.enumeration.AssetAction; | ||||
| public class Asset implements Serializable { | ||||
|  | ||||
|     private static final long serialVersionUID = 1L; | ||||
|  | ||||
|     public static final String ENTITY_NAME = "asset"; | ||||
|      | ||||
|     @Id | ||||
|     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") | ||||
|   | ||||
| @@ -26,10 +26,12 @@ public class AssetService { | ||||
|     private final AssetRepository assetRepository; | ||||
|  | ||||
|     private final AssetMapper assetMapper; | ||||
|     private final AssetValidator assetValidator; | ||||
|  | ||||
|     public AssetService(AssetRepository assetRepository, AssetMapper assetMapper) { | ||||
|     public AssetService(AssetRepository assetRepository, AssetMapper assetMapper, AssetValidator assetValidator ) { | ||||
|         this.assetRepository = assetRepository; | ||||
|         this.assetMapper = assetMapper; | ||||
|         this.assetValidator = assetValidator; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -40,6 +42,9 @@ public class AssetService { | ||||
|      */ | ||||
|     public AssetDTO save(AssetDTO assetDTO) { | ||||
|         log.debug("Request to save Asset : {}", assetDTO); | ||||
|  | ||||
|         assetValidator.validate(assetDTO); | ||||
|  | ||||
|         Asset asset = assetMapper.toEntity(assetDTO); | ||||
|         asset = assetRepository.save(asset); | ||||
|         return assetMapper.toDto(asset); | ||||
|   | ||||
| @@ -0,0 +1,43 @@ | ||||
| package org.hostsharing.hsadminng.service; | ||||
|  | ||||
| import org.hostsharing.hsadminng.domain.Asset; | ||||
| import org.hostsharing.hsadminng.domain.enumeration.AssetAction; | ||||
| import org.hostsharing.hsadminng.service.dto.AssetDTO; | ||||
| import org.hostsharing.hsadminng.web.rest.errors.BadRequestAlertException; | ||||
| import org.springframework.stereotype.Service; | ||||
|  | ||||
| import java.math.BigDecimal; | ||||
|  | ||||
| @Service | ||||
| public class AssetValidator { | ||||
|     public void validate(final AssetDTO assetDTO) { | ||||
|         if (assetDTO.getId() != null) { | ||||
|             throw new BadRequestAlertException("Asset transactions are immutable", Asset.ENTITY_NAME, "assetTransactionImmutable"); | ||||
|         } | ||||
|  | ||||
|         if (assetDTO.getDocumentDate().isAfter(assetDTO.getValueDate())) { | ||||
|             throw new BadRequestAlertException("Document date may not be after value date", Asset.ENTITY_NAME, "documentDateMayNotBeAfterValueDate"); | ||||
|         } | ||||
|  | ||||
|         if ((assetDTO.getAction() == AssetAction.PAYMENT) && (assetDTO.getAmount().compareTo(BigDecimal.valueOf(0)) <= 0)) { | ||||
|             throw new BadRequestAlertException("Asset payments require a positive amount", Asset.ENTITY_NAME, "assetPaymentsPositiveAmount"); | ||||
|         } | ||||
|         if ((assetDTO.getAction() == AssetAction.ADOPTION) && (assetDTO.getAmount().compareTo(BigDecimal.valueOf(0)) <= 0)) { | ||||
|             throw new BadRequestAlertException("Asset adoptions require a positive amount", Asset.ENTITY_NAME, "assetAdoptionsPositiveAmount"); | ||||
|         } | ||||
|  | ||||
|         if ((assetDTO.getAction() == AssetAction.PAYBACK) && (assetDTO.getAmount().compareTo(BigDecimal.valueOf(0)) >= 0)) { | ||||
|             throw new BadRequestAlertException("Asset paybacks require a negative amount", Asset.ENTITY_NAME, "assetPaybacksNegativeAmount"); | ||||
|         } | ||||
|         if ((assetDTO.getAction() == AssetAction.HANDOVER) && (assetDTO.getAmount().compareTo(BigDecimal.valueOf(0)) >= 0)) { | ||||
|             throw new BadRequestAlertException("Asset handovers require a negative amount", Asset.ENTITY_NAME, "assetHandoversNegativeAmount"); | ||||
|         } | ||||
|         if ((assetDTO.getAction() == AssetAction.LOSS) && (assetDTO.getAmount().compareTo(BigDecimal.valueOf(0)) >= 0)) { | ||||
|             throw new BadRequestAlertException("Asset losses require a negative amount", Asset.ENTITY_NAME, "assetLossesNegativeAmount"); | ||||
|         } | ||||
|         if ((assetDTO.getAction() == AssetAction.CLEARING) && (assetDTO.getAmount().compareTo(BigDecimal.valueOf(0)) >= 0)) { | ||||
|             throw new BadRequestAlertException("Asset clearings require a negative amount", Asset.ENTITY_NAME, "assetClearingsNegativeAmount"); | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -28,9 +28,12 @@ public class ShareService { | ||||
|  | ||||
|     private final ShareMapper shareMapper; | ||||
|  | ||||
|     public ShareService(ShareRepository shareRepository, ShareMapper shareMapper) { | ||||
|     private final ShareValidator shareValidator; | ||||
|  | ||||
|     public ShareService(ShareRepository shareRepository, ShareMapper shareMapper, ShareValidator shareValidator) { | ||||
|         this.shareRepository = shareRepository; | ||||
|         this.shareMapper = shareMapper; | ||||
|         this.shareValidator = shareValidator; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -42,16 +45,8 @@ public class ShareService { | ||||
|     public ShareDTO save(ShareDTO shareDTO) { | ||||
|         log.debug("Request to save Share : {}", shareDTO); | ||||
|  | ||||
|         if (shareDTO.getId() != null) { | ||||
|             throw new BadRequestAlertException("Share transactions are immutable", Share.ENTITY_NAME, "shareTransactionImmutable"); | ||||
|         } | ||||
|         shareValidator.validate(shareDTO); | ||||
|  | ||||
|         if((shareDTO.getAction() == ShareAction.SUBSCRIPTION) && (shareDTO.getQuantity() <= 0)) { | ||||
|             throw new BadRequestAlertException("Share subscriptions require a positive quantity", Share.ENTITY_NAME, "shareSubscriptionPositivQuantity"); | ||||
|         } | ||||
|         if((shareDTO.getAction() == ShareAction.CANCELLATION) && (shareDTO.getQuantity() >= 0)) { | ||||
|             throw new BadRequestAlertException("Share cancellations require a negative quantity", Share.ENTITY_NAME, "shareCancellationNegativeQuantity"); | ||||
|         } | ||||
|         Share share = shareMapper.toEntity(shareDTO); | ||||
|         share = shareRepository.save(share); | ||||
|         return shareMapper.toDto(share); | ||||
|   | ||||
| @@ -0,0 +1,30 @@ | ||||
| package org.hostsharing.hsadminng.service; | ||||
|  | ||||
| import org.hostsharing.hsadminng.domain.Share; | ||||
| import org.hostsharing.hsadminng.domain.enumeration.ShareAction; | ||||
| import org.hostsharing.hsadminng.service.dto.ShareDTO; | ||||
| import org.hostsharing.hsadminng.web.rest.errors.BadRequestAlertException; | ||||
| import org.springframework.stereotype.Service; | ||||
|  | ||||
| @Service | ||||
| public class ShareValidator { | ||||
|  | ||||
|     public void validate(final ShareDTO shareDTO) { | ||||
|         if (shareDTO.getId() != null) { | ||||
|             throw new BadRequestAlertException("Share transactions are immutable", Share.ENTITY_NAME, "shareTransactionImmutable"); | ||||
|         } | ||||
|  | ||||
|         if (shareDTO.getDocumentDate().isAfter(shareDTO.getValueDate())) { | ||||
|             throw new BadRequestAlertException("Document date may not be after value date", Share.ENTITY_NAME, "documentDateMayNotBeAfterValueDate"); | ||||
|         } | ||||
|  | ||||
|         if ((shareDTO.getAction() == ShareAction.SUBSCRIPTION) && (shareDTO.getQuantity() <= 0)) { | ||||
|             throw new BadRequestAlertException("Share subscriptions require a positive quantity", Share.ENTITY_NAME, "shareSubscriptionPositiveQuantity"); | ||||
|         } | ||||
|  | ||||
|         if ((shareDTO.getAction() == ShareAction.CANCELLATION) && (shareDTO.getQuantity() >= 0)) { | ||||
|             throw new BadRequestAlertException("Share cancellations require a negative quantity", Share.ENTITY_NAME, "shareCancellationNegativeQuantity"); | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -2,25 +2,25 @@ | ||||
|     "hsadminNgApp": { | ||||
|         "asset": { | ||||
|             "home": { | ||||
|                 "title": "Assets", | ||||
|                 "createLabel": "Asset erstellen", | ||||
|                 "createOrEditLabel": "Asset erstellen oder bearbeiten" | ||||
|                 "title": "Geschäftsguthaben-Transaktionen", | ||||
|                 "createLabel": "Geschäftsguthaben-Transaktion erfassen", | ||||
|                 "createOrEditLabel": "Geschäftsguthaben-Transaktion erfassen oder bearbeiten" | ||||
|             }, | ||||
|             "created": "Asset erstellt mit ID {{ param }}", | ||||
|             "updated": "Asset aktualisiert mit ID {{ param }}", | ||||
|             "deleted": "Asset gelöscht mit ID {{ param }}", | ||||
|             "created": "Geschäftsguthaben-Transaktion erfasst mit ID {{ param }}", | ||||
|             "updated": "Geschäftsguthaben-Transaktion aktualisiert mit ID {{ param }}", | ||||
|             "deleted": "Geschäftsguthaben-Transaktion gelöscht mit ID {{ param }}", | ||||
|             "delete": { | ||||
|                 "question": "Soll Asset {{ id }} wirklich dauerhaft gelöscht werden?" | ||||
|                 "question": "Soll die Geschäftsguthaben-Transaktion {{ id }} wirklich dauerhaft gelöscht werden?" | ||||
|             }, | ||||
|             "detail": { | ||||
|                 "title": "Asset" | ||||
|                 "title": "Geschäftsguthaben-Transaktion" | ||||
|             }, | ||||
|             "documentDate": "Document Date", | ||||
|             "valueDate": "Value Date", | ||||
|             "action": "Action", | ||||
|             "amount": "Amount", | ||||
|             "remark": "Remark", | ||||
|             "membership": "Membership" | ||||
|             "documentDate": "Belegdatum", | ||||
|             "valueDate": "Buchungsdatum", | ||||
|             "action": "Transaktion", | ||||
|             "amount": "Betrag", | ||||
|             "remark": "Bemerkung", | ||||
|             "membership": "zugehörige Mitgliedschaft" | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,12 +2,12 @@ | ||||
|     "hsadminNgApp": { | ||||
|         "AssetAction": { | ||||
|             "null": "", | ||||
|             "PAYMENT": "PAYMENT", | ||||
|             "HANDOVER": "HANDOVER", | ||||
|             "ADOPTION": "ADOPTION", | ||||
|             "LOSS": "LOSS", | ||||
|             "CLEARING": "CLEARING", | ||||
|             "PAYBACK": "PAYBACK" | ||||
|             "PAYMENT": "Einzahlung", | ||||
|             "HANDOVER": "Übertragung", | ||||
|             "ADOPTION": "Übernahme", | ||||
|             "LOSS": "Verlust", | ||||
|             "CLEARING": "Verrechnung", | ||||
|             "PAYBACK": "Auszahlung" | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| { | ||||
|     "error": { | ||||
|         "shareSubscriptionPositivQuantity": "Zeichnungen von Geschäftsanteilen erfordern eine positive Stückzahl", | ||||
|         "shareSubscriptionPositiveQuantity": "Zeichnungen von Geschäftsanteilen erfordern eine positive Stückzahl", | ||||
|         "shareCancellationNegativeQuantity": "Kündigungen von Geschäftsanteilen erfordern eine negative Stückzahl", | ||||
|         "shareTransactionImmutable": "Transaktionen mit Geschäftsanteilen sind unveränderlich", | ||||
|         "membershipNotDeletable": "Mitgliedschaft kann nicht gelöscht werden, setze stattdessen das 'untilDate'", | ||||
|         "untilDateMustBeAfterSinceDate": "Mitgliedshafts-Austrittsdatum muss nach dem Beitrittsdatum liegen", | ||||
|         "anotherUncancelledMembershipExists": "Nur eine einzige ungekündigte Mitgliedschaft pro Kunde ist zulässig" | ||||
|         "untilDateMustBeAfterSinceDate": "Mitgliedshaftsaustrittsdatum muss nach dem Beitrittsdatum liegen", | ||||
|         "documentDateMayNotBeAfterValueDate": "Belegdatum darf nicht vor dem Buchungsdatum liegen", | ||||
|         "anotherUncancelledMembershipExists": "Nur eine einzige ungekündigte Mitgliedschaft pro Kunde ist zulässig", | ||||
|         "assetPaymentsPositiveAmount": "Einzahlungen von Geschäftsguthaben erfordern einen positiven Betrag", | ||||
|         "assetAdoptionsPositiveAmount": "Übernahmen von Geschäftsguthaben erfordern einen positiven Betrag", | ||||
|         "assetPaybacksNegativeAmount": "Auszahlungen von Geschäftsguthaben erfordern einen negativen Betrag", | ||||
|         "assetHandoversNegativeAmount": "Übertragungen von Geschäftsguthaben erfordern einen negativen Betrag", | ||||
|         "assetLossesNegativeAmount": "Verluste von Geschäftsguthaben erfordern einen negativen Betrag", | ||||
|         "assetClearingsNegativeAmount": "Verrechnungen von Geschäftsguthaben erfordern einen negativen Betrag" | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,25 +2,25 @@ | ||||
|     "hsadminNgApp": { | ||||
|         "share": { | ||||
|             "home": { | ||||
|                 "title": "Shares", | ||||
|                 "createLabel": "Share erstellen", | ||||
|                 "createOrEditLabel": "Share erstellen oder bearbeiten" | ||||
|                 "title": "Geschäftsanteil-Transaktionen", | ||||
|                 "createLabel": "Geschäftsanteil-Transaktion erfassen", | ||||
|                 "createOrEditLabel": "Geschäftsanteil-Transaktion erfassen oder bearbeiten" | ||||
|             }, | ||||
|             "created": "Share erstellt mit ID {{ param }}", | ||||
|             "updated": "Share aktualisiert mit ID {{ param }}", | ||||
|             "deleted": "Share gelöscht mit ID {{ param }}", | ||||
|             "created": "Geschäftsanteil-Transaktion erfasst mit ID {{ param }}", | ||||
|             "updated": "Geschäftsanteil-Transaktion aktualisiert mit ID {{ param }}", | ||||
|             "deleted": "Geschäftsanteil-Transaktion gelöscht mit ID {{ param }}", | ||||
|             "delete": { | ||||
|                 "question": "Soll Share {{ id }} wirklich dauerhaft gelöscht werden?" | ||||
|                 "question": "Soll die Geschäftsanteil-Transaktion {{ id }} wirklich dauerhaft gelöscht werden?" | ||||
|             }, | ||||
|             "detail": { | ||||
|                 "title": "Share" | ||||
|                 "title": "Geschäftsanteil-Transaktion" | ||||
|             }, | ||||
|             "documentDate": "Document Date", | ||||
|             "valueDate": "Value Date", | ||||
|             "action": "Action", | ||||
|             "quantity": "Quantity", | ||||
|             "remark": "Remark", | ||||
|             "membership": "Membership" | ||||
|             "documentDate": "Belegdatum", | ||||
|             "valueDate": "Buchungsdatum", | ||||
|             "action": "Aktion", | ||||
|             "quantity": "Anzahl", | ||||
|             "remark": "Bemerkung", | ||||
|             "membership": "zugehörige Mitgliedschaft" | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,8 +2,8 @@ | ||||
|     "hsadminNgApp": { | ||||
|         "ShareAction": { | ||||
|             "null": "", | ||||
|             "SUBSCRIPTION": "SUBSCRIPTION", | ||||
|             "CANCELLATION": "CANCELLATION" | ||||
|             "SUBSCRIPTION": "Zeichnung", | ||||
|             "CANCELLATION": "Kündigung" | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,25 +2,25 @@ | ||||
|     "hsadminNgApp": { | ||||
|         "asset": { | ||||
|             "home": { | ||||
|                 "title": "Assets", | ||||
|                 "createLabel": "Create a new Asset", | ||||
|                 "createOrEditLabel": "Create or edit a Asset" | ||||
|                 "title": "Asset Transactions", | ||||
|                 "createLabel": "Register a new asset transaction", | ||||
|                 "createOrEditLabel": "Register or edit an asset transaction" | ||||
|             }, | ||||
|             "created": "A new Asset is created with identifier {{ param }}", | ||||
|             "updated": "A Asset is updated with identifier {{ param }}", | ||||
|             "deleted": "A Asset is deleted with identifier {{ param }}", | ||||
|             "created": "A new asset transaction is registered with identifier {{ param }}", | ||||
|             "updated": "An asset transaction is updated with identifier {{ param }}", | ||||
|             "deleted": "An asset transaction is deleted with identifier {{ param }}", | ||||
|             "delete": { | ||||
|                 "question": "Are you sure you want to delete Asset {{ id }}?" | ||||
|                 "question": "Are you sure you want to delete asset transaction {{ id }}?" | ||||
|             }, | ||||
|             "detail": { | ||||
|                 "title": "Asset" | ||||
|                 "title": "Asset transaction" | ||||
|             }, | ||||
|             "documentDate": "Document Date", | ||||
|             "valueDate": "Value Date", | ||||
|             "documentDate": "Document date", | ||||
|             "valueDate": "Value date", | ||||
|             "action": "Action", | ||||
|             "amount": "Amount", | ||||
|             "remark": "Remark", | ||||
|             "membership": "Membership" | ||||
|             "membership": "Related membership" | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,12 +2,12 @@ | ||||
|     "hsadminNgApp": { | ||||
|         "AssetAction": { | ||||
|             "null": "", | ||||
|             "PAYMENT": "PAYMENT", | ||||
|             "HANDOVER": "HANDOVER", | ||||
|             "ADOPTION": "ADOPTION", | ||||
|             "LOSS": "LOSS", | ||||
|             "CLEARING": "CLEARING", | ||||
|             "PAYBACK": "PAYBACK" | ||||
|             "PAYMENT": "Payment", | ||||
|             "HANDOVER": "Handover", | ||||
|             "ADOPTION": "Adoption", | ||||
|             "LOSS": "Loss", | ||||
|             "CLEARING": "Clearing", | ||||
|             "PAYBACK": "Payback" | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| { | ||||
|     "error": { | ||||
|         "shareSubscriptionPositivQuantity": "Share subscriptions require a positive quantity", | ||||
|         "shareSubscriptionPositiveQuantity": "Share subscriptions require a positive quantity", | ||||
|         "shareCancellationNegativeQuantity": "Share cancellations require a negative quantity", | ||||
|         "shareTransactionImmutable": "Share transactions are immutable", | ||||
|         "membershipNotDeletable": "Membership cannot be deleted, instead set 'untilDate'", | ||||
|         "untilDateMustBeAfterSinceDate": "Membership until date must be after since date", | ||||
|         "anotherUncancelledMembershipExists": "Only a single uncancelled membership allowed per customer" | ||||
|         "documentDateMayNotBeAfterValueDate": "Document date may not be after value date", | ||||
|         "anotherUncancelledMembershipExists": "Only a single uncancelled membership allowed per customer", | ||||
|         "assetPaymentsPositiveAmount": "Asset payments require a positive amount", | ||||
|         "assetAdoptionsPositiveAmount": "Asset adoptions require a positive amount", | ||||
|         "assetPaybacksNegativeAmount": "Asset paybacks require a negative amount", | ||||
|         "assetHandoversNegativeAmount": "Asset handovers require a negative amount", | ||||
|         "assetLossesNegativeAmount": "Asset losses require a negative amount", | ||||
|         "assetClearingsNegativeAmount": "Asset clearings require a negative amount" | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,25 +2,25 @@ | ||||
|     "hsadminNgApp": { | ||||
|         "share": { | ||||
|             "home": { | ||||
|                 "title": "Shares", | ||||
|                 "createLabel": "Create a new Share", | ||||
|                 "createOrEditLabel": "Create or edit a Share" | ||||
|                 "title": "Share Transactions", | ||||
|                 "createLabel": "Register a new share transaction", | ||||
|                 "createOrEditLabel": "Register or edit a share transaction" | ||||
|             }, | ||||
|             "created": "A new Share is created with identifier {{ param }}", | ||||
|             "updated": "A Share is updated with identifier {{ param }}", | ||||
|             "deleted": "A Share is deleted with identifier {{ param }}", | ||||
|             "created": "A new share transactions is registered with identifier {{ param }}", | ||||
|             "updated": "A share transaction is updated with identifier {{ param }}", | ||||
|             "deleted": "A share transcation is deleted with identifier {{ param }}", | ||||
|             "delete": { | ||||
|                 "question": "Are you sure you want to delete Share {{ id }}?" | ||||
|                 "question": "Are you sure you want to delete share transaction {{ id }}?" | ||||
|             }, | ||||
|             "detail": { | ||||
|                 "title": "Share" | ||||
|                 "title": "Share transaction" | ||||
|             }, | ||||
|             "documentDate": "Document Date", | ||||
|             "valueDate": "Value Date", | ||||
|             "documentDate": "Document date", | ||||
|             "valueDate": "Value date", | ||||
|             "action": "Action", | ||||
|             "quantity": "Quantity", | ||||
|             "remark": "Remark", | ||||
|             "membership": "Membership" | ||||
|             "membership": "Related membership" | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,8 +2,8 @@ | ||||
|     "hsadminNgApp": { | ||||
|         "ShareAction": { | ||||
|             "null": "", | ||||
|             "SUBSCRIPTION": "SUBSCRIPTION", | ||||
|             "CANCELLATION": "CANCELLATION" | ||||
|             "SUBSCRIPTION": "Subscription", | ||||
|             "CANCELLATION": "Cancellation" | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,205 @@ | ||||
| package org.hostsharing.hsadminng.service; | ||||
|  | ||||
| import org.assertj.core.api.AbstractThrowableAssert; | ||||
| import org.hostsharing.hsadminng.domain.enumeration.AssetAction; | ||||
| import org.hostsharing.hsadminng.service.dto.AssetDTO; | ||||
| import org.hostsharing.hsadminng.web.rest.errors.BadRequestAlertException; | ||||
| import org.junit.Test; | ||||
|  | ||||
| import java.math.BigDecimal; | ||||
| import java.time.LocalDate; | ||||
| import java.util.function.Consumer; | ||||
|  | ||||
| import static org.assertj.core.api.Assertions.assertThat; | ||||
| import static org.assertj.core.api.Assertions.catchThrowableOfType; | ||||
|  | ||||
| public class AssetValidatorUnitTest { | ||||
|  | ||||
|     private AssetValidator assetValidator = new AssetValidator(); | ||||
|  | ||||
|     @Test | ||||
|     public void shouldAcceptValidAssetDTO() { | ||||
|         new GivenAssetValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(AssetAction.PAYMENT).withAmount("64.00") | ||||
|             .when((AssetDTO assetDto) -> assetValidator.validate(assetDto)) | ||||
|             .thenActualException().isNull(); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldAcceptIfDocumentDateEqualsValueDate() { | ||||
|         new GivenAssetValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-11") | ||||
|             .withAction(AssetAction.PAYMENT).withAmount("64.00") | ||||
|             .when((AssetDTO assetDto) -> assetValidator.validate(assetDto)) | ||||
|             .thenActualException().isNull(); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfDocumentDateAfterValueDate() { | ||||
|         new GivenAssetValidationTestCase() | ||||
|             .withDocumentDate("2019-04-13").withValueDate("2019-04-12") | ||||
|             .withAction(AssetAction.PAYMENT).withAmount("64.00") | ||||
|             .when((AssetDTO assetDto) -> assetValidator.validate(assetDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Document date may not be after value date", "asset", "documentDateMayNotBeAfterValueDate")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfPaymentWithNegativeAmount() { | ||||
|         new GivenAssetValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(AssetAction.PAYMENT).withAmount("-64.00") | ||||
|             .when((AssetDTO assetDto) -> assetValidator.validate(assetDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Asset payments require a positive amount", "asset", "assetPaymentsPositiveAmount")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfPaymentWithZeroAmount() { | ||||
|         new GivenAssetValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(AssetAction.PAYMENT).withAmount("0.00") | ||||
|             .when((AssetDTO assetDto) -> assetValidator.validate(assetDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Asset payments require a positive amount", "asset", "assetPaymentsPositiveAmount")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfAdoptionWithNegativeAmount() { | ||||
|         new GivenAssetValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(AssetAction.ADOPTION).withAmount("-64.00") | ||||
|             .when((AssetDTO assetDto) -> assetValidator.validate(assetDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Asset adoptions require a positive amount", "asset", "assetAdoptionsPositiveAmount")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfAdoptionWithZeroAmount() { | ||||
|         new GivenAssetValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(AssetAction.ADOPTION).withAmount("0.00") | ||||
|             .when((AssetDTO assetDto) -> assetValidator.validate(assetDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Asset adoptions require a positive amount", "asset", "assetAdoptionsPositiveAmount")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfPaybackWithPositiveAmount() { | ||||
|         new GivenAssetValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(AssetAction.PAYBACK).withAmount("64.00") | ||||
|             .when((AssetDTO assetDto) -> assetValidator.validate(assetDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Asset paybacks require a negative amount", "asset", "assetPaybacksNegativeAmount")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfPaybackWithZeroAmount() { | ||||
|         new GivenAssetValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(AssetAction.PAYBACK).withAmount("0.00") | ||||
|             .when((AssetDTO assetDto) -> assetValidator.validate(assetDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Asset paybacks require a negative amount", "asset", "assetPaybacksNegativeAmount")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfHandoverWithPositiveAmount() { | ||||
|         new GivenAssetValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(AssetAction.HANDOVER).withAmount("64.00") | ||||
|             .when((AssetDTO assetDto) -> assetValidator.validate(assetDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Asset handovers require a negative amount", "asset", "assetHandoversNegativeAmount")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfHandoverWithZeroAmount() { | ||||
|         new GivenAssetValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(AssetAction.HANDOVER).withAmount("0.00") | ||||
|             .when((AssetDTO assetDto) -> assetValidator.validate(assetDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Asset handovers require a negative amount", "asset", "assetHandoversNegativeAmount")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfLossWithPositiveAmount() { | ||||
|         new GivenAssetValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(AssetAction.LOSS).withAmount("64.00") | ||||
|             .when((AssetDTO assetDto) -> assetValidator.validate(assetDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Asset losses require a negative amount", "asset", "assetLossesNegativeAmount")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfLossWithZeroAmount() { | ||||
|         new GivenAssetValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(AssetAction.LOSS).withAmount("0.00") | ||||
|             .when((AssetDTO assetDto) -> assetValidator.validate(assetDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Asset losses require a negative amount", "asset", "assetLossesNegativeAmount")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfClearingWithPositiveAmount() { | ||||
|         new GivenAssetValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(AssetAction.CLEARING).withAmount("64.00") | ||||
|             .when((AssetDTO assetDto) -> assetValidator.validate(assetDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Asset clearings require a negative amount", "asset", "assetClearingsNegativeAmount")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfClearingWithZeroAmount() { | ||||
|         new GivenAssetValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(AssetAction.CLEARING).withAmount("0.00") | ||||
|             .when((AssetDTO assetDto) -> assetValidator.validate(assetDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Asset clearings require a negative amount", "asset", "assetClearingsNegativeAmount")); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     // -- only test fixture below --- | ||||
|  | ||||
|     private class GivenAssetValidationTestCase { | ||||
|  | ||||
|         private final AssetDTO assetDto = new AssetDTO(); | ||||
|         private BadRequestAlertException actualException; | ||||
|  | ||||
|         GivenAssetValidationTestCase withDocumentDate(String documentDate) { | ||||
|             assetDto.setDocumentDate(LocalDate.parse(documentDate)); | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         GivenAssetValidationTestCase withValueDate(String valueDate) { | ||||
|             assetDto.setValueDate(LocalDate.parse(valueDate)); | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         GivenAssetValidationTestCase withAction(AssetAction assetAction) { | ||||
|             assetDto.setAction(assetAction); | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         GivenAssetValidationTestCase withAmount(String amount) { | ||||
|             assetDto.setAmount(new BigDecimal(amount)); | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         GivenAssetValidationTestCase  when(final Consumer<AssetDTO> statement) { | ||||
|             actualException = catchThrowableOfType(() -> assetValidator.validate(assetDto), BadRequestAlertException.class); | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         public AbstractThrowableAssert<?, ? extends Throwable> thenActualException() { | ||||
|             return assertThat(actualException); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,126 @@ | ||||
| package org.hostsharing.hsadminng.service; | ||||
|  | ||||
| import org.assertj.core.api.AbstractThrowableAssert; | ||||
| import org.hostsharing.hsadminng.domain.enumeration.ShareAction; | ||||
| import org.hostsharing.hsadminng.service.dto.ShareDTO; | ||||
| import org.hostsharing.hsadminng.web.rest.errors.BadRequestAlertException; | ||||
| import org.junit.Test; | ||||
|  | ||||
| import java.time.LocalDate; | ||||
| import java.util.function.Consumer; | ||||
|  | ||||
| import static org.assertj.core.api.Assertions.assertThat; | ||||
| import static org.assertj.core.api.Assertions.catchThrowableOfType; | ||||
|  | ||||
| public class ShareValidatorUnitTest { | ||||
|  | ||||
|     private ShareValidator shareValidator = new ShareValidator(); | ||||
|  | ||||
|     @Test | ||||
|     public void shouldAcceptValidShareDTO() { | ||||
|         new GivenShareValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(ShareAction.SUBSCRIPTION).withQuantity(1) | ||||
|             .when((ShareDTO shareDto) -> shareValidator.validate(shareDto)) | ||||
|             .thenActualException().isNull(); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldAcceptIfDocumentDateEqualsValueDate() { | ||||
|         new GivenShareValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-11") | ||||
|             .withAction(ShareAction.SUBSCRIPTION).withQuantity(1) | ||||
|             .when((ShareDTO shareDto) -> shareValidator.validate(shareDto)) | ||||
|             .thenActualException().isNull(); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfDocumentDateAfterValueDate() { | ||||
|         new GivenShareValidationTestCase() | ||||
|             .withDocumentDate("2019-04-13").withValueDate("2019-04-12") | ||||
|             .withAction(ShareAction.SUBSCRIPTION).withQuantity(1) | ||||
|             .when((ShareDTO shareDto) -> shareValidator.validate(shareDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Document date may not be after value date", "share", "documentDateMayNotBeAfterValueDate")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfSubscriptionWithNegativeQuantity() { | ||||
|         new GivenShareValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(ShareAction.SUBSCRIPTION).withQuantity(-1) | ||||
|             .when((ShareDTO shareDto) -> shareValidator.validate(shareDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Share subscriptions require a positive quantity", "share", "shareSubscriptionPositiveQuantity")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfSubscriptionWithZeroQuantity() { | ||||
|         new GivenShareValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(ShareAction.SUBSCRIPTION).withQuantity(0) | ||||
|             .when((ShareDTO shareDto) -> shareValidator.validate(shareDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Share subscriptions require a positive quantity", "share", "shareSubscriptionPositiveQuantity")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfCancellationWithPositiveQuantity() { | ||||
|         new GivenShareValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(ShareAction.CANCELLATION).withQuantity(1) | ||||
|             .when((ShareDTO shareDto) -> shareValidator.validate(shareDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Share cancellations require a negative quantity", "share", "shareCancellationNegativeQuantity")); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldRejectIfCancellationWithZeroQuantity() { | ||||
|         new GivenShareValidationTestCase() | ||||
|             .withDocumentDate("2019-04-11").withValueDate("2019-04-12") | ||||
|             .withAction(ShareAction.CANCELLATION).withQuantity(0) | ||||
|             .when((ShareDTO shareDto) -> shareValidator.validate(shareDto)) | ||||
|             .thenActualException().isEqualToComparingFieldByField(new BadRequestAlertException( | ||||
|             "Share cancellations require a negative quantity", "share", "shareCancellationNegativeQuantity")); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     // -- only test fixture below --- | ||||
|  | ||||
|     private class GivenShareValidationTestCase { | ||||
|  | ||||
|         private final ShareDTO shareDto = new ShareDTO(); | ||||
|         private BadRequestAlertException actualException; | ||||
|  | ||||
|         GivenShareValidationTestCase withDocumentDate(String documentDate) { | ||||
|             shareDto.setDocumentDate(LocalDate.parse(documentDate)); | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         GivenShareValidationTestCase withValueDate(String valueDate) { | ||||
|             shareDto.setValueDate(LocalDate.parse(valueDate)); | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         GivenShareValidationTestCase withAction(ShareAction shareAction) { | ||||
|             shareDto.setAction(shareAction); | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         GivenShareValidationTestCase withQuantity(Integer quantity) { | ||||
|             shareDto.setQuantity(quantity); | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         GivenShareValidationTestCase  when(final Consumer<ShareDTO> statement) { | ||||
|             actualException = catchThrowableOfType(() -> shareValidator.validate(shareDto), BadRequestAlertException.class); | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         public AbstractThrowableAssert<?, ? extends Throwable> thenActualException() { | ||||
|             return assertThat(actualException); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user