72 lines
3.8 KiB
Java
72 lines
3.8 KiB
Java
package com.baiyue.integration.provider;
|
|||
|
|
|
||
|
|
import com.baiyue.integration.dto.CarrierScheduleDtos.QueryRequest;
|
||
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||
|
|
import org.junit.jupiter.api.Test;
|
||
|
|
|
||
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
||
|
|
import static org.mockito.Mockito.mock;
|
||
|
|
import static org.mockito.Mockito.when;
|
||
|
|
|
||
|
|
class SmlCarrierScheduleProviderAdapterTest {
|
||
|
|
private final ObjectMapper objectMapper = new ObjectMapper();
|
||
|
|
|
||
|
|
@Test
|
||
|
|
void sevenSampleBoundaryUsesActTypeAndLeavesFitmdoUnmapped() throws Exception {
|
||
|
|
String timeline = """
|
||
|
|
{"TRANS_RESULT_KEY":"S","count":9,"events":[
|
||
|
|
{"actCd":"FOTMAD","actTpCd":"A","eventDt":"2026-08-01 15:55"},
|
||
|
|
{"actCd":"FLVMLO","actTpCd":"A","eventDt":"2026-08-04 19:45"},
|
||
|
|
{"actCd":"FLVMDO","actTpCd":"A","eventDt":"2026-08-07 17:00"},
|
||
|
|
{"actCd":"FUVMAD","actTpCd":"E","eventDt":"2026-08-23 14:00"},
|
||
|
|
{"actCd":"FUVMBD","actTpCd":"E","eventDt":"2026-08-23 16:00"},
|
||
|
|
{"actCd":"FUVMUD","actTpCd":"E","eventDt":"2026-08-24 08:00"},
|
||
|
|
{"actCd":"FITMDO","actTpCd":"E","eventDt":"2026-08-25 08:00"},
|
||
|
|
{"actCd":"MITYAD","actTpCd":"E","eventDt":"2026-09-01 08:00"},
|
||
|
|
{"actCd":"MOTYDO","actTpCd":"A","eventDt":"2026-07-28 08:00"}]}
|
||
|
|
""";
|
||
|
|
SmlTrackingClient client = mock(SmlTrackingClient.class);
|
||
|
|
when(client.configured()).thenReturn(true);
|
||
|
|
var response = new SmlTrackingClient.TrackingResponse("SMLBKG", "COP1",
|
||
|
|
objectMapper.readTree(timeline), objectMapper.createObjectNode(), objectMapper.createObjectNode(), timeline);
|
||
|
|
when(client.query(new QueryRequest("SML", "CONTAINER_NO", "SMCU7019890"))).thenReturn(response);
|
||
|
|
|
||
|
|
var result = new SmlCarrierScheduleProviderAdapter(client)
|
||
|
|
.query(new QueryRequest("SML", "CONTAINER_NO", "SMCU7019890"));
|
||
|
|
|
||
|
|
assertThat(result.observations()).hasSize(7);
|
||
|
|
assertThat(result.observations()).filteredOn(value -> value.actualAt() != null)
|
||
|
|
.extracting(value -> value.standardNode())
|
||
|
|
.containsExactlyInAnyOrder("AT_ORIGIN_PORT", "LOADED_ON_VESSEL", "DEPARTED_ORIGIN_PORT");
|
||
|
|
assertThat(result.observations()).filteredOn(value -> value.estimatedAt() != null).hasSize(4);
|
||
|
|
assertThat(result.observations()).extracting(value -> value.observedAt())
|
||
|
|
.containsOnly(result.observations().get(0).observedAt());
|
||
|
|
assertThat(result.observations()).extracting(value -> value.providerNodeCode())
|
||
|
|
.doesNotContain("FITMDO", "MOTYDO");
|
||
|
|
}
|
||
|
|
|
||
|
|
@Test
|
||
|
|
void onlyActualMityadCanBecomeActualEmptyReturn() throws Exception {
|
||
|
|
String timeline = """
|
||
|
|
{"events":[
|
||
|
|
{"actCd":"MITYAD","actTpCd":"E","eventDt":"2026-09-01 08:00"},
|
||
|
|
{"actCd":"MITYAD","actTpCd":"A","eventDt":"2026-09-02 09:00"}]}
|
||
|
|
""";
|
||
|
|
var response = new SmlTrackingClient.TrackingResponse("BKG", "COP", objectMapper.readTree(timeline),
|
||
|
|
objectMapper.createObjectNode(), objectMapper.createObjectNode(), timeline);
|
||
|
|
var values = new SmlCarrierScheduleProviderAdapter(mock(SmlTrackingClient.class))
|
||
|
|
.observations("SMCU7019890", response);
|
||
|
|
assertThat(values).filteredOn(value -> value.actualAt() != null).singleElement()
|
||
|
|
.satisfies(value -> assertThat(value.standardNode()).isEqualTo("EMPTY_RETURNED"));
|
||
|
|
assertThat(values).filteredOn(value -> value.estimatedAt() != null).singleElement();
|
||
|
|
}
|
||
|
|
|
||
|
|
@Test
|
||
|
|
void ambiguousFitmdoAndCargoEmptyReleaseStayUnmapped() {
|
||
|
|
assertThat(SmlCarrierScheduleProviderAdapter.standardNode("FITMDO")).isNull();
|
||
|
|
assertThat(SmlCarrierScheduleProviderAdapter.standardNode("MOTYDO")).isNull();
|
||
|
|
assertThat(SmlCarrierScheduleProviderAdapter.standardNode("FUVMUD"))
|
||
|
|
.isEqualTo("DISCHARGED_FROM_VESSEL");
|
||
|
|
}
|
||
|
|
}
|