diff --git a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/SelfPaymentsControllerIT.java b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/SelfPaymentsControllerIT.java index 9c2e6442..5c4aa189 100644 --- a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/SelfPaymentsControllerIT.java +++ b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/SelfPaymentsControllerIT.java @@ -24,7 +24,7 @@ import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -@SuppressWarnings("PMD.AvoidDuplicateLiterals") +@SuppressWarnings({"CPD-START", "PMD.AvoidDuplicateLiterals"}) @WebMvcTest(controllers = SelfPaymentsController.class) class SelfPaymentsControllerIT { private static final String CHANNEL_PREFIX = "/api/channel/" + CHANNEL_ID.getShortChannelId() + "/"; @@ -46,7 +46,9 @@ class SelfPaymentsControllerIT { .thenReturn(List.of(SELF_PAYMENT_2, SELF_PAYMENT)); mockMvc.perform(get(CHANNEL_PREFIX + "/self-payments-from-channel/")) .andExpect(jsonPath("$.selfPayments[0].memo", is(SELF_PAYMENT_2.memo()))) - .andExpect(jsonPath("$.selfPayments[1].memo", is(SELF_PAYMENT.memo()))); + .andExpect(jsonPath("$.selfPayments[1].memo", is(SELF_PAYMENT.memo()))) + .andExpect(jsonPath("$.fees", is("20"))) + .andExpect(jsonPath("$.amountPaid", is("4690"))); } @Test @@ -55,7 +57,9 @@ class SelfPaymentsControllerIT { .thenReturn(List.of(SELF_PAYMENT_2, SELF_PAYMENT)); mockMvc.perform(get(NODE_PREFIX + "/self-payments-from-peer/")) .andExpect(jsonPath("$.selfPayments[0].memo", is(SELF_PAYMENT_2.memo()))) - .andExpect(jsonPath("$.selfPayments[1].memo", is(SELF_PAYMENT.memo()))); + .andExpect(jsonPath("$.selfPayments[1].memo", is(SELF_PAYMENT.memo()))) + .andExpect(jsonPath("$.fees", is("20"))) + .andExpect(jsonPath("$.amountPaid", is("4690"))); } @Test @@ -74,7 +78,9 @@ class SelfPaymentsControllerIT { .andExpect(jsonPath("$.selfPayments[1].amountPaid", is(msat(SELF_PAYMENT_2.amountPaid())))) .andExpect(jsonPath("$.selfPayments[1].fees", is(msat(SELF_PAYMENT_2.fees())))) .andExpect(jsonPath("$.selfPayments[1].firstChannel", is(not(empty())))) - .andExpect(jsonPath("$.selfPayments[1].lastChannel", is(CHANNEL_ID.toString()))); + .andExpect(jsonPath("$.selfPayments[1].lastChannel", is(CHANNEL_ID.toString()))) + .andExpect(jsonPath("$.fees", is("20"))) + .andExpect(jsonPath("$.amountPaid", is("4690"))); } @Test @@ -83,7 +89,9 @@ class SelfPaymentsControllerIT { .thenReturn(List.of(SELF_PAYMENT_2, SELF_PAYMENT)); mockMvc.perform(get(NODE_PREFIX + "/self-payments-to-peer/")) .andExpect(jsonPath("$.selfPayments[0].memo", is(SELF_PAYMENT_2.memo()))) - .andExpect(jsonPath("$.selfPayments[1].memo", is(SELF_PAYMENT.memo()))); + .andExpect(jsonPath("$.selfPayments[1].memo", is(SELF_PAYMENT.memo()))) + .andExpect(jsonPath("$.fees", is("20"))) + .andExpect(jsonPath("$.amountPaid", is("4690"))); } private String msat(Coins value) { diff --git a/web/src/main/java/de/cotto/lndmanagej/controller/SelfPaymentsController.java b/web/src/main/java/de/cotto/lndmanagej/controller/SelfPaymentsController.java index b6a1ca34..0f0f5f0c 100644 --- a/web/src/main/java/de/cotto/lndmanagej/controller/SelfPaymentsController.java +++ b/web/src/main/java/de/cotto/lndmanagej/controller/SelfPaymentsController.java @@ -2,7 +2,6 @@ package de.cotto.lndmanagej.controller; import com.codahale.metrics.annotation.Timed; import de.cotto.lndmanagej.controller.dto.ObjectMapperConfiguration; -import de.cotto.lndmanagej.controller.dto.SelfPaymentDto; import de.cotto.lndmanagej.dto.SelfPaymentsDto; import de.cotto.lndmanagej.model.ChannelId; import de.cotto.lndmanagej.model.Pubkey; @@ -26,32 +25,24 @@ public class SelfPaymentsController { @Timed @GetMapping("/channel/{channelId}/self-payments-from-channel") public SelfPaymentsDto getSelfPaymentsFromChannel(@PathVariable ChannelId channelId) { - return new SelfPaymentsDto(selfPaymentsService.getSelfPaymentsFromChannel(channelId).stream() - .map(SelfPaymentDto::createFromModel) - .toList()); + return new SelfPaymentsDto(selfPaymentsService.getSelfPaymentsFromChannel(channelId)); } @Timed @GetMapping("/node/{pubkey}/self-payments-from-peer") public SelfPaymentsDto getSelfPaymentsFromPeer(@PathVariable Pubkey pubkey) { - return new SelfPaymentsDto(selfPaymentsService.getSelfPaymentsFromPeer(pubkey).stream() - .map(SelfPaymentDto::createFromModel) - .toList()); + return new SelfPaymentsDto(selfPaymentsService.getSelfPaymentsFromPeer(pubkey)); } @Timed @GetMapping("/channel/{channelId}/self-payments-to-channel") public SelfPaymentsDto getSelfPaymentsToChannel(@PathVariable ChannelId channelId) { - return new SelfPaymentsDto(selfPaymentsService.getSelfPaymentsToChannel(channelId).stream() - .map(SelfPaymentDto::createFromModel) - .toList()); + return new SelfPaymentsDto(selfPaymentsService.getSelfPaymentsToChannel(channelId)); } @Timed @GetMapping("/node/{pubkey}/self-payments-to-peer") public SelfPaymentsDto getSelfPaymentsToPeer(@PathVariable Pubkey pubkey) { - return new SelfPaymentsDto(selfPaymentsService.getSelfPaymentsToPeer(pubkey).stream() - .map(SelfPaymentDto::createFromModel) - .toList()); + return new SelfPaymentsDto(selfPaymentsService.getSelfPaymentsToPeer(pubkey)); } } diff --git a/web/src/main/java/de/cotto/lndmanagej/dto/SelfPaymentsDto.java b/web/src/main/java/de/cotto/lndmanagej/dto/SelfPaymentsDto.java index cf6b1a27..ead2ee69 100644 --- a/web/src/main/java/de/cotto/lndmanagej/dto/SelfPaymentsDto.java +++ b/web/src/main/java/de/cotto/lndmanagej/dto/SelfPaymentsDto.java @@ -1,8 +1,28 @@ package de.cotto.lndmanagej.dto; import de.cotto.lndmanagej.controller.dto.SelfPaymentDto; +import de.cotto.lndmanagej.model.Coins; +import de.cotto.lndmanagej.model.SelfPayment; import java.util.List; +import java.util.function.Function; -public record SelfPaymentsDto(List selfPayments) { +public record SelfPaymentsDto(List selfPayments, String amountPaid, String fees) { + public SelfPaymentsDto(List selfPayments) { + this( + selfPayments.stream().map(SelfPaymentDto::createFromModel).toList(), + sumToString(selfPayments, SelfPayment::amountPaid), + sumToString(selfPayments, SelfPayment::fees) + ); + } + + private static String sumToString(List selfPayments, Function coinFunction) { + return String.valueOf(sum(selfPayments, coinFunction).milliSatoshis()); + } + + private static Coins sum(List selfPayments, Function coinFunction) { + return selfPayments.stream() + .map(coinFunction) + .reduce(Coins.NONE, Coins::add); + } } diff --git a/web/src/test/java/de/cotto/lndmanagej/dto/SelfPaymentsDtoTest.java b/web/src/test/java/de/cotto/lndmanagej/dto/SelfPaymentsDtoTest.java new file mode 100644 index 00000000..49a2b42d --- /dev/null +++ b/web/src/test/java/de/cotto/lndmanagej/dto/SelfPaymentsDtoTest.java @@ -0,0 +1,31 @@ +package de.cotto.lndmanagej.dto; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static de.cotto.lndmanagej.model.SelfPaymentFixtures.SELF_PAYMENT; +import static de.cotto.lndmanagej.model.SelfPaymentFixtures.SELF_PAYMENT_2; +import static org.assertj.core.api.Assertions.assertThat; + +class SelfPaymentsDtoTest { + @Test + void no_self_payments() { + SelfPaymentsDto empty = new SelfPaymentsDto(List.of()); + assertThat(empty.selfPayments()).isEmpty(); + } + + @Test + void amountPaid() { + SelfPaymentsDto empty = new SelfPaymentsDto(List.of(SELF_PAYMENT, SELF_PAYMENT_2)); + String expected = String.valueOf(SELF_PAYMENT.amountPaid().add(SELF_PAYMENT_2.amountPaid()).milliSatoshis()); + assertThat(empty.amountPaid()).isEqualTo(expected); + } + + @Test + void fees() { + SelfPaymentsDto empty = new SelfPaymentsDto(List.of(SELF_PAYMENT, SELF_PAYMENT_2)); + String expected = String.valueOf(SELF_PAYMENT.fees().add(SELF_PAYMENT_2.fees()).milliSatoshis()); + assertThat(empty.fees()).isEqualTo(expected); + } +} \ No newline at end of file