package com.baiyue.integration.provider; import com.baiyue.integration.config.IntegrationProperties; import com.baiyue.integration.dto.CarrierScheduleDtos.QueryRequest; import com.fasterxml.jackson.databind.ObjectMapper; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpServer; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.springframework.test.util.ReflectionTestUtils; import java.io.IOException; import java.net.InetSocketAddress; import java.net.URI; import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.concurrent.atomic.AtomicReference; import static org.assertj.core.api.Assertions.assertThat; class MatsonTrackingClientTest { private HttpServer server; @AfterEach void stopServer() { if (server != null) server.stop(0); } @Test void obtainsDynamicTtrAndCookieBeforePostingAjaxForm() throws Exception { AtomicReference postedBody = new AtomicReference<>(); AtomicReference postedCookie = new AtomicReference<>(); AtomicReference requestedWith = new AtomicReference<>(); server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0); server.createContext("/page", exchange -> { exchange.getResponseHeaders().add("Set-Cookie", "matson-session=abc123; Path=/"); respond(exchange, 200, ""); }); server.createContext("/query", exchange -> { postedBody.set(new String(exchange.getRequestBody().readAllBytes(), StandardCharsets.UTF_8)); postedCookie.set(exchange.getRequestHeaders().getFirst("Cookie")); requestedWith.set(exchange.getRequestHeaders().getFirst("X-Requested-With")); respond(exchange, 200, "{\"containerNumber\":\"MATU459895\",\"checkDigit\":\"6\",\"events\":[]}"); }); server.start(); int port = server.getAddress().getPort(); var matson = new IntegrationProperties.CarrierSchedule.Matson(true, URI.create("http://127.0.0.1:" + port + "/page"), URI.create("http://127.0.0.1:" + port + "/query"), Duration.ofSeconds(2), Duration.ofSeconds(2), Duration.ZERO); MatsonTrackingClient client = new MatsonTrackingClient(); ReflectionTestUtils.setField(client, "properties", new IntegrationProperties(null, null, new IntegrationProperties.CarrierSchedule(matson, null, null, null, null))); ReflectionTestUtils.setField(client, "objectMapper", new ObjectMapper()); client.initialize(); var result = client.query(new QueryRequest("MATSON", "CONTAINER_NO", "MATU4598956")); assertThat(result.payload().path("containerNumber").asText()).isEqualTo("MATU459895"); assertThat(postedBody.get()).contains("container_trackingnumber=MATU4598956") .contains("trackingVal=tckconta").contains("ttr=dynamic123"); assertThat(postedCookie.get()).contains("matson-session=abc123"); assertThat(requestedWith.get()).isEqualTo("XMLHttpRequest"); } private static void respond(HttpExchange exchange, int status, String body) throws IOException { byte[] bytes = body.getBytes(StandardCharsets.UTF_8); exchange.sendResponseHeaders(status, bytes.length); exchange.getResponseBody().write(bytes); exchange.close(); } }