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.

BranchDaoIT.java 41KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2023 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.db.component;
  21. import com.google.common.collect.Sets;
  22. import com.tngtech.java.junit.dataprovider.DataProvider;
  23. import com.tngtech.java.junit.dataprovider.DataProviderRunner;
  24. import com.tngtech.java.junit.dataprovider.UseDataProvider;
  25. import java.util.ArrayList;
  26. import java.util.Collection;
  27. import java.util.Collections;
  28. import java.util.HashMap;
  29. import java.util.List;
  30. import java.util.Map;
  31. import java.util.Optional;
  32. import java.util.Set;
  33. import java.util.stream.Collectors;
  34. import java.util.stream.IntStream;
  35. import org.junit.Rule;
  36. import org.junit.Test;
  37. import org.junit.runner.RunWith;
  38. import org.sonar.api.impl.utils.TestSystem2;
  39. import org.sonar.api.utils.System2;
  40. import org.sonar.db.DbSession;
  41. import org.sonar.db.DbTester;
  42. import org.sonar.db.metric.MetricDto;
  43. import org.sonar.db.project.ProjectDto;
  44. import org.sonar.db.protobuf.DbProjectBranches;
  45. import static java.util.Arrays.asList;
  46. import static java.util.Collections.emptyList;
  47. import static java.util.Collections.singletonList;
  48. import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
  49. import static org.apache.commons.lang.StringUtils.repeat;
  50. import static org.assertj.core.api.Assertions.assertThat;
  51. import static org.assertj.core.api.Assertions.entry;
  52. import static org.assertj.core.api.Assertions.tuple;
  53. import static org.sonar.api.measures.CoreMetrics.ALERT_STATUS_KEY;
  54. import static org.sonar.db.component.BranchType.BRANCH;
  55. import static org.sonar.db.component.BranchType.PULL_REQUEST;
  56. @RunWith(DataProviderRunner.class)
  57. public class BranchDaoIT {
  58. private static final long NOW = 1_000L;
  59. private static final String SELECT_FROM = """
  60. select project_uuid as "projectUuid", uuid as "uuid", branch_type as "branchType",
  61. kee as "kee", merge_branch_uuid as "mergeBranchUuid", pull_request_binary as "pullRequestBinary", created_at as "createdAt", updated_at as "updatedAt", is_main as "isMain"
  62. from project_branches""";
  63. private System2 system2 = new TestSystem2().setNow(NOW);
  64. @Rule
  65. public DbTester db = DbTester.create(system2);
  66. private DbSession dbSession = db.getSession();
  67. private BranchDao underTest = new BranchDao(system2);
  68. @Test
  69. public void insert_branch_with_only_nonnull_fields() {
  70. BranchDto dto = new BranchDto();
  71. dto.setProjectUuid("U1");
  72. dto.setUuid("U2");
  73. dto.setBranchType(BranchType.BRANCH);
  74. dto.setIsMain(true);
  75. dto.setKey("feature/foo");
  76. underTest.insert(dbSession, dto);
  77. Map<String, Object> map = db.selectFirst(dbSession, SELECT_FROM + " where uuid='" + dto.getUuid() + "'");
  78. assertThat(map).contains(
  79. entry("projectUuid", "U1"),
  80. entry("uuid", "U2"),
  81. entry("branchType", "BRANCH"),
  82. entry("kee", "feature/foo"),
  83. entry("mergeBranchUuid", null),
  84. entry("pullRequestBinary", null),
  85. entry("createdAt", 1_000L),
  86. entry("updatedAt", 1_000L));
  87. assertThat(map.get("isMain")).isIn(true, 1L); // Oracle returns 1L instead of true
  88. }
  89. @Test
  90. public void update_main_branch_name() {
  91. BranchDto dto = new BranchDto();
  92. dto.setProjectUuid("U1");
  93. dto.setUuid("U1");
  94. dto.setIsMain(true);
  95. dto.setBranchType(BranchType.BRANCH);
  96. dto.setKey("feature");
  97. underTest.insert(dbSession, dto);
  98. BranchDto dto2 = new BranchDto();
  99. dto2.setProjectUuid("U2");
  100. dto2.setUuid("U2");
  101. dto2.setIsMain(true);
  102. dto2.setBranchType(BranchType.BRANCH);
  103. dto2.setKey("branch");
  104. underTest.insert(dbSession, dto2);
  105. underTest.updateBranchName(dbSession, "U1", "master");
  106. BranchDto loaded = underTest.selectByBranchKey(dbSession, "U1", "master").get();
  107. assertThat(loaded.getMergeBranchUuid()).isNull();
  108. assertThat(loaded.getProjectUuid()).isEqualTo("U1");
  109. assertThat(loaded.getBranchType()).isEqualTo(BranchType.BRANCH);
  110. assertThat(loaded.isMain()).isTrue();
  111. }
  112. @Test
  113. public void selectBranchMeasuresForTelemetry() {
  114. BranchDto dto = new BranchDto();
  115. dto.setProjectUuid("U1");
  116. dto.setUuid("U1");
  117. dto.setBranchType(BranchType.BRANCH);
  118. dto.setKey("feature");
  119. dto.setIsMain(true);
  120. dto.setExcludeFromPurge(false);
  121. underTest.insert(dbSession, dto);
  122. MetricDto qg = db.measures().insertMetric(m -> m.setKey(ALERT_STATUS_KEY));
  123. SnapshotDto analysis = db.components().insertSnapshot(dto);
  124. db.measures().insertMeasure(dto, analysis, qg, pm -> pm.setData("OK"));
  125. var branchMeasures = underTest.selectBranchMeasuresWithCaycMetric(dbSession);
  126. assertThat(branchMeasures)
  127. .hasSize(1)
  128. .extracting(BranchMeasuresDto::getBranchUuid, BranchMeasuresDto::getBranchKey, BranchMeasuresDto::getProjectUuid,
  129. BranchMeasuresDto::getAnalysisCount, BranchMeasuresDto::getGreenQualityGateCount, BranchMeasuresDto::getExcludeFromPurge)
  130. .containsExactly(tuple("U1", "feature", "U1", 1, 1, false));
  131. }
  132. @Test
  133. public void updateExcludeFromPurge() {
  134. BranchDto dto = new BranchDto();
  135. dto.setProjectUuid("U1");
  136. dto.setUuid("U1");
  137. dto.setBranchType(BranchType.BRANCH);
  138. dto.setKey("feature");
  139. dto.setIsMain(true);
  140. dto.setExcludeFromPurge(false);
  141. underTest.insert(dbSession, dto);
  142. underTest.updateExcludeFromPurge(dbSession, "U1", true);
  143. BranchDto loaded = underTest.selectByBranchKey(dbSession, "U1", "feature").get();
  144. assertThat(loaded.isExcludeFromPurge()).isTrue();
  145. }
  146. @DataProvider
  147. public static Object[][] nullOrEmpty() {
  148. return new Object[][] {
  149. {null},
  150. {""}
  151. };
  152. }
  153. @DataProvider
  154. public static Object[][] oldAndNewValuesCombinations() {
  155. String value1 = randomAlphabetic(10);
  156. String value2 = randomAlphabetic(20);
  157. return new Object[][] {
  158. {null, value1},
  159. {"", value1},
  160. {value1, null},
  161. {value1, ""},
  162. {value1, value2},
  163. {null, null},
  164. {"", null},
  165. {value1, value1}
  166. };
  167. }
  168. @Test
  169. public void insert_branch_with_all_fields_and_max_length_values() {
  170. BranchDto dto = new BranchDto();
  171. dto.setProjectUuid(repeat("a", 50));
  172. dto.setUuid(repeat("b", 50));
  173. dto.setIsMain(false);
  174. dto.setBranchType(BranchType.BRANCH);
  175. dto.setKey(repeat("c", 255));
  176. dto.setMergeBranchUuid(repeat("d", 50));
  177. underTest.insert(dbSession, dto);
  178. Map<String, Object> map = db.selectFirst(dbSession, SELECT_FROM + " where uuid='" + dto.getUuid() + "'");
  179. assertThat((String) map.get("projectUuid")).contains("a").isEqualTo(dto.getProjectUuid());
  180. assertThat((String) map.get("uuid")).contains("b").isEqualTo(dto.getUuid());
  181. assertThat((String) map.get("kee")).contains("c").isEqualTo(dto.getKey());
  182. assertThat((String) map.get("mergeBranchUuid")).contains("d").isEqualTo(dto.getMergeBranchUuid());
  183. }
  184. @Test
  185. public void insert_pull_request_branch_with_only_non_null_fields() {
  186. String projectUuid = "U1";
  187. String uuid = "U2";
  188. BranchType branchType = BranchType.PULL_REQUEST;
  189. String kee = "123";
  190. BranchDto dto = new BranchDto();
  191. dto.setProjectUuid(projectUuid);
  192. dto.setUuid(uuid);
  193. dto.setIsMain(false);
  194. dto.setBranchType(branchType);
  195. dto.setKey(kee);
  196. underTest.insert(dbSession, dto);
  197. BranchDto loaded = underTest.selectByUuid(dbSession, dto.getUuid()).get();
  198. assertThat(loaded.getProjectUuid()).isEqualTo(projectUuid);
  199. assertThat(loaded.getUuid()).isEqualTo(uuid);
  200. assertThat(loaded.isMain()).isFalse();
  201. assertThat(loaded.getBranchType()).isEqualTo(branchType);
  202. assertThat(loaded.getKey()).isEqualTo(kee);
  203. assertThat(loaded.getMergeBranchUuid()).isNull();
  204. assertThat(loaded.getPullRequestData()).isNull();
  205. }
  206. @Test
  207. public void insert_pull_request_branch_with_all_fields() {
  208. String projectUuid = "U1";
  209. String uuid = "U2";
  210. BranchType branchType = BranchType.PULL_REQUEST;
  211. String kee = "123";
  212. String branch = "feature/pr1";
  213. String title = "Dummy Feature Title";
  214. String url = "http://example.com/pullRequests/pr1";
  215. String tokenAttributeName = "token";
  216. String tokenAttributeValue = "dummy token";
  217. DbProjectBranches.PullRequestData pullRequestData = DbProjectBranches.PullRequestData.newBuilder()
  218. .setBranch(branch)
  219. .setTitle(title)
  220. .setUrl(url)
  221. .putAttributes(tokenAttributeName, tokenAttributeValue)
  222. .build();
  223. BranchDto dto = new BranchDto();
  224. dto.setProjectUuid(projectUuid);
  225. dto.setUuid(uuid);
  226. dto.setIsMain(false);
  227. dto.setBranchType(branchType);
  228. dto.setKey(kee);
  229. dto.setPullRequestData(pullRequestData);
  230. underTest.insert(dbSession, dto);
  231. BranchDto loaded = underTest.selectByUuid(dbSession, dto.getUuid()).get();
  232. assertThat(loaded.getProjectUuid()).isEqualTo(projectUuid);
  233. assertThat(loaded.getUuid()).isEqualTo(uuid);
  234. assertThat(loaded.getBranchType()).isEqualTo(branchType);
  235. assertThat(loaded.getKey()).isEqualTo(kee);
  236. assertThat(loaded.getMergeBranchUuid()).isNull();
  237. DbProjectBranches.PullRequestData loadedPullRequestData = loaded.getPullRequestData();
  238. assertThat(loadedPullRequestData).isNotNull();
  239. assertThat(loadedPullRequestData.getBranch()).isEqualTo(branch);
  240. assertThat(loadedPullRequestData.getTitle()).isEqualTo(title);
  241. assertThat(loadedPullRequestData.getUrl()).isEqualTo(url);
  242. assertThat(loadedPullRequestData.getAttributesMap()).containsEntry(tokenAttributeName, tokenAttributeValue);
  243. }
  244. @Test
  245. public void upsert_branch() {
  246. BranchDto dto = new BranchDto();
  247. dto.setProjectUuid("U1");
  248. dto.setUuid("U2");
  249. dto.setIsMain(false);
  250. dto.setBranchType(BranchType.BRANCH);
  251. dto.setKey("foo");
  252. underTest.insert(dbSession, dto);
  253. // the fields that can be updated
  254. dto.setMergeBranchUuid("U3");
  255. // the fields that can't be updated. New values are ignored.
  256. dto.setProjectUuid("ignored");
  257. dto.setBranchType(BranchType.BRANCH);
  258. underTest.upsert(dbSession, dto);
  259. BranchDto loaded = underTest.selectByBranchKey(dbSession, "U1", "foo").get();
  260. assertThat(loaded.getMergeBranchUuid()).isEqualTo("U3");
  261. assertThat(loaded.getProjectUuid()).isEqualTo("U1");
  262. assertThat(loaded.getBranchType()).isEqualTo(BranchType.BRANCH);
  263. }
  264. @Test
  265. public void upsert_pull_request() {
  266. BranchDto dto = new BranchDto();
  267. dto.setProjectUuid("U1");
  268. dto.setUuid("U2");
  269. dto.setBranchType(BranchType.PULL_REQUEST);
  270. dto.setKey("foo");
  271. dto.setIsMain(false);
  272. underTest.insert(dbSession, dto);
  273. // the fields that can be updated
  274. dto.setMergeBranchUuid("U3");
  275. String branch = "feature/pr1";
  276. String title = "Dummy Feature Title";
  277. String url = "http://example.com/pullRequests/pr1";
  278. String tokenAttributeName = "token";
  279. String tokenAttributeValue = "dummy token";
  280. DbProjectBranches.PullRequestData pullRequestData = DbProjectBranches.PullRequestData.newBuilder()
  281. .setBranch(branch)
  282. .setTitle(title)
  283. .setUrl(url)
  284. .putAttributes(tokenAttributeName, tokenAttributeValue)
  285. .build();
  286. dto.setPullRequestData(pullRequestData);
  287. // the fields that can't be updated. New values are ignored.
  288. dto.setProjectUuid("ignored");
  289. dto.setBranchType(BranchType.BRANCH);
  290. underTest.upsert(dbSession, dto);
  291. BranchDto loaded = underTest.selectByPullRequestKey(dbSession, "U1", "foo").get();
  292. assertThat(loaded.getMergeBranchUuid()).isEqualTo("U3");
  293. assertThat(loaded.getProjectUuid()).isEqualTo("U1");
  294. assertThat(loaded.getBranchType()).isEqualTo(BranchType.PULL_REQUEST);
  295. DbProjectBranches.PullRequestData loadedPullRequestData = loaded.getPullRequestData();
  296. assertThat(loadedPullRequestData).isNotNull();
  297. assertThat(loadedPullRequestData.getBranch()).isEqualTo(branch);
  298. assertThat(loadedPullRequestData.getTitle()).isEqualTo(title);
  299. assertThat(loadedPullRequestData.getUrl()).isEqualTo(url);
  300. assertThat(loadedPullRequestData.getAttributesMap()).containsEntry(tokenAttributeName, tokenAttributeValue);
  301. }
  302. @Test
  303. public void update_pull_request_data() {
  304. BranchDto dto = new BranchDto();
  305. dto.setProjectUuid("U1");
  306. dto.setUuid("U2");
  307. dto.setIsMain(false);
  308. dto.setBranchType(BranchType.PULL_REQUEST);
  309. dto.setKey("foo");
  310. // the fields that can be updated
  311. String mergeBranchUuid = "U3";
  312. dto.setMergeBranchUuid(mergeBranchUuid + "-dummy-suffix");
  313. String branch = "feature/pr1";
  314. String title = "Dummy Feature Title";
  315. String url = "http://example.com/pullRequests/pr1";
  316. String tokenAttributeName = "token";
  317. String tokenAttributeValue = "dummy token";
  318. DbProjectBranches.PullRequestData pullRequestData = DbProjectBranches.PullRequestData.newBuilder()
  319. .setBranch(branch + "-dummy-suffix")
  320. .setTitle(title + "-dummy-suffix")
  321. .setUrl(url + "-dummy-suffix")
  322. .putAttributes(tokenAttributeName, tokenAttributeValue + "-dummy-suffix")
  323. .build();
  324. dto.setPullRequestData(pullRequestData);
  325. underTest.insert(dbSession, dto);
  326. // modify pull request data
  327. dto.setMergeBranchUuid(mergeBranchUuid);
  328. pullRequestData = DbProjectBranches.PullRequestData.newBuilder()
  329. .setBranch(branch)
  330. .setTitle(title)
  331. .setUrl(url)
  332. .putAttributes(tokenAttributeName, tokenAttributeValue)
  333. .build();
  334. dto.setPullRequestData(pullRequestData);
  335. underTest.upsert(dbSession, dto);
  336. BranchDto loaded = underTest.selectByPullRequestKey(dbSession, "U1", "foo").get();
  337. assertThat(loaded.getMergeBranchUuid()).isEqualTo(mergeBranchUuid);
  338. assertThat(loaded.getProjectUuid()).isEqualTo("U1");
  339. assertThat(loaded.getBranchType()).isEqualTo(BranchType.PULL_REQUEST);
  340. DbProjectBranches.PullRequestData loadedPullRequestData = loaded.getPullRequestData();
  341. assertThat(loadedPullRequestData).isNotNull();
  342. assertThat(loadedPullRequestData.getBranch()).isEqualTo(branch);
  343. assertThat(loadedPullRequestData.getTitle()).isEqualTo(title);
  344. assertThat(loadedPullRequestData.getUrl()).isEqualTo(url);
  345. assertThat(loadedPullRequestData.getAttributesMap()).containsEntry(tokenAttributeName, tokenAttributeValue);
  346. }
  347. @Test
  348. public void selectByBranchKey() {
  349. BranchDto mainBranch = new BranchDto();
  350. mainBranch.setProjectUuid("U1");
  351. mainBranch.setUuid("U1");
  352. mainBranch.setIsMain(true);
  353. mainBranch.setBranchType(BranchType.BRANCH);
  354. mainBranch.setKey("master");
  355. underTest.insert(dbSession, mainBranch);
  356. BranchDto featureBranch = new BranchDto();
  357. featureBranch.setProjectUuid("U1");
  358. featureBranch.setUuid("U2");
  359. featureBranch.setIsMain(false);
  360. featureBranch.setBranchType(BranchType.BRANCH);
  361. featureBranch.setKey("feature/foo");
  362. featureBranch.setMergeBranchUuid("U3");
  363. underTest.insert(dbSession, featureBranch);
  364. // select the feature branch
  365. BranchDto loaded = underTest.selectByBranchKey(dbSession, "U1", "feature/foo").get();
  366. assertThat(loaded.getUuid()).isEqualTo(featureBranch.getUuid());
  367. assertThat(loaded.getKey()).isEqualTo(featureBranch.getKey());
  368. assertThat(loaded.isMain()).isFalse();
  369. assertThat(loaded.getProjectUuid()).isEqualTo(featureBranch.getProjectUuid());
  370. assertThat(loaded.getBranchType()).isEqualTo(featureBranch.getBranchType());
  371. assertThat(loaded.getMergeBranchUuid()).isEqualTo(featureBranch.getMergeBranchUuid());
  372. // select a branch on another project with same branch name
  373. assertThat(underTest.selectByBranchKey(dbSession, "U3", "feature/foo")).isEmpty();
  374. }
  375. @Test
  376. public void selectByBranchKeys() {
  377. ProjectDto project1 = db.components().insertPrivateProject().getProjectDto();
  378. ProjectDto project2 = db.components().insertPrivateProject().getProjectDto();
  379. ProjectDto project3 = db.components().insertPrivateProject().getProjectDto();
  380. BranchDto branch1 = db.components().insertProjectBranch(project1, b -> b.setKey("branch1"));
  381. BranchDto branch2 = db.components().insertProjectBranch(project2, b -> b.setKey("branch2"));
  382. BranchDto branch3 = db.components().insertProjectBranch(project3, b -> b.setKey("branch3"));
  383. Map<String, String> branchKeysByProjectUuid = new HashMap<>();
  384. branchKeysByProjectUuid.put(project1.getUuid(), "branch1");
  385. branchKeysByProjectUuid.put(project2.getUuid(), "branch2");
  386. branchKeysByProjectUuid.put(project3.getUuid(), "nonexisting");
  387. List<BranchDto> branchDtos = underTest.selectByBranchKeys(dbSession, branchKeysByProjectUuid);
  388. assertThat(branchDtos).hasSize(2);
  389. assertThat(branchDtos).extracting(BranchDto::getUuid).containsExactlyInAnyOrder(branch1.getUuid(), branch2.getUuid());
  390. }
  391. @Test
  392. public void selectByComponent() {
  393. BranchDto mainBranch = new BranchDto();
  394. mainBranch.setProjectUuid("U1");
  395. mainBranch.setUuid("U1");
  396. mainBranch.setIsMain(true);
  397. mainBranch.setBranchType(BranchType.BRANCH);
  398. mainBranch.setKey("master");
  399. underTest.insert(dbSession, mainBranch);
  400. BranchDto featureBranch = new BranchDto();
  401. featureBranch.setProjectUuid("U1");
  402. featureBranch.setUuid("U2");
  403. featureBranch.setIsMain(false);
  404. featureBranch.setBranchType(BranchType.BRANCH);
  405. featureBranch.setKey("feature/foo");
  406. featureBranch.setMergeBranchUuid("U3");
  407. underTest.insert(dbSession, featureBranch);
  408. ComponentDto component = new ComponentDto().setBranchUuid(mainBranch.getUuid());
  409. // select the component
  410. Collection<BranchDto> branches = underTest.selectByComponent(dbSession, component);
  411. assertThat(branches).hasSize(2);
  412. assertThat(branches).extracting(BranchDto::getUuid, BranchDto::getKey, BranchDto::isMain, BranchDto::getProjectUuid, BranchDto::getBranchType, BranchDto::getMergeBranchUuid)
  413. .containsOnly(tuple(mainBranch.getUuid(), mainBranch.getKey(), mainBranch.isMain(), mainBranch.getProjectUuid(), mainBranch.getBranchType(), mainBranch.getMergeBranchUuid()),
  414. tuple(featureBranch.getUuid(), featureBranch.getKey(), featureBranch.isMain(), featureBranch.getProjectUuid(), featureBranch.getBranchType(),
  415. featureBranch.getMergeBranchUuid()));
  416. }
  417. @Test
  418. public void
  419. selectByPullRequestKey() {
  420. BranchDto mainBranch = new BranchDto();
  421. mainBranch.setProjectUuid("U1");
  422. mainBranch.setUuid("U1");
  423. mainBranch.setBranchType(BranchType.BRANCH);
  424. mainBranch.setKey("master");
  425. mainBranch.setIsMain(true);
  426. underTest.insert(dbSession, mainBranch);
  427. String pullRequestId = "123";
  428. BranchDto pullRequest = new BranchDto();
  429. pullRequest.setIsMain(false);
  430. pullRequest.setProjectUuid("U1");
  431. pullRequest.setUuid("U2");
  432. pullRequest.setBranchType(BranchType.PULL_REQUEST);
  433. pullRequest.setKey(pullRequestId);
  434. pullRequest.setMergeBranchUuid("U3");
  435. underTest.insert(dbSession, pullRequest);
  436. // select the feature branch
  437. BranchDto loaded = underTest.selectByPullRequestKey(dbSession, "U1", pullRequestId).get();
  438. assertThat(loaded.getUuid()).isEqualTo(pullRequest.getUuid());
  439. assertThat(loaded.getKey()).isEqualTo(pullRequest.getKey());
  440. assertThat(loaded.getProjectUuid()).isEqualTo(pullRequest.getProjectUuid());
  441. assertThat(loaded.getBranchType()).isEqualTo(pullRequest.getBranchType());
  442. assertThat(loaded.getMergeBranchUuid()).isEqualTo(pullRequest.getMergeBranchUuid());
  443. // select a branch on another project with same branch name
  444. assertThat(underTest.selectByPullRequestKey(dbSession, "U3", pullRequestId)).isEmpty();
  445. }
  446. @Test
  447. public void selectByKeys() {
  448. BranchDto mainBranch = new BranchDto()
  449. .setProjectUuid("U1")
  450. .setUuid("U1")
  451. .setIsMain(true)
  452. .setBranchType(BranchType.BRANCH)
  453. .setKey("master");
  454. underTest.insert(dbSession, mainBranch);
  455. BranchDto featureBranch = new BranchDto()
  456. .setProjectUuid("U1")
  457. .setUuid("U2")
  458. .setIsMain(false)
  459. .setBranchType(BranchType.BRANCH)
  460. .setKey("feature1");
  461. underTest.insert(dbSession, featureBranch);
  462. String pullRequestId = "123";
  463. BranchDto pullRequest = new BranchDto()
  464. .setProjectUuid("U1")
  465. .setUuid("U3")
  466. .setIsMain(false)
  467. .setBranchType(BranchType.PULL_REQUEST)
  468. .setKey(pullRequestId)
  469. .setMergeBranchUuid("U4");
  470. underTest.insert(dbSession, pullRequest);
  471. assertThat(underTest.selectByKeys(dbSession, "U1", Collections.emptySet()))
  472. .isEmpty();
  473. List<BranchDto> loaded = underTest.selectByKeys(dbSession, "U1", Set.of(mainBranch.getKey(), featureBranch.getKey()));
  474. assertThat(loaded)
  475. .extracting(BranchDto::getUuid)
  476. .containsExactlyInAnyOrder(mainBranch.getUuid(), featureBranch.getUuid());
  477. }
  478. @Test
  479. public void selectByUuids() {
  480. ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
  481. ComponentDto branch1 = db.components().insertProjectBranch(project);
  482. ComponentDto branch2 = db.components().insertProjectBranch(project);
  483. ComponentDto branch3 = db.components().insertProjectBranch(project);
  484. assertThat(underTest.selectByUuids(db.getSession(), asList(branch1.uuid(), branch2.uuid(), branch3.uuid())))
  485. .extracting(BranchDto::getUuid)
  486. .containsExactlyInAnyOrder(branch1.uuid(), branch2.uuid(), branch3.uuid());
  487. assertThat(underTest.selectByUuids(db.getSession(), singletonList(branch1.uuid())))
  488. .extracting(BranchDto::getUuid)
  489. .containsExactlyInAnyOrder(branch1.uuid());
  490. assertThat(underTest.selectByUuids(db.getSession(), singletonList("unknown"))).isEmpty();
  491. }
  492. @Test
  493. public void selectByProjectUuid() {
  494. ProjectData projectData1 = db.components().insertPrivateProject();
  495. ComponentDto mainBranch1 = projectData1.getMainBranchComponent();
  496. ProjectData projectData2 = db.components().insertPrivateProject();
  497. ComponentDto mainBranch2 = projectData2.getMainBranchComponent();
  498. ComponentDto branch1 = db.components().insertProjectBranch(mainBranch1);
  499. ComponentDto branch2 = db.components().insertProjectBranch(mainBranch1);
  500. ComponentDto branch3 = db.components().insertProjectBranch(mainBranch2);
  501. ComponentDto branch4 = db.components().insertProjectBranch(mainBranch2);
  502. assertThat(underTest.selectByProject(dbSession, new ProjectDto().setUuid(projectData1.projectUuid())))
  503. .extracting(BranchDto::getUuid)
  504. .containsExactlyInAnyOrder(mainBranch1.uuid(), branch1.uuid(), branch2.uuid());
  505. assertThat(underTest.selectByProject(dbSession, new ProjectDto().setUuid(projectData2.projectUuid())))
  506. .extracting(BranchDto::getUuid)
  507. .containsExactlyInAnyOrder(mainBranch2.uuid(), branch3.uuid(), branch4.uuid());
  508. }
  509. @Test
  510. public void selectByUuid() {
  511. ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
  512. ComponentDto branch1 = db.components().insertProjectBranch(project);
  513. ComponentDto branch2 = db.components().insertProjectBranch(project);
  514. assertThat(underTest.selectByUuid(db.getSession(), branch1.uuid()).get())
  515. .extracting(BranchDto::getUuid)
  516. .isEqualTo(branch1.uuid());
  517. assertThat(underTest.selectByUuid(db.getSession(), project.uuid())).isPresent();
  518. assertThat(underTest.selectByUuid(db.getSession(), "unknown")).isNotPresent();
  519. }
  520. @Test
  521. public void countPrAndBranchByProjectUuid() {
  522. ProjectData projectData1 = db.components().insertPrivateProject();
  523. ComponentDto project1 = projectData1.getMainBranchComponent();
  524. db.components().insertProjectBranch(project1, b -> b.setBranchType(BRANCH).setKey("p1-branch-1"));
  525. db.components().insertProjectBranch(project1, b -> b.setBranchType(BRANCH).setKey("p1-branch-2"));
  526. db.components().insertProjectBranch(project1, b -> b.setBranchType(PULL_REQUEST).setKey("p1-pr-1"));
  527. db.components().insertProjectBranch(project1, b -> b.setBranchType(PULL_REQUEST).setKey("p1-pr-2"));
  528. db.components().insertProjectBranch(project1, b -> b.setBranchType(PULL_REQUEST).setKey("p1-pr-3"));
  529. ProjectData projectData2 = db.components().insertPrivateProject();
  530. ComponentDto project2 = projectData2.getMainBranchComponent();
  531. db.components().insertProjectBranch(project2, b -> b.setBranchType(PULL_REQUEST).setKey("p2-pr-1"));
  532. ProjectData projectData3 = db.components().insertPrivateProject();
  533. ComponentDto project3 = projectData3.getMainBranchComponent();
  534. db.components().insertProjectBranch(project3, b -> b.setBranchType(BRANCH).setKey("p3-branch-1"));
  535. MetricDto unanalyzedC = db.measures().insertMetric(m -> m.setKey("unanalyzed_c"));
  536. MetricDto unanalyzedCpp = db.measures().insertMetric(m -> m.setKey("unanalyzed_cpp"));
  537. db.measures().insertLiveMeasure(project1, unanalyzedC);
  538. db.measures().insertLiveMeasure(project1, unanalyzedCpp);
  539. db.measures().insertLiveMeasure(project2, unanalyzedCpp);
  540. db.measures().insertLiveMeasure(project3, unanalyzedC);
  541. assertThat(underTest.countPrBranchAnalyzedLanguageByProjectUuid(db.getSession()))
  542. .extracting(PrBranchAnalyzedLanguageCountByProjectDto::getProjectUuid, PrBranchAnalyzedLanguageCountByProjectDto::getBranch,
  543. PrBranchAnalyzedLanguageCountByProjectDto::getPullRequest)
  544. .containsExactlyInAnyOrder(
  545. tuple(projectData1.projectUuid(), 3L, 3L),
  546. tuple(projectData2.projectUuid(), 1L, 1L),
  547. tuple(projectData3.projectUuid(), 2L, 0L)
  548. );
  549. }
  550. @Test
  551. public void selectProjectUuidsWithIssuesNeedSync() {
  552. ComponentDto project1 = db.components().insertPrivateProject().getMainBranchComponent();
  553. ComponentDto project2 = db.components().insertPrivateProject().getMainBranchComponent();
  554. ComponentDto project3 = db.components().insertPrivateProject().getMainBranchComponent();
  555. ComponentDto project4 = db.components().insertPrivateProject().getMainBranchComponent();
  556. ProjectDto project1Dto = db.components().getProjectDtoByMainBranch(project1);
  557. ProjectDto project2Dto = db.components().getProjectDtoByMainBranch(project2);
  558. ProjectDto project3Dto = db.components().getProjectDtoByMainBranch(project3);
  559. ProjectDto project4Dto = db.components().getProjectDtoByMainBranch(project4);
  560. BranchDto branch1 = db.components().insertProjectBranch(project1Dto, branchDto -> branchDto.setNeedIssueSync(true));
  561. BranchDto branch2 = db.components().insertProjectBranch(project1Dto, branchDto -> branchDto.setNeedIssueSync(false));
  562. BranchDto branch3 = db.components().insertProjectBranch(project2Dto);
  563. assertThat(underTest.selectProjectUuidsWithIssuesNeedSync(db.getSession(),
  564. Sets.newHashSet(project1Dto.getUuid(), project2Dto.getUuid(), project3Dto.getUuid(), project4Dto.getUuid())))
  565. .containsOnly(project1Dto.getUuid());
  566. }
  567. @Test
  568. public void hasAnyBranchWhereNeedIssueSync() {
  569. assertThat(underTest.hasAnyBranchWhereNeedIssueSync(dbSession, true)).isFalse();
  570. assertThat(underTest.hasAnyBranchWhereNeedIssueSync(dbSession, false)).isFalse();
  571. ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
  572. ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setNeedIssueSync(false));
  573. assertThat(underTest.hasAnyBranchWhereNeedIssueSync(dbSession, true)).isFalse();
  574. assertThat(underTest.hasAnyBranchWhereNeedIssueSync(dbSession, false)).isTrue();
  575. project = db.components().insertPrivateProject().getMainBranchComponent();
  576. branch = db.components().insertProjectBranch(project, b -> b.setNeedIssueSync(true));
  577. assertThat(underTest.hasAnyBranchWhereNeedIssueSync(dbSession, true)).isTrue();
  578. }
  579. @Test
  580. public void countByTypeAndCreationDate() {
  581. assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.BRANCH, 0L)).isZero();
  582. ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
  583. ComponentDto branch1 = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH));
  584. ComponentDto branch2 = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH));
  585. ComponentDto pr = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST));
  586. assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.BRANCH, 0L)).isEqualTo(3);
  587. assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.BRANCH, NOW)).isEqualTo(3);
  588. assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.BRANCH, NOW + 100)).isZero();
  589. assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.PULL_REQUEST, 0L)).isOne();
  590. assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.PULL_REQUEST, NOW)).isOne();
  591. assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.PULL_REQUEST, NOW + 100)).isZero();
  592. }
  593. @Test
  594. public void countByNeedIssueSync() {
  595. assertThat(underTest.countByNeedIssueSync(dbSession, true)).isZero();
  596. assertThat(underTest.countByNeedIssueSync(dbSession, false)).isZero();
  597. // master branch with flag set to false
  598. ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
  599. // branches & PRs
  600. db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(true));
  601. db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(true));
  602. db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(false));
  603. db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(false));
  604. db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST).setNeedIssueSync(true));
  605. db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST).setNeedIssueSync(false));
  606. db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST).setNeedIssueSync(true));
  607. assertThat(underTest.countByNeedIssueSync(dbSession, true)).isEqualTo(4);
  608. assertThat(underTest.countByNeedIssueSync(dbSession, false)).isEqualTo(4);
  609. }
  610. @Test
  611. public void countAll() {
  612. assertThat(underTest.countAll(dbSession)).isZero();
  613. ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
  614. db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(true));
  615. db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(true));
  616. db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(false));
  617. db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(false));
  618. db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST).setNeedIssueSync(true));
  619. db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST).setNeedIssueSync(false));
  620. db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST).setNeedIssueSync(true));
  621. assertThat(underTest.countAll(dbSession)).isEqualTo(8);
  622. }
  623. @Test
  624. public void selectBranchNeedingIssueSync() {
  625. ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
  626. String uuid = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(true)).uuid();
  627. db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(false));
  628. assertThat(underTest.selectBranchNeedingIssueSync(dbSession))
  629. .extracting(BranchDto::getUuid)
  630. .containsExactly(uuid);
  631. }
  632. @Test
  633. public void selectBranchNeedingIssueSyncForProject() {
  634. ProjectData projectData = db.components().insertPrivateProject();
  635. ComponentDto mainBranch = projectData.getMainBranchComponent();
  636. String uuid = db.components().insertProjectBranch(mainBranch, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(true)).uuid();
  637. db.components().insertProjectBranch(mainBranch, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(false));
  638. assertThat(underTest.selectBranchNeedingIssueSyncForProject(dbSession, projectData.projectUuid()))
  639. .extracting(BranchDto::getUuid)
  640. .containsExactly(uuid);
  641. }
  642. @Test
  643. public void updateAllNeedIssueSync() {
  644. ProjectData projectData = db.components().insertPrivateProject();
  645. ComponentDto mainBranch = projectData.getMainBranchComponent();
  646. String uuid1 = db.components().insertProjectBranch(mainBranch, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(true)).uuid();
  647. String uuid2 = db.components().insertProjectBranch(mainBranch, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(false)).uuid();
  648. underTest.updateAllNeedIssueSync(dbSession);
  649. Optional<BranchDto> project1 = underTest.selectByUuid(dbSession, uuid1);
  650. assertThat(project1).isPresent();
  651. assertThat(project1.get().isNeedIssueSync()).isTrue();
  652. Optional<BranchDto> project2 = underTest.selectByUuid(dbSession, uuid2);
  653. assertThat(project2).isPresent();
  654. assertThat(project2.get().isNeedIssueSync()).isTrue();
  655. }
  656. @Test
  657. public void updateAllNeedIssueSyncForProject() {
  658. ProjectData projectData = db.components().insertPrivateProject();
  659. ComponentDto mainBranch = projectData.getMainBranchComponent();
  660. String uuid1 = db.components().insertProjectBranch(mainBranch, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(true)).uuid();
  661. String uuid2 = db.components().insertProjectBranch(mainBranch, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(false)).uuid();
  662. underTest.updateAllNeedIssueSyncForProject(dbSession, projectData.projectUuid());
  663. Optional<BranchDto> project1 = underTest.selectByUuid(dbSession, uuid1);
  664. assertThat(project1).isPresent();
  665. assertThat(project1.get().isNeedIssueSync()).isTrue();
  666. Optional<BranchDto> project2 = underTest.selectByUuid(dbSession, uuid2);
  667. assertThat(project2).isPresent();
  668. assertThat(project2.get().isNeedIssueSync()).isTrue();
  669. }
  670. @Test
  671. public void updateNeedIssueSync() {
  672. ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
  673. String uuid1 = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(false)).uuid();
  674. String uuid2 = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(true)).uuid();
  675. underTest.updateNeedIssueSync(dbSession, uuid1, true);
  676. underTest.updateNeedIssueSync(dbSession, uuid2, false);
  677. Optional<BranchDto> project1 = underTest.selectByUuid(dbSession, uuid1);
  678. assertThat(project1).isPresent();
  679. assertThat(project1.get().isNeedIssueSync()).isTrue();
  680. Optional<BranchDto> project2 = underTest.selectByUuid(dbSession, uuid2);
  681. assertThat(project2).isPresent();
  682. assertThat(project2.get().isNeedIssueSync()).isFalse();
  683. }
  684. @Test
  685. public void doAnyOfComponentsNeedIssueSync() {
  686. assertThat(underTest.doAnyOfComponentsNeedIssueSync(dbSession, emptyList())).isFalse();
  687. ProjectData projectData1 = db.components().insertPrivateProject();
  688. ComponentDto project1 = projectData1.getMainBranchComponent();
  689. ProjectData projectData2 = db.components().insertPrivateProject();
  690. ComponentDto project2 = projectData2.getMainBranchComponent();
  691. db.components().insertProjectBranch(projectData1.getProjectDto(), b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(true));
  692. BranchDto projectBranch1 = db.components().insertProjectBranch(projectData1.getProjectDto(), b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(true));
  693. BranchDto projectBranch2 = db.components().insertProjectBranch(projectData1.getProjectDto(), b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(false));
  694. db.components().insertProjectBranch(projectData1.getProjectDto(), b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(false));
  695. BranchDto pullRequest1 = db.components().insertProjectBranch(projectData1.getProjectDto(), b -> b.setBranchType(BranchType.PULL_REQUEST).setNeedIssueSync(true));
  696. BranchDto pullRequest2 = db.components().insertProjectBranch(projectData1.getProjectDto(), b -> b.setBranchType(BranchType.PULL_REQUEST).setNeedIssueSync(false));
  697. db.components().insertProjectBranch(projectData1.getProjectDto(), b -> b.setBranchType(BranchType.PULL_REQUEST).setNeedIssueSync(true));
  698. assertThat(underTest.doAnyOfComponentsNeedIssueSync(dbSession, singletonList(projectData1.projectKey()))).isTrue();
  699. assertThat(underTest.doAnyOfComponentsNeedIssueSync(dbSession, singletonList(projectData2.projectKey()))).isFalse();
  700. }
  701. @Test
  702. public void doAnyOfComponentsNeedIssueSync_test_more_than_1000() {
  703. List<String> componentKeys = IntStream.range(0, 1100).mapToObj(value -> db.components().insertPrivateProject().getMainBranchComponent())
  704. .map(ComponentDto::getKey)
  705. .collect(Collectors.toCollection(ArrayList::new));
  706. assertThat(underTest.doAnyOfComponentsNeedIssueSync(dbSession, componentKeys)).isFalse();
  707. ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
  708. ProjectDto projectDto = db.components().getProjectDtoByMainBranch(project);
  709. db.components().insertProjectBranch(projectDto, b -> b.setBranchType(BranchType.BRANCH).setNeedIssueSync(true));
  710. componentKeys.add(project.getKey());
  711. assertThat(underTest.doAnyOfComponentsNeedIssueSync(dbSession, componentKeys)).isTrue();
  712. }
  713. @DataProvider
  714. public static Object[][] booleanValues() {
  715. return new Object[][] {
  716. {true},
  717. {false}
  718. };
  719. }
  720. @Test
  721. @UseDataProvider("booleanValues")
  722. public void isBranchNeedIssueSync_shouldReturnCorrectValue(boolean needIssueSync) {
  723. ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
  724. String branchUuid = db.components().insertProjectBranch(project, branch -> branch.setBranchType(BranchType.BRANCH).setNeedIssueSync(needIssueSync)).uuid();
  725. assertThat(underTest.isBranchNeedIssueSync(dbSession, branchUuid)).isEqualTo(needIssueSync);
  726. }
  727. @Test
  728. public void isBranchNeedIssueSync_whenNoBranch_shouldReturnFalse() {
  729. assertThat(underTest.isBranchNeedIssueSync(dbSession, "unknown")).isFalse();
  730. }
  731. @Test
  732. public void selectMainBranchByProjectUuid_whenMainBranch_shouldReturnMainBranch() {
  733. BranchDto dto = new BranchDto();
  734. dto.setProjectUuid("U1");
  735. dto.setUuid("U1");
  736. dto.setIsMain(true);
  737. dto.setBranchType(BranchType.BRANCH);
  738. dto.setKey("feature");
  739. underTest.insert(dbSession, dto);
  740. assertThat(underTest.selectMainBranchByProjectUuid(dbSession, "U1")).get()
  741. .extracting(e -> e.getUuid()).isEqualTo("U1");
  742. }
  743. @Test
  744. public void selectMainBranchByProjectUuid_whenNonMainBranch_shouldReturnEmpty() {
  745. BranchDto dto = new BranchDto();
  746. dto.setProjectUuid("U1");
  747. dto.setUuid("U2");
  748. dto.setIsMain(false);
  749. dto.setBranchType(BranchType.BRANCH);
  750. dto.setKey("feature");
  751. underTest.insert(dbSession, dto);
  752. assertThat(underTest.selectMainBranchByProjectUuid(dbSession, "U1")).isEmpty();
  753. }
  754. @Test
  755. public void selectMainBranchesByProjectUuids_whenNoUuidsPassed_shouldReturnEmpty() {
  756. insertBranchesForProjectUuids(true, "1");
  757. List<BranchDto> branchDtos = underTest.selectMainBranchesByProjectUuids(dbSession, Set.of());
  758. assertThat(branchDtos).isEmpty();
  759. }
  760. @Test
  761. public void selectMainBranchesByProjectUuids_whenOneUuidPassedAndTwoBranchesInDatabase_shouldReturnOneBranch() {
  762. insertBranchesForProjectUuids(true, "1", "2");
  763. List<BranchDto> branchDtos = underTest.selectMainBranchesByProjectUuids(dbSession, Set.of("1"));
  764. assertThat(branchDtos).hasSize(1);
  765. assertThat(branchDtos).extracting(BranchDto::getProjectUuid).allMatch(s -> s.equals("1"));
  766. }
  767. @Test
  768. public void selectMainBranchesByProjectUuids_whenTenUuidsPassedAndTenBranchesInDatabase_shouldReturnAllBranches() {
  769. String[] projectUuids = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"};
  770. insertBranchesForProjectUuids(true, projectUuids);
  771. insertBranchesForProjectUuids(false, projectUuids);
  772. List<BranchDto> branchDtos = underTest.selectMainBranchesByProjectUuids(dbSession, Set.of(projectUuids));
  773. assertThat(branchDtos).hasSize(10);
  774. assertThat(branchDtos).extracting(BranchDto::isMain).allMatch(b -> true);
  775. }
  776. private void insertBranchesForProjectUuids(boolean mainBranch, String... uuids) {
  777. for (String uuid : uuids) {
  778. BranchDto dto = new BranchDto();
  779. dto.setProjectUuid(uuid);
  780. dto.setUuid(uuid + "-uuid" + mainBranch);
  781. dto.setIsMain(mainBranch);
  782. dto.setBranchType(BranchType.BRANCH);
  783. dto.setKey("feature-" + uuid + mainBranch);
  784. underTest.insert(dbSession, dto);
  785. }
  786. }
  787. }