From c88505ef2cdc01dd2e41db58ccb71a9f6557208d Mon Sep 17 00:00:00 2001 From: amihaiemil Date: Tue, 9 Mar 2021 10:17:45 +0200 Subject: [PATCH 1/3] #1045 removed Invoice.paymentTime() and transactionId() --- .../main/java/com/selfxdsd/api/Invoice.java | 12 ----- .../contracts/invoices/StoredInvoice.java | 10 ---- .../invoices/StoredInvoiceTestCase.java | 51 ------------------- .../core/projects/FakeWalletTestCase.java | 4 -- 4 files changed, 77 deletions(-) diff --git a/self-api/src/main/java/com/selfxdsd/api/Invoice.java b/self-api/src/main/java/com/selfxdsd/api/Invoice.java index d89da62b..593dbc69 100644 --- a/self-api/src/main/java/com/selfxdsd/api/Invoice.java +++ b/self-api/src/main/java/com/selfxdsd/api/Invoice.java @@ -42,18 +42,6 @@ public interface Invoice { */ LocalDateTime createdAt(); - /** - * Timestamp of the payment. - * @return LocalDateTime or null if it's not paid. - */ - LocalDateTime paymentTime(); - - /** - * Returns the transaction ID of the payment. - * @return String or null if it's not paid. - */ - String transactionId(); - /** * Who emitted the Invoice? * @return String. diff --git a/self-core-impl/src/main/java/com/selfxdsd/core/contracts/invoices/StoredInvoice.java b/self-core-impl/src/main/java/com/selfxdsd/core/contracts/invoices/StoredInvoice.java index 0a2604ca..d2e7bb9f 100644 --- a/self-core-impl/src/main/java/com/selfxdsd/core/contracts/invoices/StoredInvoice.java +++ b/self-core-impl/src/main/java/com/selfxdsd/core/contracts/invoices/StoredInvoice.java @@ -170,16 +170,6 @@ public LocalDateTime createdAt() { return this.createdAt; } - @Override - public LocalDateTime paymentTime() { - return this.paymentTime; - } - - @Override - public String transactionId() { - return this.transactionId; - } - @Override public String billedBy() { final String billedBy; diff --git a/self-core-impl/src/test/java/com/selfxdsd/core/contracts/invoices/StoredInvoiceTestCase.java b/self-core-impl/src/test/java/com/selfxdsd/core/contracts/invoices/StoredInvoiceTestCase.java index 9d6c4fa1..69ebbd29 100644 --- a/self-core-impl/src/test/java/com/selfxdsd/core/contracts/invoices/StoredInvoiceTestCase.java +++ b/self-core-impl/src/test/java/com/selfxdsd/core/contracts/invoices/StoredInvoiceTestCase.java @@ -274,57 +274,6 @@ public void hasCreationTime() { ); } - /** - * A StoredInvoice can return its payment time. - */ - @Test - public void hasPaymentTime() { - final LocalDateTime paymentTime = LocalDateTime.now(); - final Storage storage = Mockito.mock(Storage.class); - final Invoice invoice = new StoredInvoice( - 1, - Mockito.mock(Contract.class), - LocalDateTime.now(), - paymentTime, - "transactionId", - "mihai", - "vlad", - "RO", - "RO", - BigDecimal.valueOf(487), - storage - ); - MatcherAssert.assertThat( - invoice.paymentTime(), - Matchers.is(paymentTime) - ); - } - - /** - * A StoredInvoice can return its transaction id. - */ - @Test - public void hasTransactionId() { - final LocalDateTime paymentTime = LocalDateTime.now(); - final Invoice invoice = new StoredInvoice( - 1, - Mockito.mock(Contract.class), - LocalDateTime.now(), - paymentTime, - "transactionId123", - "mihai", - "vlad", - "RO", - "RO", - BigDecimal.valueOf(487), - mock(Storage.class) - ); - MatcherAssert.assertThat( - invoice.transactionId(), - Matchers.is("transactionId123") - ); - } - /** * A StoredInvoice will not register a Task which is from * another Contract. diff --git a/self-core-impl/src/test/java/com/selfxdsd/core/projects/FakeWalletTestCase.java b/self-core-impl/src/test/java/com/selfxdsd/core/projects/FakeWalletTestCase.java index 3e865977..7de5a6f3 100644 --- a/self-core-impl/src/test/java/com/selfxdsd/core/projects/FakeWalletTestCase.java +++ b/self-core-impl/src/test/java/com/selfxdsd/core/projects/FakeWalletTestCase.java @@ -357,10 +357,6 @@ public void canPayInvoice() { MatcherAssert.assertThat(paidInvoice.isPaid(), Matchers.is(true)); MatcherAssert.assertThat(paidInvoice.invoiceId(), Matchers.is(invoice.invoiceId())); - MatcherAssert.assertThat(paidInvoice.paymentTime(), - Matchers.notNullValue()); - MatcherAssert.assertThat(paidInvoice.transactionId(), - Matchers.notNullValue()); } /** From e33163aa3c2c480afcd8f4de6f1a1b1211755995 Mon Sep 17 00:00:00 2001 From: amihaiemil Date: Tue, 9 Mar 2021 11:22:12 +0200 Subject: [PATCH 2/3] #1045 StoredInvoice takes latest Payment instead of transactionId & paymentTime --- .../main/java/com/selfxdsd/api/Invoice.java | 7 ++ .../contracts/invoices/StoredInvoice.java | 33 +++---- .../selfxdsd/core/projects/FakeWallet.java | 15 ++- .../RegisterUnsuccessfulPayments.java | 4 +- .../selfxdsd/core/projects/StripeWallet.java | 15 ++- .../invoices/StoredInvoiceTestCase.java | 94 ++++++++----------- .../selfxdsd/core/mock/InMemoryInvoices.java | 1 - .../core/projects/FakeWalletTestCase.java | 1 + 8 files changed, 89 insertions(+), 81 deletions(-) diff --git a/self-api/src/main/java/com/selfxdsd/api/Invoice.java b/self-api/src/main/java/com/selfxdsd/api/Invoice.java index 593dbc69..1ebe49de 100644 --- a/self-api/src/main/java/com/selfxdsd/api/Invoice.java +++ b/self-api/src/main/java/com/selfxdsd/api/Invoice.java @@ -42,6 +42,13 @@ public interface Invoice { */ LocalDateTime createdAt(); + /** + * Latest Payment performed for this Invoice. If the Payment is successful, + * the Invoice is considered paid. + * @return Payment or null if no Payment as been performed yet. + */ + Payment latest(); + /** * Who emitted the Invoice? * @return String. diff --git a/self-core-impl/src/main/java/com/selfxdsd/core/contracts/invoices/StoredInvoice.java b/self-core-impl/src/main/java/com/selfxdsd/core/contracts/invoices/StoredInvoice.java index d2e7bb9f..aab850c5 100644 --- a/self-core-impl/src/main/java/com/selfxdsd/core/contracts/invoices/StoredInvoice.java +++ b/self-core-impl/src/main/java/com/selfxdsd/core/contracts/invoices/StoredInvoice.java @@ -48,14 +48,10 @@ public final class StoredInvoice implements Invoice { private final LocalDateTime createdAt; /** - * Time when this Invoice has been paid. + * Latest Payment performed for this Invoice. If it's successful, + * then this Invoice is considered paid. */ - private final LocalDateTime paymentTime; - - /** - * The payment's transaction ID. - */ - private final String transactionId; + private final Payment latest; /** * Who emitted this Invoice? @@ -92,8 +88,7 @@ public final class StoredInvoice implements Invoice { * @param id Invoice id. * @param contract Contract. * @param createdAt Invoice creation time. - * @param paymentTime Time when this Invoice has been paid. - * @param transactionId The payment's transaction ID. + * @param latest Latest Payment performed for this Invoice. * @param billedBy Who emitted the Invoice. * @param billedTo Who pays it. * @param billedByCountry Country of the Contributor. @@ -106,8 +101,7 @@ public StoredInvoice( final int id, final Contract contract, final LocalDateTime createdAt, - final LocalDateTime paymentTime, - final String transactionId, + final Payment latest, final String billedBy, final String billedTo, final String billedByCountry, @@ -118,8 +112,7 @@ public StoredInvoice( this.id = id; this.contract = contract; this.createdAt = createdAt; - this.paymentTime = paymentTime; - this.transactionId = transactionId; + this.latest = latest; this.billedBy = billedBy; this.billedTo = billedTo; this.billedByCountry = billedByCountry; @@ -170,6 +163,11 @@ public LocalDateTime createdAt() { return this.createdAt; } + @Override + public Payment latest() { + return this.latest; + } + @Override public String billedBy() { final String billedBy; @@ -223,18 +221,21 @@ public InvoicedTasks tasks() { @Override public boolean isPaid() { - return this.paymentTime != null && this.transactionId != null; + return this.latest != null && this.latest.status().equalsIgnoreCase( + Payment.Status.SUCCESSFUL + ); } @Override public PlatformInvoice platformInvoice() { final PlatformInvoice found; if(this.isPaid()) { - if(this.transactionId.startsWith("fake_payment_")) { + final String transactionId = this.latest.transactionId(); + if(transactionId.startsWith("fake_payment_")) { found = null; } else { found = this.storage.platformInvoices().getByPayment( - this.transactionId, this.paymentTime + transactionId, this.latest.paymentTime() ); } } else { diff --git a/self-core-impl/src/main/java/com/selfxdsd/core/projects/FakeWallet.java b/self-core-impl/src/main/java/com/selfxdsd/core/projects/FakeWallet.java index d397fccf..b2560391 100644 --- a/self-core-impl/src/main/java/com/selfxdsd/core/projects/FakeWallet.java +++ b/self-core-impl/src/main/java/com/selfxdsd/core/projects/FakeWallet.java @@ -26,6 +26,7 @@ import com.selfxdsd.api.exceptions.PaymentMethodsException; import com.selfxdsd.api.storage.Storage; import com.selfxdsd.core.contracts.invoices.StoredInvoice; +import com.selfxdsd.core.contracts.invoices.StoredPayment; import com.stripe.model.SetupIntent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -111,7 +112,8 @@ public Payment pay(final Invoice invoice) { + " of Contract " + invoice.contract().contractId() + "..." ); - final BigDecimal newCash = this.limit.subtract(invoice.totalAmount()); + final BigDecimal totalAmount = invoice.totalAmount(); + final BigDecimal newCash = this.limit.subtract(totalAmount); final String uuid = UUID.randomUUID().toString().replace("-", ""); final Payment payment = this.storage .invoices() @@ -120,8 +122,15 @@ public Payment pay(final Invoice invoice) { invoice.invoiceId(), invoice.contract(), invoice.createdAt(), - LocalDateTime.now(), - "fake_payment_" + uuid, + new StoredPayment( + invoice, + "fake_payment_" + uuid, + LocalDateTime.now(), + totalAmount, + Payment.Status.SUCCESSFUL, + "", + this.storage + ), invoice.billedBy(), invoice.billedTo(), "FK Country", diff --git a/self-core-impl/src/main/java/com/selfxdsd/core/projects/RegisterUnsuccessfulPayments.java b/self-core-impl/src/main/java/com/selfxdsd/core/projects/RegisterUnsuccessfulPayments.java index 02d6805e..35c44a5c 100644 --- a/self-core-impl/src/main/java/com/selfxdsd/core/projects/RegisterUnsuccessfulPayments.java +++ b/self-core-impl/src/main/java/com/selfxdsd/core/projects/RegisterUnsuccessfulPayments.java @@ -63,13 +63,13 @@ public Payment pay(final Invoice invoice) { payment = this.original.pay(invoice); } catch (final WalletPaymentException failed) { payment = invoice.payments().register( - invoice, null, LocalDateTime.now(), + invoice, "", LocalDateTime.now(), invoice.totalAmount(), Payment.Status.FAILED, failed.getMessage() ); } catch (final IllegalStateException errored) { payment = invoice.payments().register( - invoice, null, LocalDateTime.now(), + invoice, "", LocalDateTime.now(), invoice.totalAmount(), Payment.Status.ERROR, errored.getMessage() ); diff --git a/self-core-impl/src/main/java/com/selfxdsd/core/projects/StripeWallet.java b/self-core-impl/src/main/java/com/selfxdsd/core/projects/StripeWallet.java index b59b09ed..2e52e150 100644 --- a/self-core-impl/src/main/java/com/selfxdsd/core/projects/StripeWallet.java +++ b/self-core-impl/src/main/java/com/selfxdsd/core/projects/StripeWallet.java @@ -27,6 +27,7 @@ import com.selfxdsd.api.storage.Storage; import com.selfxdsd.core.Env; import com.selfxdsd.core.contracts.invoices.StoredInvoice; +import com.selfxdsd.core.contracts.invoices.StoredPayment; import com.stripe.Stripe; import com.stripe.exception.StripeException; import com.stripe.model.Customer; @@ -205,11 +206,12 @@ public Payment pay(final Invoice invoice) { invoice.commission(), contributorBilling ); + final BigDecimal totalAmount = invoice.totalAmount(); final PaymentIntent paymentIntent = PaymentIntent .create( PaymentIntentCreateParams.builder() .setCurrency("eur") - .setAmount(invoice.totalAmount().longValueExact()) + .setAmount(totalAmount.longValueExact()) .setCustomer(this.identifier) .setPaymentMethod(paymentMethod.identifier()) .setTransferData( @@ -244,8 +246,15 @@ public Payment pay(final Invoice invoice) { invoice.invoiceId(), invoice.contract(), invoice.createdAt(), - paymentDate, - paymentIntent.getId(), + new StoredPayment( + invoice, + paymentIntent.getId(), + paymentDate, + totalAmount, + Payment.Status.SUCCESSFUL, + "", + this.storage + ), invoice.billedBy(), invoice.billedTo(), contributorBilling.country(), diff --git a/self-core-impl/src/test/java/com/selfxdsd/core/contracts/invoices/StoredInvoiceTestCase.java b/self-core-impl/src/test/java/com/selfxdsd/core/contracts/invoices/StoredInvoiceTestCase.java index 69ebbd29..6b614318 100644 --- a/self-core-impl/src/test/java/com/selfxdsd/core/contracts/invoices/StoredInvoiceTestCase.java +++ b/self-core-impl/src/test/java/com/selfxdsd/core/contracts/invoices/StoredInvoiceTestCase.java @@ -42,8 +42,7 @@ public void hasCorrectId() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -64,8 +63,7 @@ public void returnsContract() { 1, contract, LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -86,8 +84,7 @@ public void returnsTasks() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transactionID", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -127,8 +124,7 @@ public void returnsTotalAmount() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transactionID", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -171,8 +167,7 @@ public void returnsAmount() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transactionID", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -215,8 +210,7 @@ public void returnsCommission() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transactionID", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -259,8 +253,7 @@ public void hasCreationTime() { 1, Mockito.mock(Contract.class), creationTime, - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -293,8 +286,7 @@ public void registerRejectsForeignTask() { 1, contract, LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -332,12 +324,13 @@ public void registerComplainsIfInvoiceIsPaid() { Contract.Roles.DEV ) ); + final Payment payment = Mockito.mock(Payment.class); + Mockito.when(payment.status()).thenReturn(Payment.Status.SUCCESSFUL); final Invoice invoice = new StoredInvoice( 1, contract, LocalDateTime.now(), - LocalDateTime.now(), - "transactionId123", + payment, "mihai", "vlad", "RO", @@ -393,7 +386,6 @@ public void registersNewTask() { contract, LocalDateTime.now(), null, - null, "mihai", "vlad", "RO", @@ -430,8 +422,7 @@ public void comparesStoredInvoiceObjects() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -443,8 +434,7 @@ public void comparesStoredInvoiceObjects() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -464,8 +454,7 @@ public void verifiesStoredInvoiceHashcode() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -477,8 +466,7 @@ public void verifiesStoredInvoiceHashcode() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -501,8 +489,7 @@ public void returnsSetBilledBy() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -527,8 +514,7 @@ public void returnsSetBilledByCountry() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", "vlad", "BG", @@ -553,8 +539,7 @@ public void returnsSetBilledTo() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -579,8 +564,7 @@ public void returnsSetBilledToCountry() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -605,8 +589,7 @@ public void returnsSetEurToRon() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", @@ -630,8 +613,7 @@ public void returnsBnrEurToRon() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", "vlad", null, @@ -662,8 +644,7 @@ public void returnsContractBilledBy() { 1, contract, LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), null, "vlad", "RO", @@ -694,8 +675,7 @@ public void returnsContractBilledByCountry() { 1, contract, LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), null, "vlad", null, @@ -726,8 +706,7 @@ public void returnsContractBilledTo() { 1, contract, LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", null, "RO", @@ -758,8 +737,7 @@ public void returnsContractBilledToCountry() { 1, contract, LocalDateTime.now(), - LocalDateTime.now(), - "transacetionId123", + Mockito.mock(Payment.class), "mihai", null, null, @@ -789,7 +767,6 @@ public void noPlatformInvoiceIfActive() { Mockito.mock(Contract.class), LocalDateTime.now(), null, - null, "mihai", "vlad", "RO", @@ -815,12 +792,14 @@ public void noPlatformInvoiceIfFakePayment() { "PlatformInvoices storage should not be called!" ) ); + final Payment fake = Mockito.mock(Payment.class); + Mockito.when(fake.status()).thenReturn(Payment.Status.SUCCESSFUL); + Mockito.when(fake.transactionId()).thenReturn("fake_payment_123"); final Invoice invoice = new StoredInvoice( 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "fake_payment_123", + fake, "mihai", "vlad", "RO", @@ -852,12 +831,15 @@ public void returnsPlatformInvoiceIfRealPayment() { Mockito.when(all.getByPayment(transactionId, payment)) .thenReturn(found); + final Payment successful = Mockito.mock(Payment.class); + Mockito.when(successful.status()).thenReturn(Payment.Status.SUCCESSFUL); + Mockito.when(successful.transactionId()).thenReturn(transactionId); + Mockito.when(successful.paymentTime()).thenReturn(payment); final Invoice invoice = new StoredInvoice( 1, Mockito.mock(Contract.class), LocalDateTime.now(), - payment, - transactionId, + successful, "mihai", "vlad", "RO", @@ -899,6 +881,8 @@ public void returnsOutputOfPdfFile() throws IOException { ), storage ); + final Payment payment = Mockito.mock(Payment.class); + Mockito.when(payment.status()).thenReturn(Payment.Status.SUCCESSFUL); final Invoice invoice = new StoredInvoice( 1, new StoredContract( @@ -914,8 +898,7 @@ public void returnsOutputOfPdfFile() throws IOException { storage ), LocalDateTime.now(), - LocalDateTime.now(), - "transaction123", + payment, "mihai", "contributro", "RO", @@ -961,8 +944,7 @@ public void returnsPayments() { 1, Mockito.mock(Contract.class), LocalDateTime.now(), - LocalDateTime.now(), - "transactionID", + Mockito.mock(Payment.class), "mihai", "vlad", "RO", diff --git a/self-core-impl/src/test/java/com/selfxdsd/core/mock/InMemoryInvoices.java b/self-core-impl/src/test/java/com/selfxdsd/core/mock/InMemoryInvoices.java index 596e7bc3..5709acd1 100644 --- a/self-core-impl/src/test/java/com/selfxdsd/core/mock/InMemoryInvoices.java +++ b/self-core-impl/src/test/java/com/selfxdsd/core/mock/InMemoryInvoices.java @@ -80,7 +80,6 @@ public Invoice createNewInvoice(final Contract.Id contractId) { null, null, null, - null, BigDecimal.valueOf(0), this.storage ); diff --git a/self-core-impl/src/test/java/com/selfxdsd/core/projects/FakeWalletTestCase.java b/self-core-impl/src/test/java/com/selfxdsd/core/projects/FakeWalletTestCase.java index 7de5a6f3..4dcef6bf 100644 --- a/self-core-impl/src/test/java/com/selfxdsd/core/projects/FakeWalletTestCase.java +++ b/self-core-impl/src/test/java/com/selfxdsd/core/projects/FakeWalletTestCase.java @@ -357,6 +357,7 @@ public void canPayInvoice() { MatcherAssert.assertThat(paidInvoice.isPaid(), Matchers.is(true)); MatcherAssert.assertThat(paidInvoice.invoiceId(), Matchers.is(invoice.invoiceId())); + MatcherAssert.assertThat(paidInvoice.latest(), Matchers.notNullValue()); } /** From 19f307101d8f5dfca2494a89abdc9d8ce647e3ed Mon Sep 17 00:00:00 2001 From: amihaiemil Date: Tue, 9 Mar 2021 11:28:06 +0200 Subject: [PATCH 3/3] #1045 missing unit test --- .../invoices/StoredInvoiceTestCase.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/self-core-impl/src/test/java/com/selfxdsd/core/contracts/invoices/StoredInvoiceTestCase.java b/self-core-impl/src/test/java/com/selfxdsd/core/contracts/invoices/StoredInvoiceTestCase.java index 6b614318..83061874 100644 --- a/self-core-impl/src/test/java/com/selfxdsd/core/contracts/invoices/StoredInvoiceTestCase.java +++ b/self-core-impl/src/test/java/com/selfxdsd/core/contracts/invoices/StoredInvoiceTestCase.java @@ -53,6 +53,28 @@ public void hasCorrectId() { assertThat(invoice.invoiceId(), is(1)); } + /** + * Invoice has the latest Payment. + */ + @Test + public void hasLatestPayment() { + final Payment latest = Mockito.mock(Payment.class); + final Invoice invoice = new StoredInvoice( + 1, + Mockito.mock(Contract.class), + LocalDateTime.now(), + latest, + "mihai", + "vlad", + "RO", + "RO", + BigDecimal.valueOf(487), + Mockito.mock(Storage.class) + ); + assertThat(invoice.latest(), is(latest)); + } + + /** * Invoice has the correct contract id. */