package pl.touk.sputnik.connector.saas;
import com.github.tomakehurst.wiremock.junit.WireMockRule;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import pl.touk.sputnik.HttpConnectorEnv;
import pl.touk.sputnik.configuration.Configuration;
import pl.touk.sputnik.configuration.ConfigurationSetup;
import pl.touk.sputnik.connector.FacadeConfigUtil;
import pl.touk.sputnik.review.*;
import java.util.List;
import java.util.Map;
import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static org.assertj.core.api.Assertions.assertThat;
import static pl.touk.sputnik.configuration.Provider.GITHUB;
public class SaasFacadeTest extends HttpConnectorEnv {
private static final Integer SOME_PULL_REQUEST_ID = 12314;
private static final String SOME_REPOSITORY = "repo";
private static final String SOME_PROJECT = "proj";
private static final String SOME_API_KEY = "my_api_key";
private static final Map<String, String> GITHUB_PATCHSET_MAP = ImmutableMap.of(
"cli.pullRequestId", SOME_PULL_REQUEST_ID.toString(),
"cli.apiKey", SOME_API_KEY,
"cli.provider", GITHUB.getName(),
"connector.repository", SOME_REPOSITORY,
"connector.project", SOME_PROJECT
);
private SaasFacade saasFacade;
private Configuration config;
@Rule
public WireMockRule wireMockRule = new WireMockRule(FacadeConfigUtil.HTTP_PORT);
@Before
public void setUp() {
config = new ConfigurationSetup().setUp(FacadeConfigUtil.getHttpConfig("saas"), GITHUB_PATCHSET_MAP);
saasFacade = new SaasFacadeBuilder().build(config);
}
@Test
public void shouldListFiles() throws Exception {
stubGet(urlEqualTo(String.format(
"%s/api/github/%s/%s/pulls/%s/files?key=%s",
FacadeConfigUtil.PATH, SOME_PROJECT, SOME_REPOSITORY, SOME_PULL_REQUEST_ID, SOME_API_KEY)), "/json/saas-files.json");
List<ReviewFile> files = saasFacade.listFiles();
assertThat(files).extracting("reviewFilename").containsOnly("src/main/java/TestFile.java", "src/main/java/TestFile2.java");
}
@Test
public void shouldPublishReview() throws Exception {
stubPost(urlEqualTo(String.format(
"%s/api/github/%s/%s/pulls/%s/violations?key=%s",
FacadeConfigUtil.PATH, SOME_PROJECT, SOME_REPOSITORY, SOME_PULL_REQUEST_ID, SOME_API_KEY)), "/json/saas-files.json");
String filename = "src/main/java/Main.java";
Review review = new Review(ImmutableList.of(new ReviewFile(filename)), ReviewFormatterFactory.get(config));
review.addError("checkstyle", new Violation(filename, 1, "error message", Severity.ERROR));
review.getMessages().add("Total 1 violations found");
saasFacade.publish(review);
verify(1, postRequestedFor(urlMatching(String.format("%s/api/github/%s/%s/pulls/%s/violations\\?key=%s",
FacadeConfigUtil.PATH, SOME_PROJECT, SOME_REPOSITORY, SOME_PULL_REQUEST_ID, SOME_API_KEY))));
}
@Test(expected = SaasException.class)
public void shouldThrowOnWrongApiKey() throws Exception {
SaasFacade saasFacade = buildFacade(ImmutableMap.of(
"cli.pullRequestId", SOME_PULL_REQUEST_ID.toString(),
"cli.apiKey", "WRONG_API_KEY",
"cli.provider", GITHUB.getName(),
"connector.repository", SOME_REPOSITORY,
"connector.project", SOME_PROJECT
));
stubGet(urlEqualTo(String.format(
"%s/api/github/%s/%s/pulls/%s/files?key=%s",
FacadeConfigUtil.PATH, SOME_PROJECT, SOME_REPOSITORY, SOME_PULL_REQUEST_ID, "WRONG_API_KEY")),
aResponse().withStatus(403));
saasFacade.listFiles();
}
@Test
public void shouldHandleEmptyApiKey() throws Exception {
SaasFacade saasFacade = buildFacade(ImmutableMap.of(
"cli.pullRequestId", SOME_PULL_REQUEST_ID.toString(),
"cli.provider", GITHUB.getName(),
"connector.repository", SOME_REPOSITORY,
"connector.project", SOME_PROJECT
));
stubGet(urlEqualTo(String.format(
"%s/api/github/%s/%s/pulls/%s/files",
FacadeConfigUtil.PATH, SOME_PROJECT, SOME_REPOSITORY, SOME_PULL_REQUEST_ID)), "/json/saas-files.json");
List<ReviewFile> files = saasFacade.listFiles();
assertThat(files).extracting("reviewFilename").containsOnly("src/main/java/TestFile.java", "src/main/java/TestFile2.java");
}
@Test
public void shouldSendBuildIdIfProvided() throws Exception {
SaasFacade saasFacade = buildFacade(ImmutableMap.of(
"cli.pullRequestId", SOME_PULL_REQUEST_ID.toString(),
"cli.buildId", "11223344",
"cli.provider", GITHUB.getName(),
"connector.repository", SOME_REPOSITORY,
"connector.project", SOME_PROJECT
));
stubGet(urlEqualTo(String.format(
"%s/api/github/%s/%s/pulls/%s/files?build_id=%s",
FacadeConfigUtil.PATH, SOME_PROJECT, SOME_REPOSITORY, SOME_PULL_REQUEST_ID, "11223344")), "/json/saas-files.json");
List<ReviewFile> files = saasFacade.listFiles();
assertThat(files).extracting("reviewFilename").containsOnly("src/main/java/TestFile.java", "src/main/java/TestFile2.java");
}
protected SaasFacade buildFacade(Map<String, String> configMap) {
Configuration config = new ConfigurationSetup().setUp(FacadeConfigUtil.getHttpConfig("saas"), configMap);
return new SaasFacadeBuilder().build(config);
}
}