diff --git a/application/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java b/application/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java new file mode 100644 index 00000000..47c58d93 --- /dev/null +++ b/application/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java @@ -0,0 +1,47 @@ +package de.cotto.lndmanagej.controller; + +import de.cotto.lndmanagej.metrics.Metrics; +import de.cotto.lndmanagej.service.NodeService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.web.servlet.MockMvc; + +import static de.cotto.lndmanagej.model.NodeFixtures.ALIAS_2; +import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY_2; +import static org.hamcrest.core.Is.is; +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.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; + +@WebMvcTest(controllers = NodeController.class) +class NodeControllerIT { + private static final String NODE_PREFIX = "/api/node/" + PUBKEY_2; + + @Autowired + private MockMvc mockMvc; + + @MockBean + private NodeService nodeService; + + @MockBean + @SuppressWarnings("unused") + private Metrics metrics; + + @Test + void getAlias() throws Exception { + when(nodeService.getAlias(PUBKEY_2)).thenReturn(ALIAS_2); + mockMvc.perform(get(NODE_PREFIX + "/alias")) + .andExpect(content().string(ALIAS_2)); + } + + @Test + void getDetails() throws Exception { + when(nodeService.getAlias(PUBKEY_2)).thenReturn(ALIAS_2); + mockMvc.perform(get(NODE_PREFIX + "/details")) + .andExpect(jsonPath("$.pubkey", is(PUBKEY_2.toString()))) + .andExpect(jsonPath("$.alias", is(ALIAS_2))); + } +} \ No newline at end of file diff --git a/application/src/main/java/de/cotto/lndmanagej/controller/ChannelDetailsController.java b/application/src/main/java/de/cotto/lndmanagej/controller/ChannelDetailsController.java index 3e8c845d..2d57cda8 100644 --- a/application/src/main/java/de/cotto/lndmanagej/controller/ChannelDetailsController.java +++ b/application/src/main/java/de/cotto/lndmanagej/controller/ChannelDetailsController.java @@ -26,8 +26,8 @@ public class ChannelDetailsController { } @GetMapping("/details") - public ChannelDetailsDto getChannelDetails(@PathVariable ChannelId channelId) throws NotFoundException { - metrics.mark(MetricRegistry.name(getClass(), "getChannelDetails")); + public ChannelDetailsDto getDetails(@PathVariable ChannelId channelId) throws NotFoundException { + metrics.mark(MetricRegistry.name(getClass(), "getDetails")); LocalChannel localChannel = channelService.getLocalChannel(channelId).orElse(null); if (localChannel == null) { throw new NotFoundException(); diff --git a/application/src/main/java/de/cotto/lndmanagej/controller/NodeController.java b/application/src/main/java/de/cotto/lndmanagej/controller/NodeController.java new file mode 100644 index 00000000..bb7b56bb --- /dev/null +++ b/application/src/main/java/de/cotto/lndmanagej/controller/NodeController.java @@ -0,0 +1,34 @@ +package de.cotto.lndmanagej.controller; + +import com.codahale.metrics.MetricRegistry; +import de.cotto.lndmanagej.metrics.Metrics; +import de.cotto.lndmanagej.model.Pubkey; +import de.cotto.lndmanagej.service.NodeService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/node/{pubkey}") +public class NodeController { + private final NodeService nodeService; + private final Metrics metrics; + + public NodeController(NodeService nodeService, Metrics metrics) { + this.nodeService = nodeService; + this.metrics = metrics; + } + + @GetMapping("/alias") + public String getAlias(Pubkey pubkey) { + metrics.mark(MetricRegistry.name(getClass(), "getAlias")); + return nodeService.getAlias(pubkey); + } + + @GetMapping("/details") + public NodeDetailsDto getDetails(@PathVariable Pubkey pubkey) { + metrics.mark(MetricRegistry.name(getClass(), "getDetails")); + return new NodeDetailsDto(pubkey, getAlias(pubkey)); + } +} diff --git a/application/src/main/java/de/cotto/lndmanagej/controller/NodeDetailsDto.java b/application/src/main/java/de/cotto/lndmanagej/controller/NodeDetailsDto.java new file mode 100644 index 00000000..b81a8322 --- /dev/null +++ b/application/src/main/java/de/cotto/lndmanagej/controller/NodeDetailsDto.java @@ -0,0 +1,11 @@ +package de.cotto.lndmanagej.controller; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import de.cotto.lndmanagej.model.Pubkey; + +public record NodeDetailsDto( + @JsonSerialize(using = ToStringSerializer.class) Pubkey pubkey, + String alias +) { +} diff --git a/application/src/test/java/de/cotto/lndmanagej/controller/ChannelDetailsControllerTest.java b/application/src/test/java/de/cotto/lndmanagej/controller/ChannelDetailsControllerTest.java index 00003c5a..46ac2b3d 100644 --- a/application/src/test/java/de/cotto/lndmanagej/controller/ChannelDetailsControllerTest.java +++ b/application/src/test/java/de/cotto/lndmanagej/controller/ChannelDetailsControllerTest.java @@ -36,18 +36,18 @@ class ChannelDetailsControllerTest { private Metrics metrics; @Test - void getChannelDetails_channel_not_found() { + void getDetails_channel_not_found() { assertThatExceptionOfType(NotFoundException.class) - .isThrownBy(() -> channelDetailsController.getChannelDetails(CHANNEL_ID)); + .isThrownBy(() -> channelDetailsController.getDetails(CHANNEL_ID)); } @Test - void getChannelDetails() throws NotFoundException { + void getDetails() throws NotFoundException { ChannelDetailsDto expectedDetails = new ChannelDetailsDto(CHANNEL_ID, PUBKEY_2, ALIAS_2); when(nodeService.getAlias(PUBKEY_2)).thenReturn(ALIAS_2); when(channelService.getLocalChannel(CHANNEL_ID)).thenReturn(Optional.of(LOCAL_OPEN_CHANNEL)); - assertThat(channelDetailsController.getChannelDetails(CHANNEL_ID)).isEqualTo(expectedDetails); - verify(metrics).mark(argThat(name -> name.endsWith(".getChannelDetails"))); + assertThat(channelDetailsController.getDetails(CHANNEL_ID)).isEqualTo(expectedDetails); + verify(metrics).mark(argThat(name -> name.endsWith(".getDetails"))); } } \ No newline at end of file diff --git a/application/src/test/java/de/cotto/lndmanagej/controller/NodeControllerTest.java b/application/src/test/java/de/cotto/lndmanagej/controller/NodeControllerTest.java new file mode 100644 index 00000000..a4e4adc7 --- /dev/null +++ b/application/src/test/java/de/cotto/lndmanagej/controller/NodeControllerTest.java @@ -0,0 +1,45 @@ +package de.cotto.lndmanagej.controller; + +import de.cotto.lndmanagej.metrics.Metrics; +import de.cotto.lndmanagej.service.NodeService; +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 static de.cotto.lndmanagej.model.NodeFixtures.ALIAS_2; +import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY_2; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class NodeControllerTest { + @InjectMocks + private NodeController nodeController; + + @Mock + private NodeService nodeService; + + @Mock + private Metrics metrics; + + @Test + void getAlias() { + when(nodeService.getAlias(PUBKEY_2)).thenReturn(ALIAS_2); + + assertThat(nodeController.getAlias(PUBKEY_2)).isEqualTo(ALIAS_2); + verify(metrics).mark(argThat(name -> name.endsWith(".getAlias"))); + } + + @Test + void getNodeDetails() { + NodeDetailsDto expectedDetails = new NodeDetailsDto(PUBKEY_2, ALIAS_2); + when(nodeService.getAlias(PUBKEY_2)).thenReturn(ALIAS_2); + + assertThat(nodeController.getDetails(PUBKEY_2)).isEqualTo(expectedDetails); + verify(metrics).mark(argThat(name -> name.endsWith(".getDetails"))); + } +} \ No newline at end of file