From 6f5f9c76004d321c3decf98594ca3051fb57d690 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Mon, 14 Nov 2022 00:02:03 +0100 Subject: [PATCH] #409 - Retain original order state in case of failing completion. We now properly reset the order's status in case of an exception being thrown from event listeners. --- .../org/salespointframework/order/Order.java | 17 +++++++++++++++-- .../order/PersistentOrderManagement.java | 11 ++++++++++- .../order/OrderManagementTests.java | 3 ++- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/salespointframework/order/Order.java b/src/main/java/org/salespointframework/order/Order.java index 58ae5d8c..d198700b 100755 --- a/src/main/java/org/salespointframework/order/Order.java +++ b/src/main/java/org/salespointframework/order/Order.java @@ -439,6 +439,19 @@ Order complete() { return this; } + /** + * Resets the {@link Order}'s state to paid. + * + * @return the current instance. + * @since 8.0.1 + */ + Order uncomplete() { + + this.orderStatus = OrderStatus.PAID; + + return this; + } + /** * Cancels the current {@link Order} with the given reason. Will publish an {@link OrderCanceled} even * @@ -490,8 +503,8 @@ void verifyConstraints() { } /** - * Asserts that the {@link Order} is {@link OrderStatus#OPEN}. Usually a precondition to manipulate the - * {@link Order} state internally. + * Asserts that the {@link Order} is {@link OrderStatus#OPEN}. Usually a precondition to manipulate the {@link Order} + * state internally. */ private void assertOrderIsOpen() { diff --git a/src/main/java/org/salespointframework/order/PersistentOrderManagement.java b/src/main/java/org/salespointframework/order/PersistentOrderManagement.java index 167393dc..a7fd3129 100755 --- a/src/main/java/org/salespointframework/order/PersistentOrderManagement.java +++ b/src/main/java/org/salespointframework/order/PersistentOrderManagement.java @@ -144,7 +144,16 @@ public void completeOrder(final T order) { throw new OrderCompletionFailure(order, "Order is not paid yet!"); } - save((T) order.complete()); + try { + + save((T) order.complete()); + + } catch (RuntimeException o_O) { + + order.uncomplete(); + + throw o_O; + } } /* diff --git a/src/test/java/org/salespointframework/order/OrderManagementTests.java b/src/test/java/org/salespointframework/order/OrderManagementTests.java index 8ef33583..9278af7c 100644 --- a/src/test/java/org/salespointframework/order/OrderManagementTests.java +++ b/src/test/java/org/salespointframework/order/OrderManagementTests.java @@ -108,7 +108,7 @@ void completesOrderIfAllLineItemsAreAvailableInSufficientQuantity() { orders.completeOrder(order); } - @Test // #38 + @Test // #38, #409 void failsOrderCompletionIfLineItemsAreNotAvailableInSufficientQuantity() { var cookie = catalog.save(new Cookie("Double choc", Money.of(1.2, Currencies.EURO))); @@ -119,6 +119,7 @@ void failsOrderCompletionIfLineItemsAreNotAvailableInSufficientQuantity() { assertThatExceptionOfType(OrderCompletionFailure.class) // .isThrownBy(() -> orders.completeOrder(order)); + assertThat(order.isCompleted()).isFalse(); } @Test // #61