package com.thoughtworks.go.plugin.access.configrepo;
import com.thoughtworks.go.plugin.access.configrepo.contract.CRParseResult;
import com.thoughtworks.go.plugin.api.request.GoPluginApiRequest;
import com.thoughtworks.go.plugin.api.response.DefaultGoPluginApiResponse;
import com.thoughtworks.go.plugin.infra.PluginManager;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import static com.thoughtworks.go.util.ArrayUtil.asList;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
public class ConfigRepoExtensionTest {
public static final String PLUGIN_ID = "plugin-id";
@Mock
private PluginManager pluginManager;
@Mock
private JsonMessageHandler1_0 jsonMessageHandler;
private ConfigRepoExtension extension;
private String requestBody = "expected-request";
private String responseBody = "expected-response";
private ArgumentCaptor<GoPluginApiRequest> requestArgumentCaptor;
@Before
public void setUp() throws Exception {
initMocks(this);
extension = new ConfigRepoExtension(pluginManager);
extension.getMessageHandlerMap().put("1.0", jsonMessageHandler);
requestArgumentCaptor = ArgumentCaptor.forClass(GoPluginApiRequest.class);
when(pluginManager.resolveExtensionVersion(PLUGIN_ID, asList("1.0"))).thenReturn("1.0");
when(pluginManager.isPluginOfType(ConfigRepoExtension.EXTENSION_NAME, PLUGIN_ID)).thenReturn(true);
when(pluginManager.submitTo(eq(PLUGIN_ID), requestArgumentCaptor.capture())).thenReturn(DefaultGoPluginApiResponse.success(responseBody));
}
@Test
public void shouldTalkToPluginToGetParsedDirectory() throws Exception {
CRParseResult deserializedResponse = new CRParseResult();
when(jsonMessageHandler.responseMessageForParseDirectory(responseBody)).thenReturn(deserializedResponse);
CRParseResult response = extension.parseDirectory(PLUGIN_ID, "dir", null);
assertRequest(requestArgumentCaptor.getValue(), ConfigRepoExtension.EXTENSION_NAME, "1.0", ConfigRepoExtension.REQUEST_PARSE_DIRECTORY, null);
verify(jsonMessageHandler).responseMessageForParseDirectory(responseBody);
assertSame(response, deserializedResponse);
}
private void assertRequest(GoPluginApiRequest goPluginApiRequest, String extensionName, String version, String requestName, String requestBody) {
assertThat(goPluginApiRequest.extension(), is(extensionName));
assertThat(goPluginApiRequest.extensionVersion(), is(version));
assertThat(goPluginApiRequest.requestName(), is(requestName));
assertThat(goPluginApiRequest.requestBody(), is(requestBody));
}
}