killbill-uncached

server: fix race condition in TestOverdue Signed-off-by:

3/14/2014 8:33:18 AM

Details

diff --git a/server/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java b/server/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java
index a473a9d..87e9b83 100644
--- a/server/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java
+++ b/server/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java
@@ -17,14 +17,17 @@
 package org.killbill.billing.jaxrs;
 
 import java.math.BigDecimal;
+import java.util.Comparator;
 import java.util.List;
 
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
 import org.killbill.billing.client.model.Account;
 import org.killbill.billing.client.model.Invoice;
+import org.killbill.billing.client.model.Invoices;
 import org.killbill.billing.client.model.Payment;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.Ordering;
 
 import static org.testng.Assert.assertEquals;
 
@@ -55,8 +58,17 @@ public class TestOverdue extends TestJaxrsBase {
         crappyWaitForLackOfProperSynchonization();
         Assert.assertEquals(killBillClient.getOverdueStateForAccount(accountJson.getAccountId()).getName(), "OD3");
 
-        // Post external payments
-        for (final Invoice invoice : killBillClient.getInvoicesForAccount(accountJson.getAccountId())) {
+        // Post external payments, paying the most recent invoice first: this is to avoid a race condition where
+        // a refresh overdue notification kicks in after the first payment, which makes the account goes CLEAR and
+        // triggers an AUTO_INVOICE_OFF tag removal (hence adjustment of the other invoices balance).
+        final Invoices invoicesForAccount = killBillClient.getInvoicesForAccount(accountJson.getAccountId());
+        final List<Invoice> mostRecentInvoiceFirst = Ordering.<Invoice>from(new Comparator<Invoice>() {
+            @Override
+            public int compare(final Invoice invoice1, final Invoice invoice2) {
+                return invoice1.getInvoiceDate().compareTo(invoice2.getInvoiceDate());
+            }
+        }).reverse().sortedCopy(invoicesForAccount);
+        for (final Invoice invoice : mostRecentInvoiceFirst) {
             if (invoice.getBalance().compareTo(BigDecimal.ZERO) > 0) {
                 final Payment payment = new Payment();
                 payment.setAccountId(accountJson.getAccountId());