package com.tw.go.plugin;
import com.google.gson.Gson;
import com.thoughtworks.go.plugin.api.GoApplicationAccessor;
import com.thoughtworks.go.plugin.api.request.DefaultGoPluginApiRequest;
import com.thoughtworks.go.plugin.api.request.GoApiRequest;
import com.thoughtworks.go.plugin.api.request.GoPluginApiRequest;
import com.thoughtworks.go.plugin.api.response.DefaultGoApiResponse;
import com.tw.go.plugin.provider.Provider;
import com.tw.go.plugin.provider.github.GitHubProvider;
import com.tw.go.plugin.provider.stash.StashProvider;
import com.tw.go.plugin.setting.PluginConfigurationView;
import com.tw.go.plugin.setting.PluginSettings;
import com.tw.go.plugin.util.JSONUtils;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.tw.go.plugin.BuildStatusNotifierPlugin.PLUGIN_SETTINGS_GET_CONFIGURATION;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.MockitoAnnotations.initMocks;
public class BuildStatusNotifierPluginTest {
@Mock
private GoApplicationAccessor goApplicationAccessor;
@Mock
private Provider provider;
private BuildStatusNotifierPlugin plugin;
@Before
public void setUp() {
initMocks(this);
plugin = new BuildStatusNotifierPlugin();
DefaultGoApiResponse pluginSettingsResponse = new DefaultGoApiResponse(200);
pluginSettingsResponse.setResponseBody(JSONUtils.toJSON(new HashMap<String, String>()));
when(goApplicationAccessor.submit(any(GoApiRequest.class))).thenReturn(pluginSettingsResponse);
when(provider.pluginId()).thenReturn(GitHubProvider.PLUGIN_ID);
when(provider.pollerPluginId()).thenReturn(GitHubProvider.GITHUB_PR_POLLER_PLUGIN_ID);
plugin.initializeGoApplicationAccessor(goApplicationAccessor);
plugin.setProvider(provider);
}
@Test
public void shouldRegisterForStageStatusChange() {
assertThat(plugin.handleNotificationsInterestedIn().responseBody(), is("{\"notifications\":[\"stage-status\"]}"));
}
@Test
public void shouldDelegateUpdateStatusToProviderWithCorrectParameters() throws Exception {
PluginSettings mockSettings = mock(PluginSettings.class);
when(plugin.getPluginSettings()).thenReturn(mockSettings);
String expectedURL = "url";
String expectedUsername = "username";
String expectedRevision = "sha-1";
String expectedPRId = "1";
String pipelineName = "pipeline";
String pipelineCounter = "1";
String stageName = "stage";
String stageCounter = "1";
String expectedPipelineStage = String.format("%s/%s", pipelineName, stageName);
String expectedPipelineInstance = String.format("%s/%s/%s/%s", pipelineName, pipelineCounter, stageName, stageCounter);
String expectedStageResult = "Passed";
Map requestBody = createRequestBodyMap(expectedURL, expectedUsername, expectedRevision, expectedPRId, pipelineName, pipelineCounter, stageName, stageCounter, expectedStageResult);
plugin.handleStageNotification(createGoPluginAPIRequest(requestBody));
verify(provider).updateStatus(eq(expectedURL), any(PluginSettings.class), eq("1"), eq(expectedRevision), eq(expectedPipelineStage), eq(expectedStageResult), eq("http://localhost:8153/go/pipelines/" + expectedPipelineInstance));
}
@Test
public void shouldReturnPluginSettings() throws Exception {
Provider mockProvider = mock(Provider.class);
PluginConfigurationView mockConfigView = mock(PluginConfigurationView.class);
when(mockProvider.configurationView()).thenReturn(mockConfigView);
Map<String, Object> fields = new HashMap<String, Object>();
when(mockConfigView.fields()).thenReturn(fields);
plugin.setProvider(mockProvider);
Map<String, Object> configuration = new Gson().fromJson(
plugin.handle(createRequest(PLUGIN_SETTINGS_GET_CONFIGURATION)
).responseBody(), Map.class);
assertThat(configuration, is(fields));
}
@Test
public void shouldReturnCorrectConfigForStashPlugin() throws Exception {
plugin.setProvider(new StashProvider());
Map<String, Object> configuration = new Gson().fromJson(
plugin.handle(createRequest(PLUGIN_SETTINGS_GET_CONFIGURATION)
).responseBody(), Map.class);
assertThat(configuration.containsKey("server_base_url"), is(true));
assertThat(configuration.containsKey("end_point"), is(true));
assertThat(configuration.containsKey("username"), is(true));
assertThat(configuration.containsKey("password"), is(true));
assertThat(configuration.containsKey("oauth_token"), is(true));
assertThat(configuration.containsKey("review_label"), is(false));
}
private GoPluginApiRequest createRequest(final String name) {
return new GoPluginApiRequest() {
@Override
public String extension() {
return null;
}
@Override
public String extensionVersion() {
return null;
}
@Override
public String requestName() {
return name;
}
@Override
public Map<String, String> requestParameters() {
return null;
}
@Override
public Map<String, String> requestHeaders() {
return null;
}
@Override
public String requestBody() {
return null;
}
};
}
private Map createRequestBodyMap(String url, String username, String revision, String prId, String pipelineName, String pipelineCounter, String stageName, String stageCounter, String stageResult) {
Map materialRevisionMap = new HashMap();
Map materialMap = new HashMap();
materialMap.put("type", "scm");
materialMap.put("plugin-id", "github.pr");
Map configurationMap = new HashMap();
configurationMap.put("url", url);
configurationMap.put("username", username);
materialMap.put("scm-configuration", configurationMap);
materialRevisionMap.put("material", materialMap);
List modifications = new ArrayList();
Map modificationMap = new HashMap();
modificationMap.put("revision", revision);
Map modificationDataMap = new HashMap();
modificationDataMap.put("PR_ID", prId);
modificationMap.put("data", modificationDataMap);
modifications.add(modificationMap);
materialRevisionMap.put("modifications", modifications);
Map pipelineMap = new HashMap();
List buildCause = new ArrayList();
buildCause.add(materialRevisionMap);
pipelineMap.put("build-cause", buildCause);
Map stageMap = new HashMap();
stageMap.put("name", stageName);
stageMap.put("counter", stageCounter);
stageMap.put("result", stageResult);
pipelineMap.put("stage", stageMap);
pipelineMap.put("name", pipelineName);
pipelineMap.put("counter", pipelineCounter);
Map requestBody = new HashMap();
requestBody.put("pipeline", pipelineMap);
return requestBody;
}
private DefaultGoPluginApiRequest createGoPluginAPIRequest(Map requestBody) {
DefaultGoPluginApiRequest request = new DefaultGoPluginApiRequest(BuildStatusNotifierPlugin.EXTENSION_NAME, "1.0", BuildStatusNotifierPlugin.REQUEST_STAGE_STATUS);
request.setRequestBody(JSONUtils.toJSON(requestBody));
return request;
}
}