Skip to content

Commit a633a2a

Browse files
committed
Fixed #56 - added missing event handlers to Order History Service
1 parent e6a7771 commit a633a2a

File tree

11 files changed

+61
-29
lines changed

11 files changed

+61
-29
lines changed

ftgo-end-to-end-tests/src/test/java/net/chrisrichardson/ftgo/endtoendtests/EndToEndTests.java

+9-4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import net.chrisrichardson.ftgo.common.Money;
99
import net.chrisrichardson.ftgo.common.PersonName;
1010
import net.chrisrichardson.ftgo.consumerservice.api.web.CreateConsumerRequest;
11+
import net.chrisrichardson.ftgo.orderservice.api.events.OrderState;
1112
import net.chrisrichardson.ftgo.orderservice.api.web.CreateOrderRequest;
1213
import net.chrisrichardson.ftgo.orderservice.api.web.ReviseOrderRequest;
1314
import net.chrisrichardson.ftgo.restaurantservice.events.CreateRestaurantRequest;
@@ -18,6 +19,7 @@
1819
import org.junit.Test;
1920

2021
import java.util.Collections;
22+
import java.util.Optional;
2123

2224
import static com.jayway.restassured.RestAssured.given;
2325
import static org.hamcrest.CoreMatchers.equalTo;
@@ -32,7 +34,7 @@ public class EndToEndTests {
3234
public static final String RESTAURANT_NAME = "My Restaurant";
3335

3436
private final int revisedQuantityOfChickenVindaloo = 10;
35-
private String host = System.getenv("DOCKER_HOST_IP");
37+
private String host = Optional.ofNullable(System.getenv("DOCKER_HOST_IP")).orElse("localhost");
3638
private int consumerId;
3739
private int restaurantId;
3840
private int orderId;
@@ -166,13 +168,16 @@ private void createOrder() {
166168

167169
verifyOrderAuthorized(orderId);
168170

169-
verifyOrderHistoryUpdated(orderId, consumerId);
171+
verifyOrderHistoryUpdated(orderId, consumerId, OrderState.APPROVED.name());
170172
}
171173

172174
private void cancelOrder() {
173175
cancelOrder(orderId);
174176

175177
verifyOrderCancelled(orderId);
178+
179+
verifyOrderHistoryUpdated(orderId, consumerId, OrderState.CANCELLED.name());
180+
176181
}
177182

178183
private void verifyOrderCancelled(int orderId) {
@@ -291,7 +296,7 @@ private void verifyOrderAuthorized(int orderId) {
291296
}
292297

293298

294-
private void verifyOrderHistoryUpdated(int orderId, int consumerId) {
299+
private void verifyOrderHistoryUpdated(int orderId, int consumerId, String expectedState) {
295300
Eventually.eventually(String.format("verifyOrderHistoryUpdated %s", orderId), () -> {
296301
String state = given().
297302
when().
@@ -301,7 +306,7 @@ private void verifyOrderHistoryUpdated(int orderId, int consumerId) {
301306
.body("orders[0].restaurantName", equalTo(RESTAURANT_NAME))
302307
.extract().
303308
path("orders[0].status"); // TODO state?
304-
assertNotNull(state);
309+
assertEquals(expectedState, state);
305310
});
306311
}
307312

ftgo-order-history-service/src/main/java/net/chrisrichardson/ftgo/cqrs/orderhistory/OrderHistoryDao.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import net.chrisrichardson.ftgo.cqrs.orderhistory.dynamodb.SourceEvent;
55
import net.chrisrichardson.ftgo.cqrs.orderhistory.dynamodb.Order;
6+
import net.chrisrichardson.ftgo.orderservice.api.events.OrderState;
67

78
import java.util.Optional;
89

@@ -12,7 +13,7 @@ public interface OrderHistoryDao {
1213

1314
OrderHistory findOrderHistory(String consumerId, OrderHistoryFilter filter);
1415

15-
public boolean cancelOrder(String orderId, Optional<SourceEvent> eventSource);
16+
boolean updateOrderState(String orderId, OrderState newState, Optional<SourceEvent> eventSource);
1617

1718
void noteTicketPreparationStarted(String orderId);
1819

@@ -25,4 +26,5 @@ public interface OrderHistoryDao {
2526
void noteDelivered(String orderId);
2627

2728
Optional<Order> findOrder(String orderId);
29+
2830
}

ftgo-order-history-service/src/main/java/net/chrisrichardson/ftgo/cqrs/orderhistory/dynamodb/OrderHistoryDaoDynamoDb.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -343,15 +343,13 @@ private String keywordFilterExpression(Map<String, Object>
343343
// }
344344

345345
@Override
346-
public boolean cancelOrder(String orderId, Optional<SourceEvent>
347-
eventSource) {
346+
public boolean updateOrderState(String orderId, OrderState newState, Optional<SourceEvent> eventSource) {
348347
UpdateItemSpec spec = new UpdateItemSpec()
349348
.withPrimaryKey("orderId", orderId)
350349
.withUpdateExpression("SET #orderStatus = :orderStatus")
351350
.withNameMap(Collections.singletonMap("#orderStatus",
352351
ORDER_STATUS_FIELD))
353-
.withValueMap(Collections.singletonMap(":orderStatus", OrderState
354-
.CANCELLED.toString()))
352+
.withValueMap(Collections.singletonMap(":orderStatus", newState.toString()))
355353
.withReturnValues(ReturnValue.NONE);
356354
return idempotentUpdate(spec, eventSource);
357355
}
@@ -405,6 +403,7 @@ public Optional<Order> findOrder(String orderId) {
405403
return Optional.ofNullable(item).map(this::toOrder);
406404
}
407405

406+
408407
private Order toOrder(Item avs) {
409408
Order order = new Order(avs.getString("orderId"),
410409
avs.getString("consumerId"),

ftgo-order-history-service/src/main/java/net/chrisrichardson/ftgo/cqrs/orderhistory/messaging/OrderHistoryEventHandlers.java

+22-3
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,12 @@
33
import io.eventuate.tram.events.subscriber.DomainEventEnvelope;
44
import io.eventuate.tram.events.subscriber.DomainEventHandlers;
55
import io.eventuate.tram.events.subscriber.DomainEventHandlersBuilder;
6-
import io.eventuate.tram.messaging.common.Message;
76
import net.chrisrichardson.ftgo.cqrs.orderhistory.DeliveryPickedUp;
87
import net.chrisrichardson.ftgo.cqrs.orderhistory.Location;
98
import net.chrisrichardson.ftgo.cqrs.orderhistory.OrderHistoryDao;
109
import net.chrisrichardson.ftgo.cqrs.orderhistory.dynamodb.Order;
1110
import net.chrisrichardson.ftgo.cqrs.orderhistory.dynamodb.SourceEvent;
12-
import net.chrisrichardson.ftgo.orderservice.api.events.OrderCreatedEvent;
13-
import net.chrisrichardson.ftgo.orderservice.api.events.OrderState;
11+
import net.chrisrichardson.ftgo.orderservice.api.events.*;
1412
import org.slf4j.Logger;
1513
import org.slf4j.LoggerFactory;
1614

@@ -36,6 +34,9 @@ public DomainEventHandlers domainEventHandlers() {
3634
return DomainEventHandlersBuilder
3735
.forAggregateType("net.chrisrichardson.ftgo.orderservice.domain.Order")
3836
.onEvent(OrderCreatedEvent.class, this::handleOrderCreated)
37+
.onEvent(OrderAuthorized.class, this::handleOrderAuthorized)
38+
.onEvent(OrderCancelled.class, this::handleOrderCancelled)
39+
.onEvent(OrderRejected.class, this::handleOrderRejected)
3940
// .onEvent(DeliveryPickedUp.class, this::handleDeliveryPickedUp)
4041
.build();
4142
}
@@ -51,6 +52,24 @@ public void handleOrderCreated(DomainEventEnvelope<OrderCreatedEvent> dee) {
5152
logger.debug("handleOrderCreated result {} {}", dee, result);
5253
}
5354

55+
public void handleOrderAuthorized(DomainEventEnvelope<OrderAuthorized> dee) {
56+
logger.debug("handleOrderAuthorized called {}", dee);
57+
boolean result = orderHistoryDao.updateOrderState(dee.getAggregateId(), OrderState.APPROVED, makeSourceEvent(dee));
58+
logger.debug("handleOrderAuthorized result {} {}", dee, result);
59+
}
60+
61+
public void handleOrderCancelled(DomainEventEnvelope<OrderCancelled> dee) {
62+
logger.debug("handleOrderAuthorized called {}", dee);
63+
boolean result = orderHistoryDao.updateOrderState(dee.getAggregateId(), OrderState.CANCELLED, makeSourceEvent(dee));
64+
logger.debug("handleOrderAuthorized result {} {}", dee, result);
65+
}
66+
67+
public void handleOrderRejected(DomainEventEnvelope<OrderRejected> dee) {
68+
logger.debug("handleOrderAuthorized called {}", dee);
69+
boolean result = orderHistoryDao.updateOrderState(dee.getAggregateId(), OrderState.REJECTED, makeSourceEvent(dee));
70+
logger.debug("handleOrderAuthorized result {} {}", dee, result);
71+
}
72+
5473
private Order makeOrder(String orderId, OrderCreatedEvent event) {
5574
return new Order(orderId,
5675
Long.toString(event.getOrderDetails().getConsumerId()),

ftgo-order-history-service/src/test/java/net/chrisrichardson/ftgo/cqrs/orderhistory/dynamodb/OrderHistoryDaoDynamoDbTest.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public void shouldFindOrder() {
7575

7676
@Test
7777
public void shouldIgnoreDuplicateAdd() {
78-
dao.cancelOrder(orderId, Optional.empty());
78+
dao.updateOrderState(orderId, OrderState.CANCELLED, Optional.empty());
7979
assertFalse(dao.addOrder(order1, eventSource));
8080
Optional<Order> order = dao.findOrder(orderId);
8181
assertEquals(OrderState.CANCELLED, order.get().getStatus());
@@ -111,15 +111,15 @@ public void shouldFindOrdersWithStatus() throws InterruptedException {
111111

112112
@Test
113113
public void shouldCancel() throws InterruptedException {
114-
dao.cancelOrder(orderId, Optional.of(new SourceEvent("a", "b", "c")));
114+
dao.updateOrderState(orderId, OrderState.CANCELLED, Optional.of(new SourceEvent("a", "b", "c")));
115115
Order order = dao.findOrder(orderId).get();
116116
assertEquals(OrderState.CANCELLED, order.getStatus());
117117
}
118118

119119
@Test
120120
public void shouldHandleCancel() throws InterruptedException {
121-
assertTrue(dao.cancelOrder(orderId, Optional.of(new SourceEvent("a", "b", "c"))));
122-
assertFalse(dao.cancelOrder(orderId, Optional.of(new SourceEvent("a", "b", "c"))));
121+
assertTrue(dao.updateOrderState(orderId, OrderState.CANCELLED, Optional.of(new SourceEvent("a", "b", "c"))));
122+
assertFalse(dao.updateOrderState(orderId, OrderState.CANCELLED, Optional.of(new SourceEvent("a", "b", "c"))));
123123
}
124124

125125
@Test

ftgo-order-service/src/main/java/net/chrisrichardson/ftgo/orderservice/domain/OrderAuthorized.java renamed to ftgo-order-service-api/src/main/java/net/chrisrichardson/ftgo/orderservice/api/events/OrderAuthorized.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
package net.chrisrichardson.ftgo.orderservice.domain;
1+
package net.chrisrichardson.ftgo.orderservice.api.events;
22

3-
import io.eventuate.tram.events.common.DomainEvent;
4-
import net.chrisrichardson.ftgo.orderservice.api.events.OrderDomainEvent;
53
import org.apache.commons.lang.builder.EqualsBuilder;
64
import org.apache.commons.lang.builder.HashCodeBuilder;
75

ftgo-order-service/src/main/java/net/chrisrichardson/ftgo/orderservice/domain/OrderCancelled.java renamed to ftgo-order-service-api/src/main/java/net/chrisrichardson/ftgo/orderservice/api/events/OrderCancelled.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.chrisrichardson.ftgo.orderservice.domain;
1+
package net.chrisrichardson.ftgo.orderservice.api.events;
22

33
import io.eventuate.tram.events.common.DomainEvent;
44
import net.chrisrichardson.ftgo.orderservice.api.events.OrderDomainEvent;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package net.chrisrichardson.ftgo.orderservice.api.events;
2+
3+
public class OrderRejected implements OrderDomainEvent {
4+
}

ftgo-order-service/src/component-test/java/net/chrisrichardson/ftgo/orderservice/cucumber/OrderServiceComponentTestStepDefinitions.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
4040
import org.springframework.test.context.ContextConfiguration;
4141

42+
import java.util.Arrays;
4243
import java.util.Collections;
4344

4445
import static io.eventuate.tram.commands.consumer.CommandHandlerReplyBuilder.withSuccess;
@@ -200,7 +201,18 @@ public void theOrderShouldBeInState(String desiredOrderState) {
200201
@And("an (.*) event should be published")
201202
public void verifyEventPublished(String expectedEventClass) {
202203
messageTracker.assertDomainEventPublished("net.chrisrichardson.ftgo.orderservice.domain.Order",
203-
"net.chrisrichardson.ftgo.orderservice.domain." + expectedEventClass);
204+
findEventClass(expectedEventClass, "net.chrisrichardson.ftgo.orderservice.domain", "net.chrisrichardson.ftgo.orderservice.api.events"));
205+
}
206+
207+
private String findEventClass(String expectedEventClass, String... packages) {
208+
return Arrays.stream(packages).map(p -> p + "." + expectedEventClass).filter(className -> {
209+
try {
210+
Class.forName(className);
211+
return true;
212+
} catch (ClassNotFoundException e) {
213+
return false;
214+
}
215+
}).findFirst().orElseThrow(() -> new RuntimeException(String.format("Cannot find class %s in packages %s", expectedEventClass, String.join(",", packages))));
204216
}
205217

206218
}

ftgo-order-service/src/main/java/net/chrisrichardson/ftgo/orderservice/domain/OrderRejected.java

-7
This file was deleted.

ftgo-order-service/src/test/java/net/chrisrichardson/ftgo/orderservice/domain/OrderTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.eventuate.tram.events.aggregates.ResultWithDomainEvents;
44
import net.chrisrichardson.ftgo.orderservice.RestaurantMother;
5+
import net.chrisrichardson.ftgo.orderservice.api.events.OrderAuthorized;
56
import net.chrisrichardson.ftgo.orderservice.api.events.OrderCreatedEvent;
67
import net.chrisrichardson.ftgo.orderservice.api.events.OrderDomainEvent;
78
import net.chrisrichardson.ftgo.orderservice.api.events.OrderState;
@@ -14,7 +15,6 @@
1415

1516
import static java.util.Collections.singletonList;
1617
import static net.chrisrichardson.ftgo.orderservice.OrderDetailsMother.*;
17-
import static net.chrisrichardson.ftgo.orderservice.RestaurantMother.AJANTA_ID;
1818
import static net.chrisrichardson.ftgo.orderservice.RestaurantMother.AJANTA_RESTAURANT;
1919
import static net.chrisrichardson.ftgo.orderservice.RestaurantMother.CHICKEN_VINDALOO_PRICE;
2020
import static org.junit.Assert.assertEquals;

0 commit comments

Comments
 (0)