From 843820ea9f357220d69f3795f3289ee41eed355c Mon Sep 17 00:00:00 2001 From: Kostya Date: Sun, 23 Aug 2026 14:05:29 +0000 Subject: model: relocate market DTOs out of the flat api package Move AccountDTO/MarketDTO/MarketStateDTO/PurchaseReceiptDTO/TradeRowDTO out of the catch-all api package into model.market (and LedgerDTO into model.ledger), matching the existing model.event convention so DTOs live next to the domain they describe rather than in the interface package. Relocate LedgerMapper from mapper.v2 to infrastructure.adapter to match the module's established package layout, and update all call sites and imports accordingly. Also register the ui-desktop module in the build tooling: add it to MODULES, add openjfx to the shipped runtime libs, and generalize package.sh so each executable module (ui-console, ui-desktop) gets its own Main-Class/Class-Path manifest and run script instead of special-casing ui-console. Fold long Class-Path manifest lines at 72 bytes per the JAR spec, since adding ui-desktop's dependencies pushed the line past the limit. --- .../infrastructure/adapter/LedgerMapperTest.java | 113 +++++++++++++++++++++ .../infrastructure/mapper/v2/LedgerMapperTest.java | 103 ------------------- 2 files changed, 113 insertions(+), 103 deletions(-) create mode 100644 service/src/test/java/market/guess/service/catalog/infrastructure/adapter/LedgerMapperTest.java delete mode 100644 service/src/test/java/market/guess/service/catalog/infrastructure/mapper/v2/LedgerMapperTest.java (limited to 'service/src/test/java') diff --git a/service/src/test/java/market/guess/service/catalog/infrastructure/adapter/LedgerMapperTest.java b/service/src/test/java/market/guess/service/catalog/infrastructure/adapter/LedgerMapperTest.java new file mode 100644 index 0000000..976442c --- /dev/null +++ b/service/src/test/java/market/guess/service/catalog/infrastructure/adapter/LedgerMapperTest.java @@ -0,0 +1,113 @@ +package market.guess.service.catalog.infrastructure.adapter; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.math.BigDecimal; +import java.time.Instant; +import java.util.List; +import market.guess.model.ledger.LedgerDTO; +import market.guess.model.ledger.LedgerEntryDTO; +import market.guess.model.ledger.LedgerType; +import market.guess.service.ledger.Ledger; +import market.guess.service.ledger.LedgerEntry; +import org.junit.Test; +import org.mapstruct.factory.Mappers; + +public class LedgerMapperTest { + + private final LedgerMapper mapper = Mappers.getMapper(LedgerMapper.class); + + @Test + public void nullLedgerMapsToNull() { + assertNull(mapper.ledgerToLedgerDTO(null)); + } + + @Test + public void mapsOwnerAndBalanceAsStrings() { + Ledger ledger = new Ledger("alice", new BigDecimal("100")); + + LedgerDTO dto = mapper.ledgerToLedgerDTO(ledger); + + assertEquals("alice", dto.owner()); + assertEquals("100.00", dto.balance()); + } + + @Test + public void emptyEntriesMapToEmptyList() { + Ledger ledger = new Ledger("alice", new BigDecimal("0")); + + LedgerDTO dto = mapper.ledgerToLedgerDTO(ledger); + + assertTrue(dto.entries().isEmpty()); + } + + @Test + public void mapsEntryFieldsInOrder() { + Ledger ledger = new Ledger("bob", new BigDecimal("0")); + ledger.record( + new LedgerEntry( + 1, + Instant.parse("2026-01-01T00:00:00Z"), + LedgerType.DEPOSIT, + new BigDecimal("50.00"), + new BigDecimal("50.00"), + "first")); + ledger.record( + new LedgerEntry( + 2, + Instant.parse("2026-01-02T00:00:00Z"), + LedgerType.PURCHASE, + new BigDecimal("-20.00"), + new BigDecimal("30.00"), + "second")); + + List entries = mapper.ledgerToLedgerDTO(ledger).entries(); + + assertEquals(2, entries.size()); + LedgerEntryDTO first = entries.get(0); + assertEquals(LedgerType.DEPOSIT, first.type()); + assertEquals("50.00", first.amount()); + assertEquals("50.00", first.balanceAfter()); + assertEquals("first", first.note()); + LedgerEntryDTO second = entries.get(1); + assertEquals(LedgerType.PURCHASE, second.type()); + assertEquals("-20.00", second.amount()); + assertEquals("30.00", second.balanceAfter()); + assertEquals("second", second.note()); + } + + @Test + public void nullAmountAndBalanceAfterMapToNullStrings() { + Ledger ledger = new Ledger("carol", new BigDecimal("0")); + ledger.record(new LedgerEntry(1, Instant.now(), LedgerType.REFUND, null, null, null)); + + LedgerEntryDTO entry = mapper.ledgerToLedgerDTO(ledger).entries().get(0); + + assertNull(entry.amount()); + assertNull(entry.balanceAfter()); + } + + /** + * LedgerEntry.id/time and Ledger's account-blocked state have no matching AccountDTO/ + * LedgerEntryDTO source property, so MapStruct leaves them at their Java defaults. This pins that + * known gap; once the mapper is taught to fill seq/at/blocked, update these assertions instead of + * deleting them. + */ + @Test + public void unmappedTargetPropertiesFallBackToDefaults() { + Ledger ledger = new Ledger("dave", new BigDecimal("0")); + ledger.record( + new LedgerEntry( + 7, Instant.now(), LedgerType.COMMISSION, BigDecimal.ONE, BigDecimal.ONE, "n")); + + LedgerDTO dto = mapper.ledgerToLedgerDTO(ledger); + + assertFalse(dto.blocked()); + LedgerEntryDTO entry = dto.entries().get(0); + assertEquals(0L, entry.seq()); + assertNull(entry.at()); + } +} diff --git a/service/src/test/java/market/guess/service/catalog/infrastructure/mapper/v2/LedgerMapperTest.java b/service/src/test/java/market/guess/service/catalog/infrastructure/mapper/v2/LedgerMapperTest.java deleted file mode 100644 index 9e00411..0000000 --- a/service/src/test/java/market/guess/service/catalog/infrastructure/mapper/v2/LedgerMapperTest.java +++ /dev/null @@ -1,103 +0,0 @@ -package market.guess.service.catalog.infrastructure.mapper.v2; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.math.BigDecimal; -import java.time.Instant; -import java.util.List; -import market.guess.api.AccountDTO; -import market.guess.model.ledger.LedgerEntryDTO; -import market.guess.model.ledger.LedgerType; -import market.guess.service.ledger.Ledger; -import market.guess.service.ledger.LedgerEntry; -import org.junit.Test; -import org.mapstruct.factory.Mappers; - -public class LedgerMapperTest { - - private final LedgerMapper mapper = Mappers.getMapper(LedgerMapper.class); - - @Test - public void nullLedgerMapsToNull() { - assertNull(mapper.ledgerToLedgerDTO(null)); - } - - @Test - public void mapsOwnerAndBalanceAsStrings() { - Ledger ledger = new Ledger("alice", new BigDecimal("100")); - - AccountDTO dto = mapper.ledgerToLedgerDTO(ledger); - - assertEquals("alice", dto.owner()); - assertEquals("100.00", dto.balance()); - } - - @Test - public void emptyEntriesMapToEmptyList() { - Ledger ledger = new Ledger("alice", new BigDecimal("0")); - - AccountDTO dto = mapper.ledgerToLedgerDTO(ledger); - - assertTrue(dto.entries().isEmpty()); - } - - @Test - public void mapsEntryFieldsInOrder() { - Ledger ledger = new Ledger("bob", new BigDecimal("0")); - ledger.record( - new LedgerEntry( - 1, Instant.parse("2026-01-01T00:00:00Z"), LedgerType.DEPOSIT, - new BigDecimal("50.00"), new BigDecimal("50.00"), "first")); - ledger.record( - new LedgerEntry( - 2, Instant.parse("2026-01-02T00:00:00Z"), LedgerType.PURCHASE, - new BigDecimal("-20.00"), new BigDecimal("30.00"), "second")); - - List entries = mapper.ledgerToLedgerDTO(ledger).entries(); - - assertEquals(2, entries.size()); - LedgerEntryDTO first = entries.get(0); - assertEquals(LedgerType.DEPOSIT, first.type()); - assertEquals("50.00", first.amount()); - assertEquals("50.00", first.balanceAfter()); - assertEquals("first", first.note()); - LedgerEntryDTO second = entries.get(1); - assertEquals(LedgerType.PURCHASE, second.type()); - assertEquals("-20.00", second.amount()); - assertEquals("30.00", second.balanceAfter()); - assertEquals("second", second.note()); - } - - @Test - public void nullAmountAndBalanceAfterMapToNullStrings() { - Ledger ledger = new Ledger("carol", new BigDecimal("0")); - ledger.record(new LedgerEntry(1, Instant.now(), LedgerType.REFUND, null, null, null)); - - LedgerEntryDTO entry = mapper.ledgerToLedgerDTO(ledger).entries().get(0); - - assertNull(entry.amount()); - assertNull(entry.balanceAfter()); - } - - /** - * LedgerEntry.id/time and Ledger's account-blocked state have no matching AccountDTO/ - * LedgerEntryDTO source property, so MapStruct leaves them at their Java defaults. This - * pins that known gap; once the mapper is taught to fill seq/at/blocked, update these - * assertions instead of deleting them. - */ - @Test - public void unmappedTargetPropertiesFallBackToDefaults() { - Ledger ledger = new Ledger("dave", new BigDecimal("0")); - ledger.record(new LedgerEntry(7, Instant.now(), LedgerType.COMMISSION, BigDecimal.ONE, BigDecimal.ONE, "n")); - - AccountDTO dto = mapper.ledgerToLedgerDTO(ledger); - - assertFalse(dto.blocked()); - LedgerEntryDTO entry = dto.entries().get(0); - assertEquals(0L, entry.seq()); - assertNull(entry.at()); - } -} -- cgit v1.2.3