diff --git a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/ChannelControllerIT.java b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/ChannelControllerIT.java index a4da9382..d28ff20c 100644 --- a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/ChannelControllerIT.java +++ b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/ChannelControllerIT.java @@ -1,6 +1,7 @@ package de.cotto.lndmanagej.controller; import de.cotto.lndmanagej.metrics.Metrics; +import de.cotto.lndmanagej.model.ChannelIdResolver; import de.cotto.lndmanagej.model.Coins; import de.cotto.lndmanagej.service.BalanceService; import de.cotto.lndmanagej.service.ChannelService; @@ -52,6 +53,10 @@ class ChannelControllerIT { @MockBean private NodeService nodeService; + @MockBean + @SuppressWarnings("unused") + private ChannelIdResolver channelIdResolver; + @MockBean @SuppressWarnings("unused") private Metrics metrics; diff --git a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/LegacyControllerIT.java b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/LegacyControllerIT.java index 8b412ca1..f4d67461 100644 --- a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/LegacyControllerIT.java +++ b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/LegacyControllerIT.java @@ -1,6 +1,7 @@ package de.cotto.lndmanagej.controller; import de.cotto.lndmanagej.metrics.Metrics; +import de.cotto.lndmanagej.model.ChannelIdResolver; import de.cotto.lndmanagej.service.ChannelService; import de.cotto.lndmanagej.service.NodeService; import org.junit.jupiter.api.Test; @@ -22,6 +23,10 @@ class LegacyControllerIT { @Autowired private MockMvc mockMvc; + @MockBean + @SuppressWarnings("unused") + private ChannelIdResolver channelIdResolver; + @MockBean @SuppressWarnings("unused") private NodeService nodeService; diff --git a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java index d7bb5588..a7ae1180 100644 --- a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java +++ b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java @@ -1,6 +1,7 @@ package de.cotto.lndmanagej.controller; import de.cotto.lndmanagej.metrics.Metrics; +import de.cotto.lndmanagej.model.ChannelIdResolver; import de.cotto.lndmanagej.model.Coins; import de.cotto.lndmanagej.model.Node; import de.cotto.lndmanagej.service.BalanceService; @@ -51,6 +52,10 @@ class NodeControllerIT { @MockBean private OnChainCostService onChainCostService; + @MockBean + @SuppressWarnings("unused") + private ChannelIdResolver channelIdResolver; + @MockBean private BalanceService balanceService; diff --git a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/OnChainCostsControllerIT.java b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/OnChainCostsControllerIT.java index e319932d..f296aa35 100644 --- a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/OnChainCostsControllerIT.java +++ b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/OnChainCostsControllerIT.java @@ -1,6 +1,7 @@ package de.cotto.lndmanagej.controller; import de.cotto.lndmanagej.metrics.Metrics; +import de.cotto.lndmanagej.model.ChannelIdResolver; import de.cotto.lndmanagej.model.Coins; import de.cotto.lndmanagej.service.OnChainCostService; import org.junit.jupiter.api.Test; @@ -28,6 +29,10 @@ class OnChainCostsControllerIT { @Autowired private MockMvc mockMvc; + @MockBean + @SuppressWarnings("unused") + private ChannelIdResolver channelIdResolver; + @MockBean private OnChainCostService onChainCostService; diff --git a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/StatusControllerIT.java b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/StatusControllerIT.java index 15605fd5..dbeb5cd9 100644 --- a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/StatusControllerIT.java +++ b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/StatusControllerIT.java @@ -1,6 +1,7 @@ package de.cotto.lndmanagej.controller; import de.cotto.lndmanagej.metrics.Metrics; +import de.cotto.lndmanagej.model.ChannelIdResolver; import de.cotto.lndmanagej.service.ChannelService; import de.cotto.lndmanagej.service.OwnNodeService; import org.junit.jupiter.api.Test; @@ -29,6 +30,10 @@ class StatusControllerIT { @Autowired private MockMvc mockMvc; + @MockBean + @SuppressWarnings("unused") + private ChannelIdResolver channelIdResolver; + @MockBean private ChannelService channelService; diff --git a/web/src/main/java/de/cotto/lndmanagej/controller/ChannelIdConverter.java b/web/src/main/java/de/cotto/lndmanagej/controller/ChannelIdConverter.java index 1ba40705..4478346f 100644 --- a/web/src/main/java/de/cotto/lndmanagej/controller/ChannelIdConverter.java +++ b/web/src/main/java/de/cotto/lndmanagej/controller/ChannelIdConverter.java @@ -1,6 +1,8 @@ package de.cotto.lndmanagej.controller; import de.cotto.lndmanagej.model.ChannelId; +import de.cotto.lndmanagej.model.ChannelIdResolver; +import de.cotto.lndmanagej.model.ChannelPoint; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; @@ -8,17 +10,36 @@ import javax.annotation.Nonnull; @Component public class ChannelIdConverter implements Converter { - public ChannelIdConverter() { - // default constructor + private final ChannelIdResolver channelIdResolver; + + public ChannelIdConverter(ChannelIdResolver channelIdResolver) { + this.channelIdResolver = channelIdResolver; } @Override public ChannelId convert(@Nonnull String source) { try { - long shortChannelId = Long.parseLong(source); - return ChannelId.fromShortChannelId(shortChannelId); + return fromShortChannelId(source); } catch (NumberFormatException numberFormatException) { - return ChannelId.fromCompactForm(source); + return fromCompactFormOrChannelPoint(source); } } + + private ChannelId fromCompactFormOrChannelPoint(String source) { + try { + return ChannelId.fromCompactForm(source); + } catch (IllegalArgumentException e) { + return fromChannelPoint(source); + } + } + + private ChannelId fromChannelPoint(String source) { + return channelIdResolver.resolveFromChannelPoint(ChannelPoint.create(source)) + .orElseThrow(IllegalArgumentException::new); + } + + private ChannelId fromShortChannelId(String source) { + long shortChannelId = Long.parseLong(source); + return ChannelId.fromShortChannelId(shortChannelId); + } } diff --git a/web/src/test/java/de/cotto/lndmanagej/controller/ChannelIdConverterTest.java b/web/src/test/java/de/cotto/lndmanagej/controller/ChannelIdConverterTest.java index 8a4c6477..748c95ed 100644 --- a/web/src/test/java/de/cotto/lndmanagej/controller/ChannelIdConverterTest.java +++ b/web/src/test/java/de/cotto/lndmanagej/controller/ChannelIdConverterTest.java @@ -1,23 +1,53 @@ package de.cotto.lndmanagej.controller; +import de.cotto.lndmanagej.model.ChannelIdResolver; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; import static de.cotto.lndmanagej.model.ChannelIdFixtures.CHANNEL_ID; +import static de.cotto.lndmanagej.model.ChannelPointFixtures.CHANNEL_POINT; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.Mockito.when; +@ExtendWith(MockitoExtension.class) class ChannelIdConverterTest { + @InjectMocks + private ChannelIdConverter channelIdConverter; + + @Mock + private ChannelIdResolver channelIdResolver; + @Test void convert() { - assertThat(new ChannelIdConverter().convert(CHANNEL_ID.toString())).isEqualTo(CHANNEL_ID); + assertThat(channelIdConverter.convert(CHANNEL_ID.toString())).isEqualTo(CHANNEL_ID); } @Test void convert_from_compact_form_with_x() { - assertThat(new ChannelIdConverter().convert("712345x123x1")).isEqualTo(CHANNEL_ID); + assertThat(channelIdConverter.convert("712345x123x1")).isEqualTo(CHANNEL_ID); } @Test void convert_from_compact_form() { - assertThat(new ChannelIdConverter().convert("712345:123:1")).isEqualTo(CHANNEL_ID); + assertThat(channelIdConverter.convert("712345:123:1")).isEqualTo(CHANNEL_ID); + } + + @Test + void convert_from_channel_point() { + when(channelIdResolver.resolveFromChannelPoint(CHANNEL_POINT)).thenReturn(Optional.of(CHANNEL_ID)); + assertThat(channelIdConverter.convert(CHANNEL_POINT.toString())).isEqualTo(CHANNEL_ID); + } + + @Test + void convert_from_channel_point_failure() { + when(channelIdResolver.resolveFromChannelPoint(CHANNEL_POINT)).thenReturn(Optional.empty()); + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> channelIdConverter.convert(CHANNEL_POINT.toString())); } } \ No newline at end of file