Skip to content

Commit

Permalink
DT-1345 added checks, removed wireName methods for states.
Browse files Browse the repository at this point in the history
  • Loading branch information
preetamnpr committed Sep 24, 2024
1 parent 7ffc0ff commit 52f507d
Show file tree
Hide file tree
Showing 14 changed files with 322 additions and 157 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -245,25 +245,7 @@ private static LinkedHashMap<String, BookingScenarioListBuilder> createConforman
Collectors.toMap(
Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
}

private BookingScenarioListBuilder thenAllPathsFrom(BookingCancellationState cancellationStatus, BookingState bookingStatus, BookingState amendedBookingStatus) {
return switch (cancellationStatus) {
case CANCELLATION_RECEIVED -> then (
shipper_GetBooking(bookingStatus, amendedBookingStatus, CANCELLATION_RECEIVED).thenEither(
uc14_carrier_bookingCancellationConfirmed().thenAllPathsFrom(CANCELLATION_CONFIRMED,bookingStatus,amendedBookingStatus),
uc14_carrier_bookingCancellationDeclined().thenAllPathsFrom(CANCELLATION_DECLINED,bookingStatus,amendedBookingStatus))
);
case CANCELLATION_CONFIRMED -> then (
shipper_GetBooking(bookingStatus, amendedBookingStatus, CANCELLATION_CONFIRMED).then(
noAction().thenHappyPathFrom(CANCELLED)
));
case CANCELLATION_DECLINED -> then(
shipper_GetBooking(bookingStatus, amendedBookingStatus, CANCELLATION_DECLINED)
);
};
}

private BookingScenarioListBuilder thenAllPathsFrom(BookingState bookingState) {
private BookingScenarioListBuilder thenAllPathsFrom(BookingState bookingState) {
return thenAllPathsFrom(bookingState, null);
}

Expand Down Expand Up @@ -326,7 +308,8 @@ private BookingScenarioListBuilder thenAllPathsFrom(
.thenAllPathsFrom(UPDATE_RECEIVED),
uc4_carrier_rejectBookingRequest().thenAllPathsFrom(REJECTED),
uc5_carrier_confirmBookingRequest().thenAllPathsFrom(CONFIRMED),
uc11_shipper_cancelBooking().thenAllPathsFrom(CANCELLED)));
uc11_shipper_cancelBooking().thenAllPathsFrom(CANCELLED)
));
case START -> thenEither(
uc1_shipper_SubmitBookingRequest().thenAllPathsFrom(RECEIVED));
case PENDING_AMENDMENT -> then(
Expand All @@ -336,17 +319,17 @@ private BookingScenarioListBuilder thenAllPathsFrom(
uc7_shipper_submitBookingAmendment()
.thenAllPathsFrom(AMENDMENT_RECEIVED, PENDING_AMENDMENT),
uc10_carrier_declineBooking().thenHappyPathFrom(DECLINED),
uc11_shipper_cancelBooking().thenHappyPathFrom(CANCELLED)/*,
uc13_shipper_cancelConfirmedBooking().thenAllPathsFrom(CANCELLATION_RECEIVED, PENDING_AMENDMENT,null)*/));
uc11_shipper_cancelBooking().thenHappyPathFrom(CANCELLED),
uc13_shipper_cancelConfirmedBooking().thenAllPathsFrom(CANCELLATION_RECEIVED, PENDING_AMENDMENT,null)));
case AMENDMENT_RECEIVED -> then(
shipper_GetBooking(originalBookingState, AMENDMENT_RECEIVED,null,true)
.thenEither(
uc6_carrier_requestToAmendConfirmedBooking().thenHappyPathFrom(PENDING_AMENDMENT),
uc8a_carrier_approveBookingAmendment().thenAllPathsFrom(AMENDMENT_CONFIRMED, originalBookingState),
uc8a_carrier_approveBookingAmendment().thenAllPathsFrom(AMENDMENT_CONFIRMED, CONFIRMED),
uc8b_carrier_declineBookingAmendment().thenAllPathsFrom(AMENDMENT_DECLINED, originalBookingState),
uc9_shipper_cancelBookingAmendment().thenAllPathsFrom(AMENDMENT_CANCELLED, originalBookingState),
uc10_carrier_declineBooking().thenHappyPathFrom(DECLINED)/*,
uc13_shipper_cancelConfirmedBooking().thenAllPathsFrom(CANCELLATION_RECEIVED, originalBookingState, AMENDMENT_RECEIVED )*/
uc10_carrier_declineBooking().thenHappyPathFrom(DECLINED),
uc13_shipper_cancelConfirmedBooking().thenAllPathsFrom(CANCELLATION_RECEIVED, originalBookingState, AMENDMENT_RECEIVED )
)
);
case AMENDMENT_CONFIRMED -> then(
Expand All @@ -355,8 +338,8 @@ private BookingScenarioListBuilder thenAllPathsFrom(
auc_shipper_sendInvalidBookingAction(CANCEL_BOOKING_AMENDMENT)
.then(shipper_GetBooking(CONFIRMED,bookingState)),
uc5_carrier_confirmBookingRequest().thenHappyPathFrom(CONFIRMED),
uc12_carrier_confirmBookingCompleted().then(shipper_GetBooking(COMPLETED))/*,
uc13_shipper_cancelConfirmedBooking().thenAllPathsFrom(CANCELLATION_RECEIVED, originalBookingState, AMENDMENT_CONFIRMED )*/
uc12_carrier_confirmBookingCompleted().then(shipper_GetBooking(COMPLETED)),
uc13_shipper_cancelConfirmedBooking().thenAllPathsFrom(CANCELLATION_RECEIVED, originalBookingState, AMENDMENT_CONFIRMED )
)
);
case AMENDMENT_CANCELLED, AMENDMENT_DECLINED -> then(
Expand All @@ -365,20 +348,35 @@ private BookingScenarioListBuilder thenAllPathsFrom(
noAction().thenHappyPathFrom(originalBookingState),
uc6_carrier_requestToAmendConfirmedBooking().thenHappyPathFrom(originalBookingState),
auc_shipper_sendInvalidBookingAction(CANCEL_BOOKING_AMENDMENT)
.then(shipper_GetBooking(PENDING_AMENDMENT,bookingState))/*,
uc13_shipper_cancelConfirmedBooking().thenAllPathsFrom(CANCELLATION_RECEIVED, PENDING_AMENDMENT, bookingState )*/
.then(shipper_GetBooking(PENDING_AMENDMENT,bookingState)),
uc13_shipper_cancelConfirmedBooking().thenAllPathsFrom(CANCELLATION_RECEIVED, PENDING_AMENDMENT, bookingState )
):
shipper_GetBooking(CONFIRMED,bookingState).thenEither(
noAction().thenHappyPathFrom(originalBookingState),
uc5_carrier_confirmBookingRequest().thenHappyPathFrom(CONFIRMED),
auc_shipper_sendInvalidBookingAction(CANCEL_BOOKING_AMENDMENT)
.then(shipper_GetBooking(CONFIRMED,bookingState))/*,
uc13_shipper_cancelConfirmedBooking().thenAllPathsFrom(CANCELLATION_RECEIVED, CONFIRMED, bookingState )*/
.then(shipper_GetBooking(CONFIRMED,bookingState)),
uc13_shipper_cancelConfirmedBooking().thenAllPathsFrom(CANCELLATION_RECEIVED, CONFIRMED, bookingState )
)
);
};
}

private BookingScenarioListBuilder thenAllPathsFrom(BookingCancellationState cancellationStatus, BookingState bookingStatus, BookingState amendedBookingStatus) {
return switch (cancellationStatus) {
case CANCELLATION_RECEIVED -> then (
shipper_GetBooking(bookingStatus, amendedBookingStatus, CANCELLATION_RECEIVED).thenEither(
uc14_carrier_bookingCancellationConfirmed().thenAllPathsFrom(CANCELLATION_CONFIRMED,bookingStatus,amendedBookingStatus),
uc14_carrier_bookingCancellationDeclined().thenAllPathsFrom(CANCELLATION_DECLINED,bookingStatus,amendedBookingStatus))
);
case CANCELLATION_CONFIRMED -> then (
shipper_GetBooking(bookingStatus, amendedBookingStatus, CANCELLATION_CONFIRMED));
case CANCELLATION_DECLINED -> then(
shipper_GetBooking(bookingStatus, amendedBookingStatus, CANCELLATION_DECLINED)
);
};
}

private BookingScenarioListBuilder thenHappyPathFrom(BookingState bookingState) {
return thenHappyPathFrom(bookingState, null);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@
import org.dcsa.conformance.core.traffic.HttpMessageType;
import org.dcsa.conformance.standards.booking.checks.CarrierBookingNotificationDataPayloadRequestConformanceCheck;
import org.dcsa.conformance.standards.booking.checks.ScenarioType;
import org.dcsa.conformance.standards.booking.party.BookingRole;
import org.dcsa.conformance.standards.booking.party.BookingState;
import org.dcsa.conformance.standards.booking.party.CarrierScenarioParameters;
import org.dcsa.conformance.standards.booking.party.DynamicScenarioParameters;
import org.dcsa.conformance.standards.booking.party.*;

public abstract class BookingAction extends ConformanceAction {
protected final int expectedStatus;
Expand All @@ -35,7 +32,7 @@ protected BookingAction(
this.expectedStatus = expectedStatus;
this.dspReference =
previousAction == null
? new OverwritingReference<>(null, new DynamicScenarioParameters(ScenarioType.REGULAR, null, null, null, null,null, null))
? new OverwritingReference<>(null, new DynamicScenarioParameters(ScenarioType.REGULAR, null, null, null, null, null, null, null))
: new OverwritingReference<>(previousAction.dspReference, null);
}

Expand Down Expand Up @@ -102,7 +99,19 @@ private static BookingState parseBookingState(String v) {
return null;
}
try {
return BookingState.fromWireName(v);
return BookingState.valueOf(v);
} catch (IllegalArgumentException e) {
// Do not assume conformant payload.
return null;
}
}

private static BookingCancellationState parseBookingCancellationState(String v) {
if (v == null) {
return null;
}
try {
return BookingCancellationState.valueOf(v);
} catch (IllegalArgumentException e) {
// Do not assume conformant payload.
return null;
Expand All @@ -120,12 +129,14 @@ protected void updateDSPFromResponsePayload(ConformanceExchange exchange) {
var newCbrr = responseJsonNode.path("carrierBookingRequestReference").asText(null);
var newBookingStatus = parseBookingState(responseJsonNode.path("bookingStatus").asText(null));
var newAmendedBookingStatus = parseBookingState(responseJsonNode.path("amendedBookingStatus").asText(null));
var newBookingCancellationStatus = parseBookingCancellationState(responseJsonNode.path("bookingCancellationStatus").asText(null));

var updatedDsp = dsp;
updatedDsp = updateIfNotNull(updatedDsp, newCbrr, updatedDsp::withCarrierBookingRequestReference);
updatedDsp = updateIfNotNull(updatedDsp, newCbr, updatedDsp::withCarrierBookingReference);
updatedDsp = updateIfNotNull(updatedDsp, newBookingStatus, updatedDsp::withBookingStatus);
updatedDsp = updateIfNotNull(updatedDsp, newAmendedBookingStatus, updatedDsp::withAmendedBookingStatus);
updatedDsp = updateIfNotNull(updatedDsp, newBookingCancellationStatus, updatedDsp::withBookingCancellationStatus);

updatedDsp = updateDSPFromBookingAction(exchange, updatedDsp);

Expand All @@ -137,11 +148,20 @@ protected void updateDSPFromResponsePayload(ConformanceExchange exchange) {
private String getCbrFromNotificationPayload(JsonNode requestJsonNode) {
return requestJsonNode.path("data").path("carrierBookingReference").asText(null);
}

protected Stream<ActionCheck> getNotificationChecks(
String expectedApiVersion,
JsonSchemaValidator notificationSchemaValidator,
BookingState bookingState,
BookingState amendedBookingState) {
return getNotificationChecks(expectedApiVersion, notificationSchemaValidator, bookingState, amendedBookingState,null);
}
protected Stream<ActionCheck> getNotificationChecks(
String expectedApiVersion,
JsonSchemaValidator notificationSchemaValidator,
BookingState bookingState,
BookingState amendedBookingState) {
BookingState amendedBookingState,
BookingCancellationState bookingCancellationState) {
String titlePrefix = "[Notification]";
var cbr = dspReference.get().carrierBookingReference();
var cbrr = dspReference.get().carrierBookingRequestReference();
Expand All @@ -156,7 +176,7 @@ protected Stream<ActionCheck> getNotificationChecks(
new ResponseStatusCheck(
titlePrefix, BookingRole::isShipper, getMatchedNotificationExchangeUuid(), 204),
new CarrierBookingNotificationDataPayloadRequestConformanceCheck(
getMatchedNotificationExchangeUuid(), bookingState, amendedBookingState),
getMatchedNotificationExchangeUuid(), bookingState, amendedBookingState, bookingCancellationState),
ApiHeaderCheck.createNotificationCheck(
titlePrefix,
BookingRole::isCarrier,
Expand Down Expand Up @@ -201,7 +221,7 @@ protected Stream<ActionCheck> getNotificationChecks(
getMatchedNotificationExchangeUuid(),
HttpMessageType.REQUEST,
JsonPointer.compile("/data/bookingStatus"),
bookingState.wireName()),
bookingState.name()),
amendedBookingState == null
? null
: new JsonAttributeCheck(
Expand All @@ -210,7 +230,16 @@ protected Stream<ActionCheck> getNotificationChecks(
getMatchedNotificationExchangeUuid(),
HttpMessageType.REQUEST,
JsonPointer.compile("/data/amendedBookingStatus"),
amendedBookingState.wireName()))
.filter(Objects::nonNull);
amendedBookingState.name()),
bookingCancellationState == null
? null
: new JsonAttributeCheck(
titlePrefix,
BookingRole::isCarrier,
getMatchedNotificationExchangeUuid(),
HttpMessageType.REQUEST,
JsonPointer.compile("/data/bookingCancellationStatus"),
bookingCancellationState.name()))
.filter(Objects::nonNull);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.dcsa.conformance.core.check.*;
import org.dcsa.conformance.core.traffic.ConformanceExchange;
import org.dcsa.conformance.core.traffic.HttpMessageType;
import org.dcsa.conformance.standards.booking.checks.CarrierBookingRefStatusPayloadResponseConformanceCheck;
import org.dcsa.conformance.standards.booking.party.BookingRole;
import org.dcsa.conformance.standards.booking.party.BookingState;
import org.dcsa.conformance.standards.booking.party.DynamicScenarioParameters;

import java.util.Objects;
import java.util.stream.Stream;

@Getter
Expand Down Expand Up @@ -54,49 +56,62 @@ public ObjectNode asJsonNode() {
return jsonNode;
}

@Override
protected DynamicScenarioParameters updateDSPFromBookingAction(ConformanceExchange exchange, DynamicScenarioParameters dynamicScenarioParameters) {
var body = exchange.getResponse().message().body().getJsonBody();
return dynamicScenarioParameters.withUpdatedBooking(body);
}

@Override
public ConformanceCheck createCheck(String expectedApiVersion) {
return new ConformanceCheck(getActionTitle()) {
@Override
protected Stream<? extends ConformanceCheck> createSubChecks() {
var dsp = getDspSupplier().get();
String cbrr = dsp.carrierBookingRequestReference();
String cbr = dsp.carrierBookingReference();
var expectedBookingStatus = getDspSupplier().get().bookingStatus();
var expectedAmendedBookingStatus = getDspSupplier().get().amendedBookingStatus();
var expectedBookingCancellationStatus = getDspSupplier().get().bookingCancellationStatus();
Stream<ActionCheck> primaryExchangeChecks = Stream.of(
new HttpMethodCheck(BookingRole::isShipper, getMatchedExchangeUuid(), "PATCH"),
new UrlPathCheck(BookingRole::isShipper, getMatchedExchangeUuid(), "/v2/bookings/%s".formatted(cbrr)),
new ResponseStatusCheck(
BookingRole::isCarrier, getMatchedExchangeUuid(), expectedStatus),
new ApiHeaderCheck(
BookingRole::isShipper,
getMatchedExchangeUuid(),
HttpMessageType.REQUEST,
expectedApiVersion),
new ApiHeaderCheck(
BookingRole::isCarrier,
getMatchedExchangeUuid(),
HttpMessageType.RESPONSE,
expectedApiVersion),
new JsonSchemaCheck(
BookingRole::isShipper,
getMatchedExchangeUuid(),
HttpMessageType.REQUEST,
requestSchemaValidator));
new HttpMethodCheck(BookingRole::isShipper, getMatchedExchangeUuid(), "PATCH"),
new UrlPathCheck(BookingRole::isShipper, getMatchedExchangeUuid(), "/v2/bookings/%s".formatted(cbr)),
new ResponseStatusCheck(
BookingRole::isCarrier, getMatchedExchangeUuid(), expectedStatus),
new ApiHeaderCheck(
BookingRole::isShipper,
getMatchedExchangeUuid(),
HttpMessageType.REQUEST,
expectedApiVersion),
new ApiHeaderCheck(
BookingRole::isCarrier,
getMatchedExchangeUuid(),
HttpMessageType.RESPONSE,
expectedApiVersion),
new JsonSchemaCheck(
BookingRole::isShipper,
getMatchedExchangeUuid(),
HttpMessageType.REQUEST,
requestSchemaValidator));
return Stream.concat(
Stream.concat(primaryExchangeChecks,
Stream.of(new CarrierBookingRefStatusPayloadResponseConformanceCheck(
getMatchedExchangeUuid(),
BookingState.CANCELLED
),
Stream.of(
expectedBookingStatus == null ? null: new CarrierBookingRefStatusPayloadResponseConformanceCheck(
getMatchedExchangeUuid(),
expectedBookingStatus,
expectedAmendedBookingStatus,
expectedBookingCancellationStatus
),
new JsonSchemaCheck(
BookingRole::isCarrier,
getMatchedExchangeUuid(),
HttpMessageType.RESPONSE,
responseSchemaValidator))),
getNotificationChecks(
responseSchemaValidator)).filter(Objects::nonNull)),
expectedBookingStatus != null ? getNotificationChecks(
expectedApiVersion,
notificationSchemaValidator,
BookingState.CANCELLED,
null));
expectedBookingStatus,
expectedAmendedBookingStatus,
expectedBookingCancellationStatus): Stream.empty());
}
};
}
Expand Down
Loading

0 comments on commit 52f507d

Please sign in to comment.