Port Round 2 to Java (OrderBook): 14 tests total green, START state preserved

This commit is contained in:
2026-10-01 13:38:42 +01:00
parent f927998149
commit 2831b8c3f9
5 changed files with 259 additions and 0 deletions
+6
View File
@@ -25,5 +25,11 @@
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${assertj.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,121 @@
package orderbooktests;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import org.junit.jupiter.api.Test;
import orderbookdomain.OrderBook;
import orderbookdomain.OrderStatus;
class OrderBookLifecycleTests {
private static final Instant DAY_0 = Instant.parse("2025-06-01T00:00:00Z");
private static Instant at(int day) {
return DAY_0.plus(day, ChronoUnit.DAYS);
}
@Test
void finalizeThenPay_movesOrderThroughTwoStates() {
OrderBook book = new OrderBook();
var order = book.openOrder("anna");
book.finalizeOrder(order.getId(), at(1));
assertThat(book.getOrder(order.getId()).getStatus()).isEqualTo(OrderStatus.WAITING_FOR_PAYMENT);
book.payOrder(order.getId(), at(2));
assertThat(book.getOrder(order.getId()).getStatus()).isEqualTo(OrderStatus.FULFILLING);
}
@Test
void payThenShip_deliversTheOrder() {
OrderBook book = new OrderBook();
var order = book.openOrder("anna");
book.finalizeOrder(order.getId(), at(1));
assertThat(book.getOrder(order.getId()).getStatus()).isEqualTo(OrderStatus.WAITING_FOR_PAYMENT);
book.payOrder(order.getId(), at(2));
book.shipOrder(order.getId());
assertThat(book.getOrder(order.getId()).getStatus()).isEqualTo(OrderStatus.DELIVERED);
}
@Test
void payWithinWindow_thenLatePayOnSecondOrder_cancelsOnlyThatOrder() {
OrderBook book = new OrderBook();
var first = book.openOrder("anna");
var second = book.openOrder("bram");
book.finalizeOrder(first.getId(), at(1));
book.finalizeOrder(second.getId(), at(1));
assertThat(book.getOrders()).hasSize(2);
book.payOrder(first.getId(), at(5));
assertThat(book.getOrder(first.getId()).getStatus()).isEqualTo(OrderStatus.FULFILLING);
assertThatThrownBy(() -> book.payOrder(second.getId(), at(30)))
.isInstanceOf(IllegalStateException.class);
assertThat(book.getOrder(second.getId()).getStatus()).isEqualTo(OrderStatus.CANCELLED);
}
@Test
void payBeforeFinalize_throws_thenFinalizeStillWorks() {
OrderBook book = new OrderBook();
var order = book.openOrder("anna");
assertThatThrownBy(() -> book.payOrder(order.getId(), at(1)))
.isInstanceOf(IllegalStateException.class);
assertThat(book.getOrder(order.getId()).getStatus()).isEqualTo(OrderStatus.PENDING);
book.finalizeOrder(order.getId(), at(2));
assertThat(book.getOrder(order.getId()).getStatus()).isEqualTo(OrderStatus.WAITING_FOR_PAYMENT);
}
@Test
void cancelPendingOrder_thenPayAfterCancel_throwsAgain() {
OrderBook book = new OrderBook();
var order = book.openOrder("anna");
book.cancelOrder(order.getId());
assertThat(book.getOrder(order.getId()).getStatus()).isEqualTo(OrderStatus.CANCELLED);
assertThatThrownBy(() -> book.payOrder(order.getId(), at(1)))
.isInstanceOf(IllegalStateException.class);
assertThat(book.getOrder(order.getId()).getStatus()).isEqualTo(OrderStatus.CANCELLED);
}
@Test
void shippedOrder_cannotBeCancelled() {
OrderBook book = new OrderBook();
var order = book.openOrder("anna");
book.finalizeOrder(order.getId(), at(1));
book.payOrder(order.getId(), at(2));
book.shipOrder(order.getId());
assertThat(book.getOrder(order.getId()).getStatus()).isEqualTo(OrderStatus.DELIVERED);
assertThatThrownBy(() -> book.cancelOrder(order.getId()))
.isInstanceOf(IllegalStateException.class);
assertThat(book.getOrder(order.getId()).getStatus()).isEqualTo(OrderStatus.DELIVERED);
}
@Test
void twoCustomers_interleaveTransitions_independently() {
OrderBook book = new OrderBook();
var annas = book.openOrder("anna");
var brams = book.openOrder("bram");
book.finalizeOrder(brams.getId(), at(1));
assertThat(book.getOrder(annas.getId()).getStatus()).isEqualTo(OrderStatus.PENDING);
assertThat(book.getOrder(brams.getId()).getStatus()).isEqualTo(OrderStatus.WAITING_FOR_PAYMENT);
book.payOrder(brams.getId(), at(2));
book.cancelOrder(annas.getId());
assertThat(book.getOrder(annas.getId()).getStatus()).isEqualTo(OrderStatus.CANCELLED);
assertThat(book.getOrder(brams.getId()).getStatus()).isEqualTo(OrderStatus.FULFILLING);
}
}