From fbfd2e275e9d645e4ec8a1874bc57d98b1c38300 Mon Sep 17 00:00:00 2001 From: Kostya Date: Thu, 20 Aug 2026 14:39:50 +0000 Subject: Add MapStruct LedgerMapper and wire annotation processing into build.sh build.sh now passes -processorpath/-s so MapStruct's generated impl compiles alongside hand-written sources. --- .../infrastructure/mapper/v2/LedgerMapperTest.java | 103 +++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 service/src/test/java/market/guess/service/catalog/infrastructure/mapper/v2/LedgerMapperTest.java (limited to 'service/src/test') 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 new file mode 100644 index 0000000..9e00411 --- /dev/null +++ b/service/src/test/java/market/guess/service/catalog/infrastructure/mapper/v2/LedgerMapperTest.java @@ -0,0 +1,103 @@ +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