diff options
Diffstat (limited to 'service/src')
5 files changed, 129 insertions, 6 deletions
diff --git a/service/src/main/java/market/guess/service/LocalGuessMarketContext.java b/service/src/main/java/market/guess/service/LocalGuessMarketContext.java index f04324b..c85dadf 100644 --- a/service/src/main/java/market/guess/service/LocalGuessMarketContext.java +++ b/service/src/main/java/market/guess/service/LocalGuessMarketContext.java | |||
| @@ -3,10 +3,10 @@ package market.guess.service; | |||
| 3 | import java.math.BigDecimal; | 3 | import java.math.BigDecimal; |
| 4 | import java.time.Instant; | 4 | import java.time.Instant; |
| 5 | import market.guess.api.GuessMarketContext; | 5 | import market.guess.api.GuessMarketContext; |
| 6 | import market.guess.api.PurchaseReceiptDTO; | ||
| 7 | import market.guess.api.Result; | 6 | import market.guess.api.Result; |
| 8 | import market.guess.api.TradeRowDTO; | ||
| 9 | import market.guess.model.event.EventDetailDTO; | 7 | import market.guess.model.event.EventDetailDTO; |
| 8 | import market.guess.model.market.PurchaseReceiptDTO; | ||
| 9 | import market.guess.model.market.TradeRowDTO; | ||
| 10 | import market.guess.service.catalog.infrastructure.MarketContext; | 10 | import market.guess.service.catalog.infrastructure.MarketContext; |
| 11 | import market.guess.service.domain.Order; | 11 | import market.guess.service.domain.Order; |
| 12 | import market.guess.service.fulfillment.FulfillmentContext; | 12 | import market.guess.service.fulfillment.FulfillmentContext; |
diff --git a/service/src/main/java/market/guess/service/catalog/infrastructure/adapter/LedgerMapper.java b/service/src/main/java/market/guess/service/catalog/infrastructure/adapter/LedgerMapper.java new file mode 100644 index 0000000..5a46540 --- /dev/null +++ b/service/src/main/java/market/guess/service/catalog/infrastructure/adapter/LedgerMapper.java | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | package market.guess.service.catalog.infrastructure.adapter; | ||
| 2 | |||
| 3 | import market.guess.model.ledger.LedgerDTO; | ||
| 4 | import market.guess.service.ledger.Ledger; | ||
| 5 | import org.mapstruct.Mapper; | ||
| 6 | |||
| 7 | @Mapper | ||
| 8 | public interface LedgerMapper { | ||
| 9 | LedgerDTO ledgerToLedgerDTO(Ledger ledger); | ||
| 10 | } | ||
diff --git a/service/src/main/java/market/guess/service/domain/Event.java b/service/src/main/java/market/guess/service/domain/Event.java index 1e17457..4517a4e 100644 --- a/service/src/main/java/market/guess/service/domain/Event.java +++ b/service/src/main/java/market/guess/service/domain/Event.java | |||
| @@ -4,13 +4,13 @@ import java.math.BigDecimal; | |||
| 4 | import java.time.Instant; | 4 | import java.time.Instant; |
| 5 | import java.util.ArrayList; | 5 | import java.util.ArrayList; |
| 6 | import java.util.List; | 6 | import java.util.List; |
| 7 | import market.guess.api.MarketDTO; | ||
| 8 | import market.guess.api.MarketStateDTO; | ||
| 9 | import market.guess.api.TradeRowDTO; | ||
| 10 | import market.guess.model.event.CommissionTiming; | 7 | import market.guess.model.event.CommissionTiming; |
| 11 | import market.guess.model.event.EventStatus; | 8 | import market.guess.model.event.EventStatus; |
| 12 | import market.guess.model.event.EventSummaryDTO; | 9 | import market.guess.model.event.EventSummaryDTO; |
| 13 | import market.guess.model.ledger.LedgerType; | 10 | import market.guess.model.ledger.LedgerType; |
| 11 | import market.guess.model.market.MarketDTO; | ||
| 12 | import market.guess.model.market.MarketStateDTO; | ||
| 13 | import market.guess.model.market.TradeRowDTO; | ||
| 14 | import market.guess.service.helpers.BigDecimalOptions; | 14 | import market.guess.service.helpers.BigDecimalOptions; |
| 15 | import market.guess.service.helpers.InstantOptions; | 15 | import market.guess.service.helpers.InstantOptions; |
| 16 | import market.guess.service.ledger.Ledger; | 16 | import market.guess.service.ledger.Ledger; |
diff --git a/service/src/main/java/market/guess/service/domain/Market.java b/service/src/main/java/market/guess/service/domain/Market.java index 3ff7e2d..c5960e3 100644 --- a/service/src/main/java/market/guess/service/domain/Market.java +++ b/service/src/main/java/market/guess/service/domain/Market.java | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | package market.guess.service.domain; | 1 | package market.guess.service.domain; |
| 2 | 2 | ||
| 3 | import java.math.BigDecimal; | 3 | import java.math.BigDecimal; |
| 4 | import market.guess.api.MarketDTO; | 4 | import market.guess.model.market.MarketDTO; |
| 5 | 5 | ||
| 6 | public final class Market { | 6 | public final class Market { |
| 7 | private final String key; | 7 | private final String key; |
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 @@ | |||
| 1 | package market.guess.service.catalog.infrastructure.adapter; | ||
| 2 | |||
| 3 | import static org.junit.Assert.assertEquals; | ||
| 4 | import static org.junit.Assert.assertFalse; | ||
| 5 | import static org.junit.Assert.assertNull; | ||
| 6 | import static org.junit.Assert.assertTrue; | ||
| 7 | |||
| 8 | import java.math.BigDecimal; | ||
| 9 | import java.time.Instant; | ||
| 10 | import java.util.List; | ||
| 11 | import market.guess.model.ledger.LedgerDTO; | ||
| 12 | import market.guess.model.ledger.LedgerEntryDTO; | ||
| 13 | import market.guess.model.ledger.LedgerType; | ||
| 14 | import market.guess.service.ledger.Ledger; | ||
| 15 | import market.guess.service.ledger.LedgerEntry; | ||
| 16 | import org.junit.Test; | ||
| 17 | import org.mapstruct.factory.Mappers; | ||
| 18 | |||
| 19 | public class LedgerMapperTest { | ||
| 20 | |||
| 21 | private final LedgerMapper mapper = Mappers.getMapper(LedgerMapper.class); | ||
| 22 | |||
| 23 | @Test | ||
| 24 | public void nullLedgerMapsToNull() { | ||
| 25 | assertNull(mapper.ledgerToLedgerDTO(null)); | ||
| 26 | } | ||
| 27 | |||
| 28 | @Test | ||
| 29 | public void mapsOwnerAndBalanceAsStrings() { | ||
| 30 | Ledger ledger = new Ledger("alice", new BigDecimal("100")); | ||
| 31 | |||
| 32 | LedgerDTO dto = mapper.ledgerToLedgerDTO(ledger); | ||
| 33 | |||
| 34 | assertEquals("alice", dto.owner()); | ||
| 35 | assertEquals("100.00", dto.balance()); | ||
| 36 | } | ||
| 37 | |||
| 38 | @Test | ||
| 39 | public void emptyEntriesMapToEmptyList() { | ||
| 40 | Ledger ledger = new Ledger("alice", new BigDecimal("0")); | ||
| 41 | |||
| 42 | LedgerDTO dto = mapper.ledgerToLedgerDTO(ledger); | ||
| 43 | |||
| 44 | assertTrue(dto.entries().isEmpty()); | ||
| 45 | } | ||
| 46 | |||
| 47 | @Test | ||
| 48 | public void mapsEntryFieldsInOrder() { | ||
| 49 | Ledger ledger = new Ledger("bob", new BigDecimal("0")); | ||
| 50 | ledger.record( | ||
| 51 | new LedgerEntry( | ||
| 52 | 1, | ||
| 53 | Instant.parse("2026-01-01T00:00:00Z"), | ||
| 54 | LedgerType.DEPOSIT, | ||
| 55 | new BigDecimal("50.00"), | ||
| 56 | new BigDecimal("50.00"), | ||
| 57 | "first")); | ||
| 58 | ledger.record( | ||
| 59 | new LedgerEntry( | ||
| 60 | 2, | ||
| 61 | Instant.parse("2026-01-02T00:00:00Z"), | ||
| 62 | LedgerType.PURCHASE, | ||
| 63 | new BigDecimal("-20.00"), | ||
| 64 | new BigDecimal("30.00"), | ||
| 65 | "second")); | ||
| 66 | |||
| 67 | List<LedgerEntryDTO> entries = mapper.ledgerToLedgerDTO(ledger).entries(); | ||
| 68 | |||
| 69 | assertEquals(2, entries.size()); | ||
| 70 | LedgerEntryDTO first = entries.get(0); | ||
| 71 | assertEquals(LedgerType.DEPOSIT, first.type()); | ||
| 72 | assertEquals("50.00", first.amount()); | ||
| 73 | assertEquals("50.00", first.balanceAfter()); | ||
| 74 | assertEquals("first", first.note()); | ||
| 75 | LedgerEntryDTO second = entries.get(1); | ||
| 76 | assertEquals(LedgerType.PURCHASE, second.type()); | ||
| 77 | assertEquals("-20.00", second.amount()); | ||
| 78 | assertEquals("30.00", second.balanceAfter()); | ||
| 79 | assertEquals("second", second.note()); | ||
| 80 | } | ||
| 81 | |||
| 82 | @Test | ||
| 83 | public void nullAmountAndBalanceAfterMapToNullStrings() { | ||
| 84 | Ledger ledger = new Ledger("carol", new BigDecimal("0")); | ||
| 85 | ledger.record(new LedgerEntry(1, Instant.now(), LedgerType.REFUND, null, null, null)); | ||
| 86 | |||
| 87 | LedgerEntryDTO entry = mapper.ledgerToLedgerDTO(ledger).entries().get(0); | ||
| 88 | |||
| 89 | assertNull(entry.amount()); | ||
| 90 | assertNull(entry.balanceAfter()); | ||
| 91 | } | ||
| 92 | |||
| 93 | /** | ||
| 94 | * LedgerEntry.id/time and Ledger's account-blocked state have no matching AccountDTO/ | ||
| 95 | * LedgerEntryDTO source property, so MapStruct leaves them at their Java defaults. This pins that | ||
| 96 | * known gap; once the mapper is taught to fill seq/at/blocked, update these assertions instead of | ||
| 97 | * deleting them. | ||
| 98 | */ | ||
| 99 | @Test | ||
| 100 | public void unmappedTargetPropertiesFallBackToDefaults() { | ||
| 101 | Ledger ledger = new Ledger("dave", new BigDecimal("0")); | ||
| 102 | ledger.record( | ||
| 103 | new LedgerEntry( | ||
| 104 | 7, Instant.now(), LedgerType.COMMISSION, BigDecimal.ONE, BigDecimal.ONE, "n")); | ||
| 105 | |||
| 106 | LedgerDTO dto = mapper.ledgerToLedgerDTO(ledger); | ||
| 107 | |||
| 108 | assertFalse(dto.blocked()); | ||
| 109 | LedgerEntryDTO entry = dto.entries().get(0); | ||
| 110 | assertEquals(0L, entry.seq()); | ||
| 111 | assertNull(entry.at()); | ||
| 112 | } | ||
| 113 | } | ||