88 lines
5.1 KiB
Java
88 lines
5.1 KiB
Java
package com.baiyue.integration.provider;
|
|
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
import static org.mockito.Mockito.mock;
|
|
|
|
class EvergreenCarrierScheduleProviderAdapterTest {
|
|
@Test
|
|
void addingThenRevisingEstimateLeavesActualEventStableAndAuditsWholeHtml() throws Exception {
|
|
var adapter = new EvergreenCarrierScheduleProviderAdapter(mock(EvergreenTrackingClient.class));
|
|
var time = LocalDateTime.of(2026, 8, 21, 12, 0);
|
|
var first = adapter.observations("EGSU9319340", new EvergreenTrackingClient.TrackingResponse(CONTAINER_HTML, "", "0000", CONTAINER_HTML), time);
|
|
String raw = CONTAINER_HTML + BILL_HTML;
|
|
var second = adapter.observations("EGSU9319340", new EvergreenTrackingClient.TrackingResponse(CONTAINER_HTML, BILL_HTML, "0000", raw), time.plusHours(3));
|
|
CarrierResponseAuditAssertions.stableSharedFacts(first, second, CONTAINER_HTML, raw);
|
|
String revised = BILL_HTML.replace("AUG-07", "AUG-08");
|
|
var third = adapter.observations("EGSU9319340", new EvergreenTrackingClient.TrackingResponse(CONTAINER_HTML, revised, "0000", CONTAINER_HTML + revised), time.plusHours(6));
|
|
CarrierResponseAuditAssertions.stableSharedFacts(second, third, raw, CONTAINER_HTML + revised);
|
|
assertThat(first).hasSize(1); assertThat(second).hasSize(2);
|
|
}
|
|
private static final String CONTAINER_HTML = """
|
|
<html><nav>irrelevant navigation</nav><table><tr><td>other</td></tr></table>
|
|
<table class="tracking"><tr>
|
|
<th>Method</th><th>地点</th><th>箱号</th><th>货柜动态</th><th>日期</th><th>柜型</th><th>VGM</th><th>船名航次</th>
|
|
</tr><tr>
|
|
<td>CY</td><td>NINGBO, CHINA (CN)</td><td> EGSU9319340 </td><td>Loaded (FCL) on vessel</td>
|
|
<td>AUG-07-2026</td><td>40HQ</td><td></td><td>EVER LOVELY 1232-067E</td>
|
|
</tr><tr>
|
|
<td>CY</td><td>NINGBO, CHINA (CN)</td><td>EITU1262610</td><td>Loaded (FCL) on vessel</td>
|
|
<td>AUG-06-2026</td><td>40HQ</td><td></td><td>EVER LOVELY 1232-067E</td>
|
|
</tr></table></html>
|
|
""";
|
|
private static final String BILL_HTML = """
|
|
<html><table><tr><td>预计装船日</td><td>AUG-07-2026</td></tr></table></html>
|
|
""";
|
|
|
|
@Test
|
|
void mapsTheExactContainerRowAndPreservesDayPrecisionWithoutUsingObservedAtAsActual() {
|
|
var response = new EvergreenTrackingClient.TrackingResponse(CONTAINER_HTML, BILL_HTML, "0000",
|
|
CONTAINER_HTML + BILL_HTML);
|
|
LocalDateTime queriedAt = LocalDateTime.of(2026, 8, 21, 15, 30);
|
|
|
|
var values = new EvergreenCarrierScheduleProviderAdapter(mock(EvergreenTrackingClient.class))
|
|
.observations("egsu9319340", response, queriedAt);
|
|
|
|
assertThat(values).hasSize(2);
|
|
assertThat(values).extracting(value -> value.observedAt()).containsOnly(queriedAt);
|
|
assertThat(values).filteredOn(value -> value.actualAt() != null).singleElement().satisfies(value -> {
|
|
assertThat(value.standardNode()).isEqualTo("LOADED_ON_VESSEL");
|
|
assertThat(value.actualAt()).isEqualTo(LocalDateTime.of(2026, 8, 7, 0, 0));
|
|
assertThat(value.actualAt()).isNotEqualTo(queriedAt);
|
|
assertThat(value.locationCode()).isEqualTo("CN");
|
|
assertThat(value.locationName()).isEqualTo("NINGBO, CHINA (CN)");
|
|
assertThat(value.sourceReference()).contains("DATE:AUG-07-2026", "PRECISION:DAY", "ZONE:Asia/Shanghai")
|
|
.doesNotContain("000000000000");
|
|
});
|
|
assertThat(values).filteredOn(value -> value.estimatedAt() != null).singleElement()
|
|
.satisfies(value -> assertThat(value.estimatedAt()).isEqualTo(LocalDateTime.of(2026, 8, 7, 0, 0)));
|
|
}
|
|
|
|
@Test
|
|
void secondConfirmedFixtureRowUsesItsOwnDateAndUnknownStatusesStayUnmapped() {
|
|
var response = new EvergreenTrackingClient.TrackingResponse(CONTAINER_HTML, "<html><table></table></html>",
|
|
"0000", CONTAINER_HTML);
|
|
var values = new EvergreenCarrierScheduleProviderAdapter(mock(EvergreenTrackingClient.class))
|
|
.observations("EITU1262610", response, LocalDateTime.of(2026, 8, 21, 15, 30));
|
|
|
|
assertThat(values).singleElement().satisfies(value -> {
|
|
assertThat(value.actualAt()).isEqualTo(LocalDateTime.of(2026, 8, 6, 0, 0));
|
|
assertThat(value.standardNode()).isEqualTo("LOADED_ON_VESSEL");
|
|
});
|
|
assertThat(EvergreenCarrierScheduleProviderAdapter.standardNode("Loaded (FCL) on vessel"))
|
|
.isEqualTo("LOADED_ON_VESSEL");
|
|
assertThat(EvergreenCarrierScheduleProviderAdapter.standardNode("Discharged from vessel")).isNull();
|
|
}
|
|
|
|
@Test
|
|
void missingStableHeaderOrExactContainerRowIsNotParsed() {
|
|
assertThat(EvergreenCarrierScheduleProviderAdapter.trackingRow(
|
|
"<table><tr><th>箱号</th><th>日期</th></tr><tr><td>EGSU9319340</td><td>AUG-07-2026</td></tr></table>",
|
|
"EGSU9319340")).isNull();
|
|
assertThat(EvergreenCarrierScheduleProviderAdapter.trackingRow(CONTAINER_HTML, "OTHER0000000")).isNull();
|
|
}
|
|
}
|