diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/RequestMappingHoverProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/RequestMappingHoverProvider.java index 2e763c506..652375180 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/RequestMappingHoverProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/RequestMappingHoverProvider.java @@ -153,14 +153,22 @@ public class RequestMappingHoverProvider implements HoverProvider { String port = mappingMethod.getT2().getPort(); String host = mappingMethod.getT2().getHost(); - List renderableUrls = Arrays.stream(mappingMethod.getT1().getSplitPath()).flatMap(path -> { + String[] paths = mappingMethod.getT1().getSplitPath(); + if (paths==null || paths.length==0) { + //Technically, this means the path 'predicate' is unconstrained, meaning any path matches. + //So this is not quite the same as the case where path=""... but... + //It is better for us to show one link where any path is allowed, versus showing no links where any link is allowed. + //So we'll pretend this is the same as path="" as that gives a working link. + paths = new String[] {""}; + } + List renderableUrls = Arrays.stream(paths).flatMap(path -> { String url = UrlUtil.createUrl(host, port, path); return Stream.of(Renderables.link(url, url), Renderables.lineBreak()); }) .collect(Collectors.toList()); - // Remove the last line break - renderableUrls.remove(renderableUrls.size() - 1); + //The renderableUrls can not be empty because, above, we made sure there's at least one path. + renderableUrls.remove(renderableUrls.size() - 1); hoverContent.add(Either.forLeft(Renderables.concat(renderableUrls).toMarkdown())); hoverContent.add(Either.forLeft(LiveHoverUtils.niceAppName(app))); diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingLiveHoverTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingLiveHoverTest.java index c9e5c9d41..2718d7251 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingLiveHoverTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingLiveHoverTest.java @@ -15,6 +15,7 @@ import static org.junit.Assert.assertTrue; import java.io.File; import java.time.Duration; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerComponents; @@ -23,9 +24,12 @@ import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.languageserver.testharness.Editor; import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; import org.springframework.ide.vscode.project.harness.BootJavaLanguageServerHarness; +import org.springframework.ide.vscode.project.harness.MockRequestMapping; import org.springframework.ide.vscode.project.harness.MockRunningAppProvider; import org.springframework.ide.vscode.project.harness.ProjectsHarness; +import com.google.common.collect.ImmutableList; + public class RequestMappingLiveHoverTest { private LanguageServerHarness> harness; @@ -58,7 +62,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"/webjars/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**/favicon.ico\":{\"bean\":\"faviconHandlerMapping\"},\"{[/hello-world],methods=[GET]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public example.Greeting example.HelloWorldController.sayHello(java.lang.String)\"},\"{[/goodbye]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.goodbye()\"},\"{[/hello]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.hello()\"},\"{[/error]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.http.ResponseEntity> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)\"},\"{[/error],produces=[text/html]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)\"}}") .build(); @@ -72,6 +76,60 @@ public class RequestMappingLiveHoverTest { } + + @Test + public void testLiveHoverHintNoPaths() throws Exception { + File directory = new File( + ProjectsHarness.class.getResource("/test-projects/test-request-mapping-live-hover/").toURI()); + String docUri = directory.toPath().resolve("src/main/java/example/HelloWorldController.java").toUri() + .toString(); + + mockAppProvider.builder() + .isSpringBootApp(true) + .port("1111") + .processId("22022") + .host("cfapps.io") + .processName("test-request-mapping-live-hover") + .requestMappings(ImmutableList.of( + new MockRequestMapping() + .className("example.HelloWorldController") + .methodName("sayHello") + .methodParams("java.lang.String") + .paths() + )) + .build(); + + harness.intialize(directory); + + Editor editor = harness.newEditorFromFileUri(docUri, LanguageId.JAVA); + editor.assertHighlights("@RequestMapping(method=RequestMethod.GET)"); + editor.assertHoverContains("@RequestMapping(method=RequestMethod.GET)", "[http://cfapps.io:1111/](http://cfapps.io:1111/)\n" + + "\n" + + "Process [PID=22022, name=`test-request-mapping-live-hover`]"); + + + /* Sample real data: + { + "handler":"public java.lang.String com.github.kdvolder.helloworldservice.DemoApplication.hello()", + "predicate":"{[/hello]}", + "details":{ + "requestMappingConditions": { + "headers":[], + "methods":[], + "patterns":["/hello"], + "produces":[], + "params":[], + "consumes":[]}, + "handlerMethod": { + "name":"hello", + "className":"com.github.kdvolder.helloworldservice.DemoApplication", + "descriptor":"()Ljava/lang/String;" + } + } + } + */ + } + @Test public void testLiveHoverHintMethod() throws Exception { @@ -90,7 +148,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"/webjars/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**/favicon.ico\":{\"bean\":\"faviconHandlerMapping\"},\"{[/hello-world],methods=[GET]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public example.Greeting example.HelloWorldController.sayHello(java.lang.String)\"},\"{[/goodbye]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.goodbye()\"},\"{[/hello]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.hello()\"},\"{[/error]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.http.ResponseEntity> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)\"},\"{[/error],produces=[text/html]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)\"}}") . build(); @@ -153,7 +211,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"{[/greetings],methods=[DELETE]}\": {\"bean\": \"requestMappingHandlerMapping\", \"method\":\"public void com.example.RestApi.deleteGreetings()\"}}") . build(); @@ -200,7 +258,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"{[/greetings],methods=[DELETE]}\": {\"bean\": \"requestMappingHandlerMapping\", \"method\":\"public void com.example.RestApi.deleteGreetings()\"}}") . build(); @@ -243,7 +301,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"{[/greetings],methods=[PUT]}\": {\"bean\": \"requestMappingHandlerMapping\", \"method\":\"public java.lang.String com.example.RestApi.updateGreetings()\"}}") . build(); @@ -287,7 +345,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"{[/greetings || /hello],methods=[GET]}\": {\"bean\": \"requestMappingHandlerMapping\", \"method\":\"public java.lang.String com.example.RestApi.greetings()\"}}") . build(); @@ -335,7 +393,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"{[/find],methods=[GET]}\": {\"bean\": \"requestMappingHandlerMapping\", \"method\":\"public org.springframework.http.ResponseEntity com.example.RestApi.find(java.lang.String,java.util.Date,java.lang.String)\"}}") . build(); @@ -386,7 +444,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"{[/find],methods=[GET]}\": {\"bean\": \"requestMappingHandlerMapping\", \"method\":\"public java.lang.Object com.example.RestApi.set(java.lang.String,java.util.Map)\"}}") . build(); @@ -437,7 +495,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"{[/find],methods=[GET]}\": {\"bean\": \"requestMappingHandlerMapping\", \"method\":\"public java.lang.Object com.example.RestApi.set(java.lang.String,java.util.Map>)\"}}") . build(); @@ -489,7 +547,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"{[/find],methods=[GET]}\": {\"bean\": \"requestMappingHandlerMapping\", \"method\":\"public java.lang.Object com.example.RestApi.set(java.lang.String,java.util.Map>)\"}}") . build(); @@ -541,7 +599,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"{[/find],methods=[GET]}\": {\"bean\": \"requestMappingHandlerMapping\", \"method\":\"public java.lang.Object com.example.RestApi.set(java.lang.String[])\"}}") . build(); @@ -591,7 +649,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"{[/find],methods=[GET]}\": {\"bean\": \"requestMappingHandlerMapping\", \"method\":\"public java.lang.Object com.example.RestApi.set(java.lang.String[][])\"}}") . build(); @@ -641,7 +699,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"{[/find],methods=[GET]}\": {\"bean\": \"requestMappingHandlerMapping\", \"method\":\"public java.lang.Object com.example.RestApi.set(java.lang.String...)\"}}") . build(); @@ -690,7 +748,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"/webjars/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**/favicon.ico\":{\"bean\":\"faviconHandlerMapping\"},\"{[/hello-world],methods=[GET]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public example.Greeting example.HelloWorldController.sayHello(java.lang.String)\"},\"{[/goodbye]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.goodbye()\"},\"{[/hello]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.hello()\"},\"{[/error]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.http.ResponseEntity> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)\"},\"{[/error],produces=[text/html]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)\"}}") . build(); @@ -702,7 +760,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"/webjars/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**/favicon.ico\":{\"bean\":\"faviconHandlerMapping\"},\"{[/hello-world],methods=[GET]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public example.Greeting example.HelloWorldController.sayHello(java.lang.String)\"},\"{[/goodbye]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.goodbye()\"},\"{[/hello]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.hello()\"},\"{[/error]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.http.ResponseEntity> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)\"},\"{[/error],produces=[text/html]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)\"}}") . build(); @@ -714,7 +772,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"/webjars/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**/favicon.ico\":{\"bean\":\"faviconHandlerMapping\"},\"{[/hello-world],methods=[GET]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public example.Greeting example.HelloWorldController.sayHello(java.lang.String)\"},\"{[/goodbye]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.goodbye()\"},\"{[/hello]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.hello()\"},\"{[/error]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.http.ResponseEntity> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)\"},\"{[/error],produces=[text/html]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)\"}}") . build(); harness.intialize(directory); @@ -756,7 +814,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"/webjars/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**/favicon.ico\":{\"bean\":\"faviconHandlerMapping\"},\"{[/goodbye]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.goodbye()\"},\"{[/delete/{id}],methods=[DELETE]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.removeMe(int)\"},\"{[/hello]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.hello()\"},\"{[/postHello],methods=[POST]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.postMethod(java.lang.String)\"},\"{[/put/{id}],methods=[PUT]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.putMethod(int,java.lang.String)\"},\"{[/person/{name}],methods=[GET]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.getMapping(java.lang.String)\"},\"{[/error]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.http.ResponseEntity> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)\"},\"{[/error],produces=[text/html]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)\"},\"{[/application/status],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}\":{\"bean\":\"webEndpointServletHandlerMapping\",\"method\":\"public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map)\"},\"{[/application/info],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}\":{\"bean\":\"webEndpointServletHandlerMapping\",\"method\":\"public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map)\"},\"{[/application],methods=[GET]}\":{\"bean\":\"webEndpointServletHandlerMapping\",\"method\":\"private java.util.Map> org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping.links(javax.servlet.http.HttpServletRequest)\"}}") .build(); @@ -789,7 +847,7 @@ public class RequestMappingLiveHoverTest { .processName("test-request-mapping-live-hover") // Ugly, but this is real JSON copied from a real live running app. We want the // mock app to return realistic results if possible - .requestMappings( + .requestMappingsJson( "{\"/webjars/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**/favicon.ico\":{\"bean\":\"faviconHandlerMapping\"},\"{[/hello-world],methods=[GET]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public example.Greeting example.HelloWorldController.sayHello(java.lang.String)\"},\"{[/inner-inner-class]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.InnerClassController$InnerController$InnerInnerController.saySomethingSuperInnerClass()\"},\"{[/inner-class]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.InnerClassController$InnerController.saySomething()\"},\"{[/person/{name}],methods=[GET]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.getMapping(java.lang.String)\"},\"{[/delete/{id}],methods=[DELETE]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.removeMe(int)\"},\"{[/goodbye]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.goodbye()\"},\"{[/hello]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.hello()\"},\"{[/postHello],methods=[POST]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.postMethod(java.lang.String)\"},\"{[/put/{id}],methods=[PUT]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.putMethod(int,java.lang.String)\"},\"{[/error]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.http.ResponseEntity> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)\"},\"{[/error],produces=[text/html]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)\"}}") .build(); diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/project/harness/MockRequestMapping.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/project/harness/MockRequestMapping.java new file mode 100644 index 000000000..110ffe6aa --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/project/harness/MockRequestMapping.java @@ -0,0 +1,66 @@ +package org.springframework.ide.vscode.project.harness; + +import java.util.Set; + +import org.springframework.ide.vscode.commons.boot.app.cli.requestmappings.RequestMapping; + +import com.google.common.collect.ImmutableSet; + +public class MockRequestMapping implements RequestMapping { + + private String[] paths = {}; + private String className; + private String methodName; + private String[] methodParams; + private Set requestMethods = ImmutableSet.of(); + + @Override + public String[] getSplitPath() { + return paths; + } + + @Override + public String getFullyQualifiedClassName() { + return className; + } + + @Override + public String getMethodName() { + return methodName; + } + + @Override + public String[] getMethodParameters() { + return methodParams; + } + + @Override + public String getMethodString() { + return null; + } + + @Override + public Set getRequestMethods() { + return requestMethods; + } + + public MockRequestMapping paths(String... paths) { + this.paths = paths; + return this; + } + + public MockRequestMapping className(String className) { + this.className = className; + return this; + } + + public MockRequestMapping methodName(String methodName) { + this.methodName = methodName; + return this; + } + + public MockRequestMapping methodParams(String... params) { + this.methodParams = params; + return this; + } +} diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/project/harness/MockRunningAppProvider.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/project/harness/MockRunningAppProvider.java index 7bd08fdd2..94911616d 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/project/harness/MockRunningAppProvider.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/project/harness/MockRunningAppProvider.java @@ -107,12 +107,17 @@ public class MockRunningAppProvider { return this; } - public MockAppBuilder requestMappings(String mappings) throws Exception { + public MockAppBuilder requestMappingsJson(String mappings) throws Exception { Collection requestMappings = LocalSpringBootApp.parseRequestMappingsJson(mappings, "1.x"); when(app.getRequestMappings()).thenReturn(requestMappings); return this; } + public MockAppBuilder requestMappings(Collection rms) throws Exception { + when(app.getRequestMappings()).thenReturn(rms); + return this; + } + public MockAppBuilder liveConditionalsJson(String rawJson) throws Exception{ when(app.getLiveConditionals()).thenReturn(LocalSpringBootApp.getLiveConditionals(rawJson, processId, processName)); return this;