package com.baiyue.common.event; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import java.time.Instant; import java.util.UUID; import static org.assertj.core.api.Assertions.*; class DeliveryAckTest { private EventEnvelope event(String type) { return new EventEnvelope(UUID.randomUUID().toString(), type, 1, Instant.now(), "0", "TEST", "1", 1, null, null, null, null, new ObjectMapper().createObjectNode(), "sha256:" + "a".repeat(64)); } @Test void roundTripsAndAcceptsOnlyTheSentIdentityAndHash() throws Exception { var event = event(EventTypes.WALLET_COMMAND_REQUESTED); var ack = DeliveryAck.of(event, DeliveryAck.Outcome.APPLIED); var mapper = new ObjectMapper(); assertThat(mapper.readValue(mapper.writeValueAsString(ack), DeliveryAck.class)).isEqualTo(ack); assertThatCode(() -> ack.requireMatches(event)).doesNotThrowAnyException(); assertThatThrownBy(() -> ack.requireMatches(event(EventTypes.WALLET_COMMAND_REQUESTED))).isInstanceOf(IllegalArgumentException.class); assertThatThrownBy(() -> new DeliveryAck(event.eventId(), "sha256:" + "b".repeat(64), DeliveryAck.Outcome.APPLIED) .requireMatches(event)).isInstanceOf(IllegalArgumentException.class); assertThatThrownBy(() -> mapper.readValue("{\"eventId\":\"" + event.eventId() + "\",\"payloadHash\":\"" + event.payloadHash() + "\",\"outcome\":\"RECEIVED\"}", DeliveryAck.class)) .isInstanceOf(Exception.class); } @Test void staleCannotAcknowledgeWalletCommandsResultsOrIndependentFees() { for (String type : new String[]{EventTypes.WALLET_COMMAND_REQUESTED, EventTypes.WALLET_COMMAND_COMPLETED, EventTypes.BUSINESS_FEE_SOURCE_CHANGED, EventTypes.OVERSEAS_DELIVERY_COMPLETED, EventTypes.COMPANY_VEHICLE_COST_SUBMITTED}) { var event = event(type); assertThatThrownBy(() -> DeliveryAck.of(event, DeliveryAck.Outcome.STALE).requireMatches(event)) .isInstanceOf(IllegalArgumentException.class); assertThatCode(() -> DeliveryAck.of(event, DeliveryAck.Outcome.DUPLICATE).requireMatches(event)).doesNotThrowAnyException(); } } @Test void mixedLastlegOutboxRoutesWalletToFinanceAndUnloadingToFirstleg() { assertThat(EventDeliveryRoute.forEventType(EventTypes.COMPANY_VEHICLE_COST_SUBMITTED)) .isEqualTo(new EventDeliveryRoute("finance-service", "/internal/finance/v1/vehicle-costs/events", false)); assertThat(EventDeliveryRoute.forEventType(EventTypes.WALLET_COMMAND_REQUESTED)) .isEqualTo(new EventDeliveryRoute("finance-service", "/internal/finance/v1/wallet-command-events", false)); assertThat(EventDeliveryRoute.forEventType(EventTypes.OVERSEAS_CONTAINER_UNLOADED).serviceName()).isEqualTo("firstleg-service"); assertThat(EventDeliveryRoute.forEventType(EventTypes.WALLET_COMMAND_COMPLETED).serviceName()).isEqualTo("lastleg-service"); assertThatThrownBy(() -> EventDeliveryRoute.forEventType("UnknownEvent")).isInstanceOf(IllegalArgumentException.class); assertThatThrownBy(() -> EventDeliveryRoute.forEventType("IamUserStatusChanged")).isInstanceOf(IllegalArgumentException.class); } }