diff --git a/empty_test_1765183292551.db b/empty_test_1765183292551.db new file mode 100644 index 0000000..6e84b5e Binary files /dev/null and b/empty_test_1765183292551.db differ diff --git a/src/main/java/auctiora/db/AuctionRepository.java b/src/main/java/auctiora/db/AuctionRepository.java index 178239b..ccf6eec 100644 --- a/src/main/java/auctiora/db/AuctionRepository.java +++ b/src/main/java/auctiora/db/AuctionRepository.java @@ -132,14 +132,7 @@ public class AuctionRepository { .bind("country", countryCode) .map((rs, ctx) -> { var closingStr = rs.getString("closing_time"); - LocalDateTime closingTime = null; - if (closingStr != null && !closingStr.isBlank()) { - try { - closingTime = LocalDateTime.parse(closingStr); - } catch (Exception e) { - log.warn("Invalid closing_time format: {}", closingStr); - } - } + LocalDateTime closingTime = auctiora.ScraperDataAdapter.parseTimestamp(closingStr); return new AuctionInfo( rs.getLong("auction_id"), diff --git a/src/main/resources/META-INF/resources/favicon.ico b/src/main/resources/META-INF/resources/favicon.ico index ace6c9c..6cd4351 100644 Binary files a/src/main/resources/META-INF/resources/favicon.ico and b/src/main/resources/META-INF/resources/favicon.ico differ diff --git a/src/test/java/auctiora/ScraperDataAdapterTest.java b/src/test/java/auctiora/ScraperDataAdapterTest.java index f322031..1dcfabf 100644 --- a/src/test/java/auctiora/ScraperDataAdapterTest.java +++ b/src/test/java/auctiora/ScraperDataAdapterTest.java @@ -6,6 +6,8 @@ import org.junit.jupiter.api.DisplayName; import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDateTime; +import java.time.Instant; +import java.time.ZoneId; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @@ -228,6 +230,24 @@ class ScraperDataAdapterTest { assertEquals("GBP", lot.currency()); } + @Test + @DisplayName("Should parse epoch seconds timestamp") + void testParseEpochSeconds() { + long seconds = 1765994400L; + LocalDateTime expected = LocalDateTime.ofInstant(Instant.ofEpochSecond(seconds), ZoneId.systemDefault()); + LocalDateTime parsed = ScraperDataAdapter.parseTimestamp(String.valueOf(seconds)); + assertEquals(expected, parsed); + } + + @Test + @DisplayName("Should parse epoch milliseconds timestamp") + void testParseEpochMillis() { + long millis = 1765994400000L; + LocalDateTime expected = LocalDateTime.ofInstant(Instant.ofEpochMilli(millis), ZoneId.systemDefault()); + LocalDateTime parsed = ScraperDataAdapter.parseTimestamp(String.valueOf(millis)); + assertEquals(expected, parsed); + } + // Helper methods private ResultSet createLotResultSet(String bidAmount) throws SQLException {