From 44027bae2988517a47a5d2264e76d16473edc93b Mon Sep 17 00:00:00 2001 From: Sai Ganesh <44020019+luckyganesh@users.noreply.github.com> Date: Wed, 4 Mar 2020 15:00:16 +0530 Subject: [PATCH 1/2] Add plugin validations. Github Issue: gocd/gocd#7801 --- src/com/tw/go/plugin/task/GoPluginImpl.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/com/tw/go/plugin/task/GoPluginImpl.java b/src/com/tw/go/plugin/task/GoPluginImpl.java index 066ac23..248e351 100644 --- a/src/com/tw/go/plugin/task/GoPluginImpl.java +++ b/src/com/tw/go/plugin/task/GoPluginImpl.java @@ -91,9 +91,25 @@ private GoPluginApiResponse handleConfiguration() { private GoPluginApiResponse handleValidation(GoPluginApiRequest goPluginApiRequest) { Map response = new HashMap(); + Map errors = new HashMap(); + + Map> map = new GsonBuilder().create().fromJson(goPluginApiRequest.requestBody(), Map.class); + String scriptValue = map.get("script").get("value"); + String shellType = map.get("shtype").get("value"); + + putInErrors(errors, scriptValue, "script", "Script can't be empty"); + putInErrors(errors, shellType, "shtype", "Shell type can't be empty"); + + response.put("errors", errors); return renderJSON(SUCCESS_RESPONSE_CODE, response); } + private void putInErrors(Map errors, String value, String name, String errorMsg) { + if (StringUtils.isBlank(value)) { + errors.put(name, errorMsg); + } + } + private GoPluginApiResponse handleView() throws IOException { Map response = new HashMap(); response.put("displayValue", "Script Executor"); From e5705c5c44c968c20b56b15fb34c306a1527deb8 Mon Sep 17 00:00:00 2001 From: Sai Ganesh <44020019+luckyganesh@users.noreply.github.com> Date: Wed, 4 Mar 2020 20:33:40 +0530 Subject: [PATCH 2/2] Add tests for the validations. --- .../tw/go/plugin/task/GoPluginImplTest.java | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/test/com/tw/go/plugin/task/GoPluginImplTest.java b/test/com/tw/go/plugin/task/GoPluginImplTest.java index bce1e35..c1190c7 100644 --- a/test/com/tw/go/plugin/task/GoPluginImplTest.java +++ b/test/com/tw/go/plugin/task/GoPluginImplTest.java @@ -1,7 +1,14 @@ package com.tw.go.plugin.task; +import com.google.gson.GsonBuilder; +import com.thoughtworks.go.plugin.api.exceptions.UnhandledRequestTypeException; +import com.thoughtworks.go.plugin.api.request.GoPluginApiRequest; +import com.thoughtworks.go.plugin.api.response.GoPluginApiResponse; import org.junit.Test; +import java.util.HashMap; +import java.util.Map; + import static org.hamcrest.core.Is.is; import static org.junit.Assert.*; @@ -18,4 +25,94 @@ public void shouldCleanupScript() { assertThat(plugin.cleanupScript("a\rb"), is("a" + lineSeparator + "b")); assertThat(plugin.cleanupScript("a\r\nb"), is("a" + lineSeparator + "b")); } + + private abstract class GoPluginApiRequestMock extends GoPluginApiRequest { + + @Override + public String extension() { + return null; + } + + @Override + public String extensionVersion() { + return null; + } + + @Override + public String requestName() { + return GoPluginImpl.REQUEST_VALIDATION; + } + + @Override + public Map requestParameters() { + return null; + } + + @Override + public Map requestHeaders() { + return null; + } + } + + private Map createResponse(Map errors){ + Map expectedResponse = new HashMap<>(); + expectedResponse.put("errors",errors); + return expectedResponse; + } + + @Test + public void shouldGiveEmptyErrorsWhenScriptAndShellTypeProvided() throws UnhandledRequestTypeException { + GoPluginApiRequest goPluginApiRequest = new GoPluginApiRequestMock() { + @Override + public String requestBody() { + return "{\"shtype\":{\"secure\":false,\"value\":\"bash\",\"required\":false},\"script\":{\"secure\":false,\"value\":\"ls\",\"required\":false}}"; + } + }; + + GoPluginImpl plugin = new GoPluginImpl(); + Map errors = new HashMap<>(); + Map expectedResponse = createResponse(errors); + GoPluginApiResponse actualResponse = plugin.handle(goPluginApiRequest); + + assertEquals(actualResponse.responseCode(),GoPluginImpl.SUCCESS_RESPONSE_CODE); + assertEquals(actualResponse.responseBody(), new GsonBuilder().create().toJson(expectedResponse)); + } + + @Test + public void shouldGiveShellTypeErrorWhenItisNotProvided() throws UnhandledRequestTypeException { + GoPluginApiRequest goPluginApiRequest = new GoPluginApiRequestMock() { + @Override + public String requestBody() { + return "{\"shtype\":{\"secure\":false,\"required\":false},\"script\":{\"secure\":false,\"value\":\"ls\",\"required\":false}}"; + } + }; + + GoPluginImpl plugin = new GoPluginImpl(); + Map errors = new HashMap<>(); + errors.put("shtype","Shell type can't be empty"); + Map expectedResponse = createResponse(errors); + GoPluginApiResponse actualResponse = plugin.handle(goPluginApiRequest); + + assertEquals(actualResponse.responseCode(),GoPluginImpl.SUCCESS_RESPONSE_CODE); + assertEquals(actualResponse.responseBody(), new GsonBuilder().create().toJson(expectedResponse)); + } + + @Test + public void shouldGiveScriptErrorWhenItisNotProvided() throws UnhandledRequestTypeException { + GoPluginApiRequest goPluginApiRequest = new GoPluginApiRequestMock() { + @Override + public String requestBody() { + return "{\"shtype\":{\"secure\":false,\"value\":\"bash\",\"required\":false},\"script\":{\"secure\":false,\"required\":false}}"; + } + }; + GoPluginImpl plugin = new GoPluginImpl(); + + Map errors = new HashMap<>(); + errors.put("script","Script can't be empty"); + Map expectedResponse = createResponse(errors); + GoPluginApiResponse actualResponse = plugin.handle(goPluginApiRequest); + + assertEquals(actualResponse.responseCode(),GoPluginImpl.SUCCESS_RESPONSE_CODE); + assertEquals(actualResponse.responseBody(), new GsonBuilder().create().toJson(expectedResponse)); + } } \ No newline at end of file