You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

BitbucketServerRestClientTest.java 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2021 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. package org.sonar.alm.client.bitbucketserver;
  21. import java.io.IOException;
  22. import okhttp3.mockwebserver.MockResponse;
  23. import okhttp3.mockwebserver.MockWebServer;
  24. import org.junit.After;
  25. import org.junit.Before;
  26. import org.junit.Rule;
  27. import org.junit.Test;
  28. import org.sonar.alm.client.ConstantTimeoutConfiguration;
  29. import org.sonar.api.utils.log.LogTester;
  30. import static org.assertj.core.api.Assertions.assertThat;
  31. import static org.assertj.core.api.Assertions.assertThatThrownBy;
  32. import static org.assertj.core.api.Assertions.tuple;
  33. public class BitbucketServerRestClientTest {
  34. private final MockWebServer server = new MockWebServer();
  35. private static final String REPOS_BODY = "{\n" +
  36. " \"isLastPage\": true,\n" +
  37. " \"values\": [\n" +
  38. " {\n" +
  39. " \"slug\": \"banana\",\n" +
  40. " \"id\": 2,\n" +
  41. " \"name\": \"banana\",\n" +
  42. " \"project\": {\n" +
  43. " \"key\": \"HOY\",\n" +
  44. " \"id\": 2,\n" +
  45. " \"name\": \"hoy\"\n" +
  46. " }\n" +
  47. " },\n" +
  48. " {\n" +
  49. " \"slug\": \"potato\",\n" +
  50. " \"id\": 1,\n" +
  51. " \"name\": \"potato\",\n" +
  52. " \"project\": {\n" +
  53. " \"key\": \"HEY\",\n" +
  54. " \"id\": 1,\n" +
  55. " \"name\": \"hey\"\n" +
  56. " }\n" +
  57. " }\n" +
  58. " ]\n" +
  59. "}";
  60. @Rule
  61. public LogTester logTester = new LogTester();
  62. private BitbucketServerRestClient underTest;
  63. @Before
  64. public void prepare() throws IOException {
  65. server.start();
  66. underTest = new BitbucketServerRestClient(new ConstantTimeoutConfiguration(500));
  67. }
  68. @After
  69. public void stopServer() throws IOException {
  70. server.shutdown();
  71. }
  72. @Test
  73. public void get_repos() {
  74. server.enqueue(new MockResponse()
  75. .setHeader("Content-Type", "application/json;charset=UTF-8")
  76. .setBody("{\n" +
  77. " \"isLastPage\": true,\n" +
  78. " \"values\": [\n" +
  79. " {\n" +
  80. " \"slug\": \"banana\",\n" +
  81. " \"id\": 2,\n" +
  82. " \"name\": \"banana\",\n" +
  83. " \"project\": {\n" +
  84. " \"key\": \"HOY\",\n" +
  85. " \"id\": 2,\n" +
  86. " \"name\": \"hoy\"\n" +
  87. " }\n" +
  88. " },\n" +
  89. " {\n" +
  90. " \"slug\": \"potato\",\n" +
  91. " \"id\": 1,\n" +
  92. " \"name\": \"potato\",\n" +
  93. " \"project\": {\n" +
  94. " \"key\": \"HEY\",\n" +
  95. " \"id\": 1,\n" +
  96. " \"name\": \"hey\"\n" +
  97. " }\n" +
  98. " }\n" +
  99. " ]\n" +
  100. "}"));
  101. RepositoryList gsonBBSRepoList = underTest.getRepos(server.url("/").toString(), "token", "", "");
  102. assertThat(gsonBBSRepoList.isLastPage()).isTrue();
  103. assertThat(gsonBBSRepoList.getValues()).hasSize(2);
  104. assertThat(gsonBBSRepoList.getValues()).extracting(Repository::getId, Repository::getName, Repository::getSlug,
  105. g -> g.getProject().getId(), g -> g.getProject().getKey(), g -> g.getProject().getName())
  106. .containsExactlyInAnyOrder(
  107. tuple(2L, "banana", "banana", 2L, "HOY", "hoy"),
  108. tuple(1L, "potato", "potato", 1L, "HEY", "hey"));
  109. }
  110. @Test
  111. public void get_recent_repos() {
  112. server.enqueue(new MockResponse()
  113. .setHeader("Content-Type", "application/json;charset=UTF-8")
  114. .setBody("{\n" +
  115. " \"isLastPage\": true,\n" +
  116. " \"values\": [\n" +
  117. " {\n" +
  118. " \"slug\": \"banana\",\n" +
  119. " \"id\": 2,\n" +
  120. " \"name\": \"banana\",\n" +
  121. " \"project\": {\n" +
  122. " \"key\": \"HOY\",\n" +
  123. " \"id\": 2,\n" +
  124. " \"name\": \"hoy\"\n" +
  125. " }\n" +
  126. " },\n" +
  127. " {\n" +
  128. " \"slug\": \"potato\",\n" +
  129. " \"id\": 1,\n" +
  130. " \"name\": \"potato\",\n" +
  131. " \"project\": {\n" +
  132. " \"key\": \"HEY\",\n" +
  133. " \"id\": 1,\n" +
  134. " \"name\": \"hey\"\n" +
  135. " }\n" +
  136. " }\n" +
  137. " ]\n" +
  138. "}"));
  139. RepositoryList gsonBBSRepoList = underTest.getRecentRepo(server.url("/").toString(), "token");
  140. assertThat(gsonBBSRepoList.isLastPage()).isTrue();
  141. assertThat(gsonBBSRepoList.getValues()).hasSize(2);
  142. assertThat(gsonBBSRepoList.getValues()).extracting(Repository::getId, Repository::getName, Repository::getSlug,
  143. g -> g.getProject().getId(), g -> g.getProject().getKey(), g -> g.getProject().getName())
  144. .containsExactlyInAnyOrder(
  145. tuple(2L, "banana", "banana", 2L, "HOY", "hoy"),
  146. tuple(1L, "potato", "potato", 1L, "HEY", "hey"));
  147. }
  148. @Test
  149. public void get_repo() {
  150. server.enqueue(new MockResponse()
  151. .setHeader("Content-Type", "application/json;charset=UTF-8")
  152. .setBody(
  153. " {" +
  154. " \"slug\": \"banana-slug\"," +
  155. " \"id\": 2,\n" +
  156. " \"name\": \"banana\"," +
  157. " \"project\": {\n" +
  158. " \"key\": \"HOY\"," +
  159. " \"id\": 3,\n" +
  160. " \"name\": \"hoy\"" +
  161. " }" +
  162. " }"));
  163. Repository repository = underTest.getRepo(server.url("/").toString(), "token", "", "");
  164. assertThat(repository.getId()).isEqualTo(2L);
  165. assertThat(repository.getName()).isEqualTo("banana");
  166. assertThat(repository.getSlug()).isEqualTo("banana-slug");
  167. assertThat(repository.getProject())
  168. .extracting(Project::getId, Project::getKey, Project::getName)
  169. .contains(3L, "HOY", "hoy");
  170. }
  171. @Test
  172. public void get_projects() {
  173. server.enqueue(new MockResponse()
  174. .setHeader("Content-Type", "application/json;charset=UTF-8")
  175. .setBody("{\n" +
  176. " \"isLastPage\": true,\n" +
  177. " \"values\": [\n" +
  178. " {\n" +
  179. " \"key\": \"HEY\",\n" +
  180. " \"id\": 1,\n" +
  181. " \"name\": \"hey\"\n" +
  182. " },\n" +
  183. " {\n" +
  184. " \"key\": \"HOY\",\n" +
  185. " \"id\": 2,\n" +
  186. " \"name\": \"hoy\"\n" +
  187. " }\n" +
  188. " ]\n" +
  189. "}"));
  190. final ProjectList gsonBBSProjectList = underTest.getProjects(server.url("/").toString(), "token");
  191. assertThat(gsonBBSProjectList.getValues()).hasSize(2);
  192. assertThat(gsonBBSProjectList.getValues()).extracting(Project::getId, Project::getKey, Project::getName)
  193. .containsExactlyInAnyOrder(
  194. tuple(1L, "HEY", "hey"),
  195. tuple(2L, "HOY", "hoy"));
  196. }
  197. @Test
  198. public void getBranches_given0Branches_returnEmptyList() {
  199. String bodyWith0Branches = "{\n" +
  200. " \"size\": 0,\n" +
  201. " \"limit\": 25,\n" +
  202. " \"isLastPage\": true,\n" +
  203. " \"values\": [],\n" +
  204. " \"start\": 0\n" +
  205. "}";
  206. server.enqueue(new MockResponse()
  207. .setHeader("Content-Type", "application/json;charset=UTF-8")
  208. .setBody(bodyWith0Branches));
  209. BranchesList branches = underTest.getBranches(server.url("/").toString(), "token", "projectSlug", "repoSlug");
  210. assertThat(branches.getBranches()).isEmpty();
  211. }
  212. @Test
  213. public void getBranches_given1Branch_returnListWithOneBranch() {
  214. String bodyWith1Branch = "{\n" +
  215. " \"size\": 1,\n" +
  216. " \"limit\": 25,\n" +
  217. " \"isLastPage\": true,\n" +
  218. " \"values\": [{\n" +
  219. " \"id\": \"refs/heads/demo\",\n" +
  220. " \"displayId\": \"demo\",\n" +
  221. " \"type\": \"BRANCH\",\n" +
  222. " \"latestCommit\": \"3e30a6701af6f29f976e9a6609a6076b32a69ac3\",\n" +
  223. " \"latestChangeset\": \"3e30a6701af6f29f976e9a6609a6076b32a69ac3\",\n" +
  224. " \"isDefault\": false\n" +
  225. " }],\n" +
  226. " \"start\": 0\n" +
  227. "}";
  228. server.enqueue(new MockResponse()
  229. .setHeader("Content-Type", "application/json;charset=UTF-8")
  230. .setBody(bodyWith1Branch));
  231. BranchesList branches = underTest.getBranches(server.url("/").toString(), "token", "projectSlug", "repoSlug");
  232. assertThat(branches.getBranches()).hasSize(1);
  233. Branch branch = branches.getBranches().get(0);
  234. assertThat(branch.getName()).isEqualTo("demo");
  235. assertThat(branch.isDefault()).isFalse();
  236. }
  237. @Test
  238. public void getBranches_given2Branches_returnListWithTwoBranches() {
  239. String bodyWith2Branches = "{\n" +
  240. " \"size\": 2,\n" +
  241. " \"limit\": 25,\n" +
  242. " \"isLastPage\": true,\n" +
  243. " \"values\": [{\n" +
  244. " \"id\": \"refs/heads/demo\",\n" +
  245. " \"displayId\": \"demo\",\n" +
  246. " \"type\": \"BRANCH\",\n" +
  247. " \"latestCommit\": \"3e30a6701af6f29f976e9a6609a6076b32a69ac3\",\n" +
  248. " \"latestChangeset\": \"3e30a6701af6f29f976e9a6609a6076b32a69ac3\",\n" +
  249. " \"isDefault\": false\n" +
  250. " }, {\n" +
  251. " \"id\": \"refs/heads/master\",\n" +
  252. " \"displayId\": \"master\",\n" +
  253. " \"type\": \"BRANCH\",\n" +
  254. " \"latestCommit\": \"66633864d27c531ff43892f6dfea6d91632682fa\",\n" +
  255. " \"latestChangeset\": \"66633864d27c531ff43892f6dfea6d91632682fa\",\n" +
  256. " \"isDefault\": true\n" +
  257. " }],\n" +
  258. " \"start\": 0\n" +
  259. "}";
  260. server.enqueue(new MockResponse()
  261. .setHeader("Content-Type", "application/json;charset=UTF-8")
  262. .setBody(bodyWith2Branches));
  263. BranchesList branches = underTest.getBranches(server.url("/").toString(), "token", "projectSlug", "repoSlug");
  264. assertThat(branches.getBranches()).hasSize(2);
  265. }
  266. @Test
  267. public void invalid_url() {
  268. assertThatThrownBy(() -> BitbucketServerRestClient.buildUrl("file://wrong-url", ""))
  269. .isInstanceOf(IllegalArgumentException.class)
  270. .hasMessage("url must start with http:// or https://");
  271. }
  272. @Test
  273. public void malformed_json() {
  274. server.enqueue(new MockResponse()
  275. .setHeader("Content-Type", "application/json;charset=UTF-8")
  276. .setBody(
  277. "I'm malformed JSON"));
  278. String serverUrl = server.url("/").toString();
  279. assertThatThrownBy(() -> underTest.getRepo(serverUrl, "token", "", ""))
  280. .isInstanceOf(IllegalArgumentException.class)
  281. .hasMessage("Unable to contact Bitbucket server, got an unexpected response");
  282. }
  283. @Test
  284. public void error_handling() {
  285. server.enqueue(new MockResponse()
  286. .setHeader("Content-Type", "application/json;charset=UTF-8")
  287. .setResponseCode(400)
  288. .setBody("{\n" +
  289. " \"errors\": [\n" +
  290. " {\n" +
  291. " \"context\": null,\n" +
  292. " \"message\": \"Bad message\",\n" +
  293. " \"exceptionName\": \"com.atlassian.bitbucket.auth.BadException\"\n" +
  294. " }\n" +
  295. " ]\n" +
  296. "}"));
  297. String serverUrl = server.url("/").toString();
  298. assertThatThrownBy(() -> underTest.getRepo(serverUrl, "token", "", ""))
  299. .isInstanceOf(IllegalArgumentException.class)
  300. .hasMessage("Unable to contact Bitbucket server");
  301. }
  302. @Test
  303. public void unauthorized_error() {
  304. server.enqueue(new MockResponse()
  305. .setHeader("Content-Type", "application/json;charset=UTF-8")
  306. .setResponseCode(401)
  307. .setBody("{\n" +
  308. " \"errors\": [\n" +
  309. " {\n" +
  310. " \"context\": null,\n" +
  311. " \"message\": \"Bad message\",\n" +
  312. " \"exceptionName\": \"com.atlassian.bitbucket.auth.BadException\"\n" +
  313. " }\n" +
  314. " ]\n" +
  315. "}"));
  316. String serverUrl = server.url("/").toString();
  317. assertThatThrownBy(() -> underTest.getRepo(serverUrl, "token", "", ""))
  318. .isInstanceOf(IllegalArgumentException.class)
  319. .hasMessage("Invalid personal access token");
  320. }
  321. @Test
  322. public void fail_validate_on_io_exception() throws IOException {
  323. server.shutdown();
  324. String serverUrl = server.url("/").toString();
  325. assertThatThrownBy(() -> underTest.validateUrl(serverUrl))
  326. .isInstanceOf(IllegalArgumentException.class)
  327. .hasMessage("Unable to contact Bitbucket server");
  328. assertThat(String.join(", ", logTester.logs())).contains("Unable to contact Bitbucket server: Failed to connect");
  329. }
  330. @Test
  331. public void fail_validate_url_on_non_json_result_log_correctly_the_response() {
  332. server.enqueue(new MockResponse()
  333. .setHeader("Content-Type", "application/json;charset=UTF-8")
  334. .setResponseCode(500)
  335. .setBody("not json"));
  336. String serverUrl = server.url("/").toString();
  337. assertThatThrownBy(() -> underTest.validateReadPermission(serverUrl, "token"))
  338. .isInstanceOf(IllegalArgumentException.class)
  339. .hasMessage("Unable to contact Bitbucket server");
  340. assertThat(String.join(", ", logTester.logs())).contains("Unable to contact Bitbucket server: 500 not json");
  341. }
  342. @Test
  343. public void fail_validate_url_on_text_result_log_the_returned_payload() {
  344. server.enqueue(new MockResponse()
  345. .setResponseCode(500)
  346. .setBody("this is a text payload"));
  347. String serverUrl = server.url("/").toString();
  348. assertThatThrownBy(() -> underTest.validateReadPermission(serverUrl, "token"))
  349. .isInstanceOf(IllegalArgumentException.class)
  350. .hasMessage("Unable to contact Bitbucket server");
  351. assertThat(String.join(", ", logTester.logs())).contains("Unable to contact Bitbucket server: 500 this is a text payload");
  352. }
  353. @Test
  354. public void validate_url_success() {
  355. server.enqueue(new MockResponse().setResponseCode(200)
  356. .setBody(REPOS_BODY));
  357. underTest.validateUrl(server.url("/").toString());
  358. }
  359. @Test
  360. public void validate_url_fail_when_not_starting_with_protocol() {
  361. assertThatThrownBy(() -> underTest.validateUrl("any_url_not_starting_with_http.com"))
  362. .isInstanceOf(IllegalArgumentException.class)
  363. .hasMessage("url must start with http:// or https://");
  364. }
  365. @Test
  366. public void validate_token_success() {
  367. server.enqueue(new MockResponse().setResponseCode(200)
  368. .setBody("{\n" +
  369. " \"size\":10,\n" +
  370. " \"limit\":25,\n" +
  371. " \"isLastPage\":true,\n" +
  372. " \"values\":[\n" +
  373. " {\n" +
  374. " \"name\":\"jean.michel\",\n" +
  375. " \"emailAddress\":\"jean.michel@sonarsource.com\",\n" +
  376. " \"id\":2,\n" +
  377. " \"displayName\":\"Jean Michel\",\n" +
  378. " \"active\":true,\n" +
  379. " \"slug\":\"jean.michel\",\n" +
  380. " \"type\":\"NORMAL\",\n" +
  381. " \"links\":{\n" +
  382. " \"self\":[\n" +
  383. " {\n" +
  384. " \"href\":\"https://bitbucket-testing.valiantys.sonarsource.com/users/jean.michel\"\n" +
  385. " }\n" +
  386. " ]\n" +
  387. " }\n" +
  388. " },\n" +
  389. " {\n" +
  390. " \"name\":\"prince.de.lu\",\n" +
  391. " \"emailAddress\":\"prince.de.lu@sonarsource.com\",\n" +
  392. " \"id\":103,\n" +
  393. " \"displayName\":\"Prince de Lu\",\n" +
  394. " \"active\":true,\n" +
  395. " \"slug\":\"prince.de.lu\",\n" +
  396. " \"type\":\"NORMAL\",\n" +
  397. " \"links\":{\n" +
  398. " \"self\":[\n" +
  399. " {\n" +
  400. " \"href\":\"https://bitbucket-testing.valiantys.sonarsource.com/users/prince.de.lu\"\n" +
  401. " }\n" +
  402. " ]\n" +
  403. " }\n" +
  404. " },\n" +
  405. " ],\n" +
  406. " \"start\":0\n" +
  407. "}"));
  408. underTest.validateToken(server.url("/").toString(), "token");
  409. }
  410. @Test
  411. public void validate_read_permission_success() {
  412. server.enqueue(new MockResponse().setResponseCode(200)
  413. .setBody(REPOS_BODY));
  414. underTest.validateReadPermission(server.url("/").toString(), "token");
  415. }
  416. @Test
  417. public void fail_validate_url_when_on_http_error() {
  418. server.enqueue(new MockResponse().setResponseCode(500)
  419. .setBody("something unexpected"));
  420. String serverUrl = server.url("/").toString();
  421. assertThatThrownBy(() -> underTest.validateUrl(serverUrl))
  422. .isInstanceOf(IllegalArgumentException.class)
  423. .hasMessage("Unable to contact Bitbucket server");
  424. }
  425. @Test
  426. public void fail_validate_url_when_not_found_is_returned() {
  427. server.enqueue(new MockResponse().setResponseCode(404)
  428. .setBody("something unexpected"));
  429. String serverUrl = server.url("/").toString();
  430. assertThatThrownBy(() -> underTest.validateUrl(serverUrl))
  431. .isInstanceOf(BitbucketServerException.class)
  432. .hasMessage("something unexpected")
  433. .extracting(e -> ((BitbucketServerException) e).getHttpStatus()).isEqualTo(404);
  434. }
  435. @Test
  436. public void fail_validate_url_when_body_is_empty() {
  437. server.enqueue(new MockResponse().setResponseCode(404).setBody(""));
  438. String serverUrl = server.url("/").toString();
  439. assertThatThrownBy(() -> underTest.validateUrl(serverUrl))
  440. .isInstanceOf(BitbucketServerException.class)
  441. .hasMessage("")
  442. .extracting(e -> ((BitbucketServerException) e).getHttpStatus()).isEqualTo(404);
  443. }
  444. @Test
  445. public void fail_validate_url_when_validate_url_return_non_json_payload() {
  446. server.enqueue(new MockResponse().setResponseCode(400)
  447. .setBody("this is not a json payload"));
  448. String serverUrl = server.url("/").toString();
  449. assertThatThrownBy(() -> underTest.validateUrl(serverUrl))
  450. .isInstanceOf(IllegalArgumentException.class)
  451. .hasMessage("Unable to contact Bitbucket server");
  452. }
  453. @Test
  454. public void fail_validate_url_when_returning_non_json_payload_with_a_200_code() {
  455. server.enqueue(new MockResponse().setResponseCode(200)
  456. .setBody("this is not a json payload"));
  457. String serverUrl = server.url("/").toString();
  458. assertThatThrownBy(() -> underTest.validateUrl(serverUrl))
  459. .isInstanceOf(IllegalArgumentException.class)
  460. .hasMessage("Unable to contact Bitbucket server, got an unexpected response");
  461. }
  462. @Test
  463. public void fail_validate_token_when_server_return_non_json_payload() {
  464. server.enqueue(new MockResponse().setResponseCode(400)
  465. .setBody("this is not a json payload"));
  466. String serverUrl = server.url("/").toString();
  467. assertThatThrownBy(() -> underTest.validateToken(serverUrl, "token"))
  468. .isInstanceOf(IllegalArgumentException.class)
  469. .hasMessage("Unable to contact Bitbucket server");
  470. }
  471. @Test
  472. public void fail_validate_token_when_returning_non_json_payload_with_a_200_code() {
  473. server.enqueue(new MockResponse().setResponseCode(200)
  474. .setBody("this is not a json payload"));
  475. String serverUrl = server.url("/").toString();
  476. assertThatThrownBy(() -> underTest.validateToken(serverUrl, "token"))
  477. .isInstanceOf(IllegalArgumentException.class)
  478. .hasMessage("Unable to contact Bitbucket server, got an unexpected response");
  479. }
  480. @Test
  481. public void fail_validate_token_when_using_an_invalid_token() {
  482. server.enqueue(new MockResponse().setResponseCode(401)
  483. .setBody("com.atlassian.bitbucket.AuthorisationException You are not permitted to access this resource"));
  484. String serverUrl = server.url("/").toString();
  485. assertThatThrownBy(() -> underTest.validateToken(serverUrl, "token"))
  486. .isInstanceOf(IllegalArgumentException.class)
  487. .hasMessage("Invalid personal access token");
  488. }
  489. @Test
  490. public void fail_validate_read_permission_when_server_return_non_json_payload() {
  491. server.enqueue(new MockResponse().setResponseCode(400)
  492. .setBody("this is not a json payload"));
  493. String serverUrl = server.url("/").toString();
  494. assertThatThrownBy(() -> underTest.validateReadPermission(serverUrl, "token"))
  495. .isInstanceOf(IllegalArgumentException.class)
  496. .hasMessage("Unable to contact Bitbucket server");
  497. }
  498. @Test
  499. public void fail_validate_read_permission_when_returning_non_json_payload_with_a_200_code() {
  500. server.enqueue(new MockResponse().setResponseCode(200)
  501. .setBody("this is not a json payload"));
  502. String serverUrl = server.url("/").toString();
  503. assertThatThrownBy(() -> underTest.validateReadPermission(serverUrl, "token"))
  504. .isInstanceOf(IllegalArgumentException.class)
  505. .hasMessage("Unable to contact Bitbucket server, got an unexpected response");
  506. }
  507. @Test
  508. public void fail_validate_read_permission_when_permissions_are_not_granted() {
  509. server.enqueue(new MockResponse().setResponseCode(401)
  510. .setBody("com.atlassian.bitbucket.AuthorisationException You are not permitted to access this resource"));
  511. String serverUrl = server.url("/").toString();
  512. assertThatThrownBy(() -> underTest.validateReadPermission(serverUrl, "token"))
  513. .isInstanceOf(IllegalArgumentException.class)
  514. .hasMessage("Invalid personal access token");
  515. }
  516. }