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.

GroupDaoTest.java 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2020 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.user;
  21. import java.util.Collections;
  22. import java.util.Date;
  23. import java.util.List;
  24. import java.util.Optional;
  25. import org.junit.Before;
  26. import org.junit.Rule;
  27. import org.junit.Test;
  28. import org.sonar.api.utils.System2;
  29. import org.sonar.db.DbSession;
  30. import org.sonar.db.DbTester;
  31. import static java.util.Arrays.asList;
  32. import static org.assertj.core.api.Assertions.assertThat;
  33. import static org.mockito.Mockito.mock;
  34. import static org.mockito.Mockito.when;
  35. import static org.sonar.db.user.GroupTesting.newGroupDto;
  36. public class GroupDaoTest {
  37. private static final long NOW = 1_500_000L;
  38. private static final String MISSING_UUID = "unknown";
  39. private System2 system2 = mock(System2.class);
  40. @Rule
  41. public DbTester db = DbTester.create(system2);
  42. private DbSession dbSession = db.getSession();
  43. private GroupDao underTest = db.getDbClient().groupDao();
  44. // not static as group uuid is changed in each test
  45. private final GroupDto aGroup = new GroupDto()
  46. .setUuid("uuid")
  47. .setName("the-name")
  48. .setDescription("the description");
  49. @Before
  50. public void setUp() {
  51. when(system2.now()).thenReturn(NOW);
  52. }
  53. @Test
  54. public void selectByName() {
  55. db.getDbClient().groupDao().insert(dbSession, aGroup);
  56. GroupDto group = underTest.selectByName(dbSession, aGroup.getName()).get();
  57. assertThat(group.getUuid()).isNotNull();
  58. assertThat(group.getName()).isEqualTo(aGroup.getName());
  59. assertThat(group.getDescription()).isEqualTo(aGroup.getDescription());
  60. assertThat(group.getCreatedAt()).isEqualTo(new Date(NOW));
  61. assertThat(group.getUpdatedAt()).isEqualTo(new Date(NOW));
  62. }
  63. @Test
  64. public void selectByName_returns_absent() {
  65. Optional<GroupDto> group = underTest.selectByName(dbSession, "missing");
  66. assertThat(group).isNotPresent();
  67. }
  68. @Test
  69. public void selectByUserLogin() {
  70. GroupDto group1 = db.users().insertGroup();
  71. GroupDto group2 = db.users().insertGroup();
  72. GroupDto group3 = db.users().insertGroup();
  73. UserDto user = db.users().insertUser();
  74. db.users().insertMember(group1, user);
  75. db.users().insertMember(group2, user);
  76. assertThat(underTest.selectByUserLogin(dbSession, user.getLogin())).hasSize(2);
  77. assertThat(underTest.selectByUserLogin(dbSession, "unknown")).isEmpty();
  78. }
  79. @Test
  80. public void selectByNames() {
  81. GroupDto group1 = underTest.insert(dbSession, newGroupDto().setName("group1"));
  82. GroupDto group2 = underTest.insert(dbSession, newGroupDto().setName("group2"));
  83. dbSession.commit();
  84. assertThat(underTest.selectByNames(dbSession, asList("group1", "group2", "group3", "missingGroup"))).extracting(GroupDto::getUuid)
  85. .containsOnly(group1.getUuid(), group2.getUuid());
  86. assertThat(underTest.selectByNames(dbSession, Collections.emptyList())).isEmpty();
  87. }
  88. @Test
  89. public void selectByUuids() {
  90. GroupDto group1 = db.users().insertGroup();
  91. GroupDto group2 = db.users().insertGroup();
  92. GroupDto group3 = db.users().insertGroup();
  93. assertThat(underTest.selectByUuids(dbSession, asList(group1.getUuid(), group2.getUuid())))
  94. .extracting(GroupDto::getUuid).containsOnly(group1.getUuid(), group2.getUuid());
  95. assertThat(underTest.selectByUuids(dbSession, asList(group1.getUuid(), MISSING_UUID)))
  96. .extracting(GroupDto::getUuid).containsOnly(group1.getUuid());
  97. assertThat(underTest.selectByUuids(dbSession, Collections.emptyList())).isEmpty();
  98. }
  99. @Test
  100. public void update() {
  101. db.getDbClient().groupDao().insert(dbSession, aGroup);
  102. GroupDto dto = new GroupDto()
  103. .setUuid(aGroup.getUuid())
  104. .setName("new-name")
  105. .setDescription("New description")
  106. .setCreatedAt(new Date(NOW + 1_000L));
  107. underTest.update(dbSession, dto);
  108. GroupDto reloaded = underTest.selectByUuid(dbSession, aGroup.getUuid());
  109. // verify mutable fields
  110. assertThat(reloaded.getName()).isEqualTo("new-name");
  111. assertThat(reloaded.getDescription()).isEqualTo("New description");
  112. // immutable fields --> to be ignored
  113. assertThat(reloaded.getCreatedAt()).isEqualTo(aGroup.getCreatedAt());
  114. }
  115. @Test
  116. public void selectByQuery() {
  117. db.users().insertGroup("sonar-users");
  118. db.users().insertGroup("SONAR-ADMINS");
  119. db.users().insertGroup("customers-group1");
  120. db.users().insertGroup("customers-group2");
  121. db.users().insertGroup("customers-group3");
  122. /*
  123. * Ordering and paging are not fully tested, case insensitive sort is broken on MySQL
  124. */
  125. // Null query
  126. assertThat(underTest.selectByQuery(dbSession, null, 0, 10))
  127. .hasSize(5)
  128. .extracting("name").containsOnly("customers-group1", "customers-group2", "customers-group3", "SONAR-ADMINS", "sonar-users");
  129. // Empty query
  130. assertThat(underTest.selectByQuery(dbSession, "", 0, 10))
  131. .hasSize(5)
  132. .extracting("name").containsOnly("customers-group1", "customers-group2", "customers-group3", "SONAR-ADMINS", "sonar-users");
  133. // Filter on name
  134. assertThat(underTest.selectByQuery(dbSession, "sonar", 0, 10))
  135. .hasSize(2)
  136. .extracting("name").containsOnly("SONAR-ADMINS", "sonar-users");
  137. // Pagination
  138. assertThat(underTest.selectByQuery(dbSession, null, 0, 3))
  139. .hasSize(3);
  140. assertThat(underTest.selectByQuery(dbSession, null, 3, 3))
  141. .hasSize(2);
  142. assertThat(underTest.selectByQuery(dbSession, null, 6, 3)).isEmpty();
  143. assertThat(underTest.selectByQuery(dbSession, null, 0, 5))
  144. .hasSize(5);
  145. assertThat(underTest.selectByQuery(dbSession, null, 5, 5)).isEmpty();
  146. }
  147. @Test
  148. public void select_by_query_with_special_characters() {
  149. String groupNameWithSpecialCharacters = "group%_%/name";
  150. underTest.insert(dbSession, newGroupDto().setName(groupNameWithSpecialCharacters));
  151. db.commit();
  152. List<GroupDto> result = underTest.selectByQuery(dbSession, "roup%_%/nam", 0, 10);
  153. int resultCount = underTest.countByQuery(dbSession, "roup%_%/nam");
  154. assertThat(result).hasSize(1);
  155. assertThat(result.get(0).getName()).isEqualTo(groupNameWithSpecialCharacters);
  156. assertThat(resultCount).isEqualTo(1);
  157. }
  158. @Test
  159. public void countByQuery() {
  160. db.users().insertGroup("sonar-users");
  161. db.users().insertGroup("SONAR-ADMINS");
  162. db.users().insertGroup("customers-group1");
  163. db.users().insertGroup("customers-group2");
  164. db.users().insertGroup("customers-group3");
  165. // Null query
  166. assertThat(underTest.countByQuery(dbSession, null)).isEqualTo(5);
  167. // Empty query
  168. assertThat(underTest.countByQuery(dbSession, "")).isEqualTo(5);
  169. // Filter on name
  170. assertThat(underTest.countByQuery(dbSession, "sonar")).isEqualTo(2);
  171. }
  172. @Test
  173. public void deleteByUuid() {
  174. db.getDbClient().groupDao().insert(dbSession, aGroup);
  175. underTest.deleteByUuid(dbSession, aGroup.getUuid());
  176. assertThat(db.countRowsOfTable(dbSession, "groups")).isEqualTo(0);
  177. }
  178. }