123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526 |
- /*
- * SonarQube
- * Copyright (C) 2009-2021 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
- package org.sonar.alm.client.gitlab;
-
- import java.io.IOException;
- import java.util.Optional;
- import java.util.concurrent.TimeUnit;
- import okhttp3.mockwebserver.MockResponse;
- import okhttp3.mockwebserver.MockWebServer;
- import okhttp3.mockwebserver.RecordedRequest;
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Rule;
- import org.junit.Test;
- import org.sonar.alm.client.ConstantTimeoutConfiguration;
- import org.sonar.alm.client.TimeoutConfiguration;
- import org.sonar.api.utils.log.LogTester;
- import org.sonar.api.utils.log.LoggerLevel;
-
- import static org.assertj.core.api.Assertions.assertThat;
- import static org.assertj.core.api.Assertions.assertThatThrownBy;
- import static org.assertj.core.api.Assertions.tuple;
-
- public class GitlabHttpClientTest {
-
- @Rule
- public LogTester logTester = new LogTester();
-
- private final MockWebServer server = new MockWebServer();
- private GitlabHttpClient underTest;
- private String gitlabUrl;
-
- @Before
- public void prepare() throws IOException {
- server.start();
- String urlWithEndingSlash = server.url("").toString();
- gitlabUrl = urlWithEndingSlash.substring(0, urlWithEndingSlash.length() - 1);
-
- TimeoutConfiguration timeoutConfiguration = new ConstantTimeoutConfiguration(10_000);
- underTest = new GitlabHttpClient(timeoutConfiguration);
- }
-
- @After
- public void stopServer() throws IOException {
- server.shutdown();
- }
-
- @Test
- public void should_throw_IllegalArgumentException_when_token_is_revoked() {
- MockResponse response = new MockResponse()
- .setResponseCode(401)
- .setBody("{\"error\":\"invalid_token\",\"error_description\":\"Token was revoked. You have to re-authorize from the user.\"}");
- server.enqueue(response);
-
- assertThatThrownBy(() -> underTest.searchProjects(gitlabUrl, "pat", "example", 1, 2))
- .isInstanceOf(IllegalArgumentException.class)
- .hasMessage("Your GitLab token was revoked");
- }
-
- @Test
- public void should_throw_IllegalArgumentException_when_token_insufficient_scope() {
- MockResponse response = new MockResponse()
- .setResponseCode(403)
- .setBody("{\"error\":\"insufficient_scope\"," +
- "\"error_description\":\"The request requires higher privileges than provided by the access token.\"," +
- "\"scope\":\"api read_api\"}");
- server.enqueue(response);
-
- assertThatThrownBy(() -> underTest.searchProjects(gitlabUrl, "pat", "example", 1, 2))
- .isInstanceOf(IllegalArgumentException.class)
- .hasMessage("Your GitLab token has insufficient scope");
- }
-
- @Test
- public void should_throw_IllegalArgumentException_when_invalide_json_in_401_response() {
- MockResponse response = new MockResponse()
- .setResponseCode(401)
- .setBody("error in pat");
- server.enqueue(response);
-
- assertThatThrownBy(() -> underTest.searchProjects(gitlabUrl, "pat", "example", 1, 2))
- .isInstanceOf(IllegalArgumentException.class)
- .hasMessage("Invalid personal access token");
- }
-
- @Test
- public void should_throw_IllegalArgumentException_when_redirected() {
- MockResponse response = new MockResponse()
- .setResponseCode(308);
- server.enqueue(response);
-
- assertThatThrownBy(() -> underTest.searchProjects(gitlabUrl, "pat", "example", 1, 2))
- .isInstanceOf(IllegalArgumentException.class)
- .hasMessage("Request was redirected, please provide the correct URL");
- }
-
- @Test
- public void get_project() {
- MockResponse response = new MockResponse()
- .setResponseCode(200)
- .setBody("{\n"
- + " \"id\": 12345,\n"
- + " \"name\": \"SonarQube example 1\",\n"
- + " \"name_with_namespace\": \"SonarSource / SonarQube / SonarQube example 1\",\n"
- + " \"path\": \"sonarqube-example-1\",\n"
- + " \"path_with_namespace\": \"sonarsource/sonarqube/sonarqube-example-1\",\n"
- + " \"web_url\": \"https://example.gitlab.com/sonarsource/sonarqube/sonarqube-example-1\"\n"
- + " }");
- server.enqueue(response);
-
- assertThat(underTest.getProject(gitlabUrl, "pat", 12345L))
- .extracting(Project::getId, Project::getName)
- .containsExactly(12345L, "SonarQube example 1");
- }
-
- @Test
- public void get_project_fail_if_non_json_payload() {
- MockResponse response = new MockResponse()
- .setResponseCode(200)
- .setBody("non json payload");
- server.enqueue(response);
-
- assertThatThrownBy(() -> underTest.getProject(gitlabUrl, "pat", 12345L))
- .isInstanceOf(IllegalArgumentException.class)
- .hasMessage("Could not parse GitLab answer to retrieve a project. Got a non-json payload as result.");
- }
-
- @Test
- public void get_branches() {
- MockResponse response = new MockResponse()
- .setResponseCode(200)
- .setBody("[{\n"
- + " \"name\": \"main\",\n"
- + " \"default\": true\n"
- + "},{\n"
- + " \"name\": \"other\",\n"
- + " \"default\": false\n"
- + "}]");
- server.enqueue(response);
-
- assertThat(underTest.getBranches(gitlabUrl, "pat", 12345L))
- .extracting(GitLabBranch::getName, GitLabBranch::isDefault)
- .containsExactly(
- tuple("main", true),
- tuple("other", false)
- );
- }
-
- @Test
- public void get_branches_fail_if_non_json_payload() {
- MockResponse response = new MockResponse()
- .setResponseCode(200)
- .setBody("non json payload");
- server.enqueue(response);
-
- String instanceUrl = gitlabUrl;
- assertThatThrownBy(() -> underTest.getBranches(instanceUrl, "pat", 12345L))
- .isInstanceOf(IllegalArgumentException.class)
- .hasMessage("Could not parse GitLab answer to retrieve project branches. Got a non-json payload as result.");
- }
-
- @Test
- public void get_branches_fail_if_exception() throws IOException {
- server.shutdown();
-
- String instanceUrl = gitlabUrl;
- assertThatThrownBy(() -> underTest.getBranches(instanceUrl, "pat", 12345L))
- .isInstanceOf(IllegalStateException.class)
- .hasMessageContaining("Failed to connect to");
- }
-
- @Test
- public void search_projects() throws InterruptedException {
- MockResponse projects = new MockResponse()
- .setResponseCode(200)
- .setBody("[\n"
- + " {\n"
- + " \"id\": 1,\n"
- + " \"name\": \"SonarQube example 1\",\n"
- + " \"name_with_namespace\": \"SonarSource / SonarQube / SonarQube example 1\",\n"
- + " \"path\": \"sonarqube-example-1\",\n"
- + " \"path_with_namespace\": \"sonarsource/sonarqube/sonarqube-example-1\",\n"
- + " \"web_url\": \"https://example.gitlab.com/sonarsource/sonarqube/sonarqube-example-1\"\n"
- + " },\n"
- + " {\n"
- + " \"id\": 2,\n"
- + " \"name\": \"SonarQube example 2\",\n"
- + " \"name_with_namespace\": \"SonarSource / SonarQube / SonarQube example 2\",\n"
- + " \"path\": \"sonarqube-example-2\",\n"
- + " \"path_with_namespace\": \"sonarsource/sonarqube/sonarqube-example-2\",\n"
- + " \"web_url\": \"https://example.gitlab.com/sonarsource/sonarqube/sonarqube-example-2\"\n"
- + " },\n"
- + " {\n"
- + " \"id\": 3,\n"
- + " \"name\": \"SonarQube example 3\",\n"
- + " \"name_with_namespace\": \"SonarSource / SonarQube / SonarQube example 3\",\n"
- + " \"path\": \"sonarqube-example-3\",\n"
- + " \"path_with_namespace\": \"sonarsource/sonarqube/sonarqube-example-3\",\n"
- + " \"web_url\": \"https://example.gitlab.com/sonarsource/sonarqube/sonarqube-example-3\"\n"
- + " }\n"
- + "]");
- projects.addHeader("X-Page", 1);
- projects.addHeader("X-Per-Page", 10);
- projects.addHeader("X-Total", 3);
- server.enqueue(projects);
-
- ProjectList projectList = underTest.searchProjects(gitlabUrl, "pat", "example", 1, 10);
-
- assertThat(projectList.getPageNumber()).isOne();
- assertThat(projectList.getPageSize()).isEqualTo(10);
- assertThat(projectList.getTotal()).isEqualTo(3);
-
- assertThat(projectList.getProjects()).hasSize(3);
- assertThat(projectList.getProjects()).extracting(
- Project::getId, Project::getName, Project::getNameWithNamespace, Project::getPath, Project::getPathWithNamespace, Project::getWebUrl).containsExactly(
- tuple(1L, "SonarQube example 1", "SonarSource / SonarQube / SonarQube example 1", "sonarqube-example-1", "sonarsource/sonarqube/sonarqube-example-1",
- "https://example.gitlab.com/sonarsource/sonarqube/sonarqube-example-1"),
- tuple(2L, "SonarQube example 2", "SonarSource / SonarQube / SonarQube example 2", "sonarqube-example-2", "sonarsource/sonarqube/sonarqube-example-2",
- "https://example.gitlab.com/sonarsource/sonarqube/sonarqube-example-2"),
- tuple(3L, "SonarQube example 3", "SonarSource / SonarQube / SonarQube example 3", "sonarqube-example-3", "sonarsource/sonarqube/sonarqube-example-3",
- "https://example.gitlab.com/sonarsource/sonarqube/sonarqube-example-3"));
-
- RecordedRequest projectGitlabRequest = server.takeRequest(10, TimeUnit.SECONDS);
- String gitlabUrlCall = projectGitlabRequest.getRequestUrl().toString();
- assertThat(gitlabUrlCall).isEqualTo(server.url("") + "projects?archived=false&simple=true&membership=true&order_by=name&sort=asc&search=example&page=1&per_page=10");
- assertThat(projectGitlabRequest.getMethod()).isEqualTo("GET");
- }
-
- @Test
- public void search_projects_dont_fail_if_no_x_total() throws InterruptedException {
- MockResponse projects = new MockResponse()
- .setResponseCode(200)
- .setBody("[\n"
- + " {\n"
- + " \"id\": 1,\n"
- + " \"name\": \"SonarQube example 1\",\n"
- + " \"name_with_namespace\": \"SonarSource / SonarQube / SonarQube example 1\",\n"
- + " \"path\": \"sonarqube-example-1\",\n"
- + " \"path_with_namespace\": \"sonarsource/sonarqube/sonarqube-example-1\",\n"
- + " \"web_url\": \"https://example.gitlab.com/sonarsource/sonarqube/sonarqube-example-1\"\n"
- + " }"
- + "]");
- projects.addHeader("X-Page", 1);
- projects.addHeader("X-Per-Page", 10);
- server.enqueue(projects);
-
- ProjectList projectList = underTest.searchProjects(gitlabUrl, "pat", "example", 1, 10);
-
- assertThat(projectList.getPageNumber()).isOne();
- assertThat(projectList.getPageSize()).isEqualTo(10);
- assertThat(projectList.getTotal()).isNull();
-
- assertThat(projectList.getProjects()).hasSize(1);
- assertThat(projectList.getProjects()).extracting(
- Project::getId, Project::getName, Project::getNameWithNamespace, Project::getPath, Project::getPathWithNamespace, Project::getWebUrl).containsExactly(
- tuple(1L, "SonarQube example 1", "SonarSource / SonarQube / SonarQube example 1", "sonarqube-example-1", "sonarsource/sonarqube/sonarqube-example-1",
- "https://example.gitlab.com/sonarsource/sonarqube/sonarqube-example-1"));
-
- RecordedRequest projectGitlabRequest = server.takeRequest(10, TimeUnit.SECONDS);
- String gitlabUrlCall = projectGitlabRequest.getRequestUrl().toString();
- assertThat(gitlabUrlCall).isEqualTo(server.url("") + "projects?archived=false&simple=true&membership=true&order_by=name&sort=asc&search=example&page=1&per_page=10");
- assertThat(projectGitlabRequest.getMethod()).isEqualTo("GET");
- }
-
- @Test
- public void search_projects_with_case_insensitive_pagination_headers() throws InterruptedException {
- MockResponse projects1 = new MockResponse()
- .setResponseCode(200)
- .setBody("[\n"
- + " {\n"
- + " \"id\": 1,\n"
- + " \"name\": \"SonarQube example 1\",\n"
- + " \"name_with_namespace\": \"SonarSource / SonarQube / SonarQube example 1\",\n"
- + " \"path\": \"sonarqube-example-1\",\n"
- + " \"path_with_namespace\": \"sonarsource/sonarqube/sonarqube-example-1\",\n"
- + " \"web_url\": \"https://example.gitlab.com/sonarsource/sonarqube/sonarqube-example-1\"\n"
- + " }"
- + "]");
- projects1.addHeader("x-page", 1);
- projects1.addHeader("x-Per-page", 1);
- projects1.addHeader("X-Total", 2);
- server.enqueue(projects1);
-
- ProjectList projectList = underTest.searchProjects(gitlabUrl, "pat", "example", 1, 10);
-
- assertThat(projectList.getPageNumber()).isOne();
- assertThat(projectList.getPageSize()).isOne();
- assertThat(projectList.getTotal()).isEqualTo(2);
-
- assertThat(projectList.getProjects()).hasSize(1);
- assertThat(projectList.getProjects()).extracting(
- Project::getId, Project::getName, Project::getNameWithNamespace, Project::getPath, Project::getPathWithNamespace, Project::getWebUrl).containsExactly(
- tuple(1L, "SonarQube example 1", "SonarSource / SonarQube / SonarQube example 1", "sonarqube-example-1", "sonarsource/sonarqube/sonarqube-example-1",
- "https://example.gitlab.com/sonarsource/sonarqube/sonarqube-example-1"));
-
- RecordedRequest projectGitlabRequest = server.takeRequest(10, TimeUnit.SECONDS);
- String gitlabUrlCall = projectGitlabRequest.getRequestUrl().toString();
- assertThat(gitlabUrlCall).isEqualTo(server.url("") + "projects?archived=false&simple=true&membership=true&order_by=name&sort=asc&search=example&page=1&per_page=10");
- assertThat(projectGitlabRequest.getMethod()).isEqualTo("GET");
- }
-
- @Test
- public void search_projects_projectName_param_should_be_encoded() throws InterruptedException {
- MockResponse projects = new MockResponse()
- .setResponseCode(200)
- .setBody("[]");
- projects.addHeader("X-Page", 1);
- projects.addHeader("X-Per-Page", 10);
- projects.addHeader("X-Total", 0);
- server.enqueue(projects);
-
- ProjectList projectList = underTest.searchProjects(gitlabUrl, "pat", "&page=<script>alert('nasty')</script>", 1, 10);
-
- RecordedRequest projectGitlabRequest = server.takeRequest(10, TimeUnit.SECONDS);
- String gitlabUrlCall = projectGitlabRequest.getRequestUrl().toString();
- assertThat(projectList.getProjects()).isEmpty();
- assertThat(gitlabUrlCall).isEqualTo(
- server.url("")
- + "projects?archived=false&simple=true&membership=true&order_by=name&sort=asc&search=%26page%3D%3Cscript%3Ealert%28%27nasty%27%29%3C%2Fscript%3E&page=1&per_page=10");
- assertThat(projectGitlabRequest.getMethod()).isEqualTo("GET");
- }
-
- @Test
- public void search_projects_projectName_param_null_should_pass_empty_string() throws InterruptedException {
- MockResponse projects = new MockResponse()
- .setResponseCode(200)
- .setBody("[]");
- projects.addHeader("X-Page", 1);
- projects.addHeader("X-Per-Page", 10);
- projects.addHeader("X-Total", 0);
- server.enqueue(projects);
-
- ProjectList projectList = underTest.searchProjects(gitlabUrl, "pat", null, 1, 10);
-
- RecordedRequest projectGitlabRequest = server.takeRequest(10, TimeUnit.SECONDS);
- String gitlabUrlCall = projectGitlabRequest.getRequestUrl().toString();
- assertThat(projectList.getProjects()).isEmpty();
- assertThat(gitlabUrlCall).isEqualTo(
- server.url("") + "projects?archived=false&simple=true&membership=true&order_by=name&sort=asc&search=&page=1&per_page=10");
- assertThat(projectGitlabRequest.getMethod()).isEqualTo("GET");
- }
-
- @Test
- public void get_project_details() throws InterruptedException {
- MockResponse projectResponse = new MockResponse()
- .setResponseCode(200)
- .setBody("{"
- + " \"id\": 1234,"
- + " \"name\": \"SonarQube example 2\","
- + " \"name_with_namespace\": \"SonarSource / SonarQube / SonarQube example 2\","
- + " \"path\": \"sonarqube-example-2\","
- + " \"path_with_namespace\": \"sonarsource/sonarqube/sonarqube-example-2\","
- + " \"web_url\": \"https://example.gitlab.com/sonarsource/sonarqube/sonarqube-example-2\""
- + "}");
-
- server.enqueue(projectResponse);
-
- Project project = underTest.getProject(gitlabUrl, "pat", 1234L);
-
- RecordedRequest projectGitlabRequest = server.takeRequest(10, TimeUnit.SECONDS);
- String gitlabUrlCall = projectGitlabRequest.getRequestUrl().toString();
-
- assertThat(project).isNotNull();
-
- assertThat(gitlabUrlCall).isEqualTo(
- server.url("") + "projects/1234");
- assertThat(projectGitlabRequest.getMethod()).isEqualTo("GET");
- }
-
- @Test
- public void get_reporter_level_access_project() throws InterruptedException {
- MockResponse projectResponse = new MockResponse()
- .setResponseCode(200)
- .setBody("[{"
- + " \"id\": 1234,"
- + " \"name\": \"SonarQube example 2\","
- + " \"name_with_namespace\": \"SonarSource / SonarQube / SonarQube example 2\","
- + " \"path\": \"sonarqube-example-2\","
- + " \"path_with_namespace\": \"sonarsource/sonarqube/sonarqube-example-2\","
- + " \"web_url\": \"https://example.gitlab.com/sonarsource/sonarqube/sonarqube-example-2\""
- + "}]");
-
- server.enqueue(projectResponse);
-
- Optional<Project> project = underTest.getReporterLevelAccessProject(gitlabUrl, "pat", 1234L);
-
- RecordedRequest projectGitlabRequest = server.takeRequest(10, TimeUnit.SECONDS);
- String gitlabUrlCall = projectGitlabRequest.getRequestUrl().toString();
-
- assertThat(project).isNotNull();
-
- assertThat(gitlabUrlCall).isEqualTo(
- server.url("") + "projects?min_access_level=20&id_after=1233&id_before=1235");
- assertThat(projectGitlabRequest.getMethod()).isEqualTo("GET");
- }
-
- @Test
- public void search_projects_fail_if_could_not_parse_pagination_number() {
- MockResponse projects = new MockResponse()
- .setResponseCode(200)
- .setBody("[ ]");
- projects.addHeader("X-Page", "bad-page-number");
- projects.addHeader("X-Per-Page", "bad-per-page-number");
- projects.addHeader("X-Total", "bad-total-number");
- server.enqueue(projects);
-
- assertThatThrownBy(() -> underTest.searchProjects(gitlabUrl, "pat", "example", 1, 10))
- .isInstanceOf(IllegalArgumentException.class)
- .hasMessage("Could not parse pagination number");
- }
-
- @Test
- public void search_projects_fail_if_pagination_data_not_returned() {
- MockResponse projects = new MockResponse()
- .setResponseCode(200)
- .setBody("[ ]");
- server.enqueue(projects);
-
- assertThatThrownBy(() -> underTest.searchProjects(gitlabUrl, "pat", "example", 1, 10))
- .isInstanceOf(IllegalArgumentException.class)
- .hasMessage("Pagination data from GitLab response is missing");
- }
-
- @Test
- public void throws_ISE_when_get_projects_not_http_200() {
- MockResponse projects = new MockResponse()
- .setResponseCode(500)
- .setBody("test");
- server.enqueue(projects);
-
- assertThatThrownBy(() -> underTest.searchProjects(gitlabUrl, "pat", "example", 1, 2))
- .isInstanceOf(IllegalArgumentException.class)
- .hasMessage("Could not get projects from GitLab instance");
- }
-
- @Test
- public void fail_check_read_permission_with_unexpected_io_exception_with_detailed_log() throws IOException {
- server.shutdown();
-
- assertThatThrownBy(() -> underTest.checkReadPermission(gitlabUrl, "token"))
- .isInstanceOf(IllegalArgumentException.class)
- .hasMessage("Could not validate GitLab read permission. Got an unexpected answer.");
- assertThat(logTester.logs(LoggerLevel.INFO).get(0))
- .contains("Gitlab API call to [" + server.url("/projects") + "] " +
- "failed with error message : [Failed to connect to " + server.getHostName());
- }
-
- @Test
- public void fail_check_token_with_unexpected_io_exception_with_detailed_log() throws IOException {
- server.shutdown();
-
- assertThatThrownBy(() -> underTest.checkToken(gitlabUrl, "token"))
- .isInstanceOf(IllegalArgumentException.class)
- .hasMessage("Could not validate GitLab token. Got an unexpected answer.");
- assertThat(logTester.logs(LoggerLevel.INFO).get(0))
- .contains("Gitlab API call to [" + server.url("user") + "] " +
- "failed with error message : [Failed to connect to " + server.getHostName());
- }
-
- @Test
- public void fail_check_write_permission_with_unexpected_io_exception_with_detailed_log() throws IOException {
- server.shutdown();
-
- assertThatThrownBy(() -> underTest.checkWritePermission(gitlabUrl, "token"))
- .isInstanceOf(IllegalArgumentException.class)
- .hasMessage("Could not validate GitLab write permission. Got an unexpected answer.");
- assertThat(logTester.logs(LoggerLevel.INFO).get(0))
- .contains("Gitlab API call to [" + server.url("/markdown") + "] " +
- "failed with error message : [Failed to connect to " + server.getHostName());
- }
-
- @Test
- public void fail_get_project_with_unexpected_io_exception_with_detailed_log() throws IOException {
- server.shutdown();
-
- assertThatThrownBy(() -> underTest.getProject(gitlabUrl, "token", 0L))
- .isInstanceOf(IllegalStateException.class)
- .hasMessageContaining("Failed to connect to");
- assertThat(logTester.logs(LoggerLevel.INFO).get(0))
- .contains("Gitlab API call to [" + server.url("/projects/0") + "] " +
- "failed with error message : [Failed to connect to " + server.getHostName());
- }
-
- @Test
- public void fail_get_branches_with_unexpected_io_exception_with_detailed_log() throws IOException {
- server.shutdown();
-
- assertThatThrownBy(() -> underTest.getBranches(gitlabUrl, "token", 0L))
- .isInstanceOf(IllegalStateException.class)
- .hasMessageContaining("Failed to connect to " + server.getHostName());
- assertThat(logTester.logs(LoggerLevel.INFO).get(0))
- .contains("Gitlab API call to [" + server.url("/projects/0/repository/branches") + "] " +
- "failed with error message : [Failed to connect to " + server.getHostName());
- }
-
- @Test
- public void fail_search_projects_with_unexpected_io_exception_with_detailed_log() throws IOException {
- server.shutdown();
-
- assertThatThrownBy(() -> underTest.searchProjects(gitlabUrl, "token", null, 1, 1))
- .isInstanceOf(IllegalStateException.class)
- .hasMessageContaining("Failed to connect to");
- assertThat(logTester.logs(LoggerLevel.INFO).get(0))
- .contains(
- "Gitlab API call to [" + server.url("/projects?archived=false&simple=true&membership=true&order_by=name&sort=asc&search=&page=1&per_page=1")
- + "] " +
- "failed with error message : [Failed to connect to " + server.getHostName());
- }
- }
|