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.

UserDaoTest.java 31KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2019 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.ArrayList;
  22. import java.util.Collection;
  23. import java.util.Collections;
  24. import java.util.List;
  25. import org.junit.Rule;
  26. import org.junit.Test;
  27. import org.sonar.api.user.UserQuery;
  28. import org.sonar.api.utils.DateUtils;
  29. import org.sonar.api.impl.utils.TestSystem2;
  30. import org.sonar.db.DatabaseUtils;
  31. import org.sonar.db.DbClient;
  32. import org.sonar.db.DbSession;
  33. import org.sonar.db.DbTester;
  34. import org.sonar.db.component.ComponentDto;
  35. import org.sonar.db.organization.OrganizationDto;
  36. import static java.util.Arrays.asList;
  37. import static java.util.Collections.emptyList;
  38. import static java.util.Collections.singletonList;
  39. import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric;
  40. import static org.assertj.core.api.Assertions.assertThat;
  41. import static org.assertj.core.groups.Tuple.tuple;
  42. import static org.sonar.db.user.GroupTesting.newGroupDto;
  43. import static org.sonar.db.user.UserTesting.newUserDto;
  44. public class UserDaoTest {
  45. private static final long NOW = 1_500_000_000_000L;
  46. private TestSystem2 system2 = new TestSystem2().setNow(NOW);
  47. @Rule
  48. public DbTester db = DbTester.create(system2);
  49. private DbClient dbClient = db.getDbClient();
  50. private DbSession session = db.getSession();
  51. private UserDao underTest = db.getDbClient().userDao();
  52. @Test
  53. public void selectByUuid() {
  54. UserDto user1 = db.users().insertUser();
  55. UserDto user2 = db.users().insertUser(user -> user.setActive(false));
  56. assertThat(underTest.selectByUuid(session, user1.getUuid())).isNotNull();
  57. assertThat(underTest.selectByUuid(session, user2.getUuid())).isNotNull();
  58. assertThat(underTest.selectByUuid(session, "unknown")).isNull();
  59. }
  60. @Test
  61. public void selectUsersIds() {
  62. UserDto user1 = db.users().insertUser(user -> user.setLogin("user1"));
  63. UserDto user2 = db.users().insertUser(user -> user.setLogin("user2"));
  64. UserDto user3 = db.users().insertUser(user -> user.setLogin("inactive_user").setActive(false));
  65. assertThat(underTest.selectByIds(session, asList(user1.getId(), user2.getId(), user3.getId(), 1_000))).extracting("login")
  66. .containsExactlyInAnyOrder("user1", "user2", "inactive_user");
  67. assertThat(underTest.selectByIds(session, emptyList())).isEmpty();
  68. }
  69. @Test
  70. public void selectUserByLogin_ignore_inactive() {
  71. db.users().insertUser(user -> user.setLogin("user1"));
  72. db.users().insertUser(user -> user.setLogin("user2"));
  73. db.users().insertUser(user -> user.setLogin("inactive_user").setActive(false));
  74. UserDto user = underTest.selectActiveUserByLogin(session, "inactive_user");
  75. assertThat(user).isNull();
  76. }
  77. @Test
  78. public void selectUserByLogin_not_found() {
  79. db.users().insertUser(user -> user.setLogin("user"));
  80. UserDto user = underTest.selectActiveUserByLogin(session, "not_found");
  81. assertThat(user).isNull();
  82. }
  83. @Test
  84. public void selectUsersByLogins() {
  85. db.users().insertUser(user -> user.setLogin("user1"));
  86. db.users().insertUser(user -> user.setLogin("user2"));
  87. db.users().insertUser(user -> user.setLogin("inactive_user").setActive(false));
  88. Collection<UserDto> users = underTest.selectByLogins(session, asList("user1", "inactive_user", "other"));
  89. assertThat(users).extracting("login").containsExactlyInAnyOrder("user1", "inactive_user");
  90. }
  91. @Test
  92. public void selectUsersByUuids() {
  93. UserDto user1 = db.users().insertUser();
  94. UserDto user2 = db.users().insertUser();
  95. UserDto user3 = db.users().insertUser(user -> user.setActive(false));
  96. assertThat((Collection<UserDto>) underTest.selectByUuids(session, asList(user1.getUuid(), user2.getUuid(), user3.getUuid()))).hasSize(3);
  97. assertThat((Collection<UserDto>) underTest.selectByUuids(session, asList(user1.getUuid(), "unknown"))).hasSize(1);
  98. assertThat((Collection<UserDto>) underTest.selectByUuids(session, Collections.emptyList())).isEmpty();
  99. }
  100. @Test
  101. public void selectUsersByLogins_empty_logins() {
  102. // no need to access db
  103. Collection<UserDto> users = underTest.selectByLogins(session, emptyList());
  104. assertThat(users).isEmpty();
  105. }
  106. @Test
  107. public void selectByOrderedLogins() {
  108. db.users().insertUser(user -> user.setLogin("U1"));
  109. db.users().insertUser(user -> user.setLogin("U2"));
  110. Iterable<UserDto> users = underTest.selectByOrderedLogins(session, asList("U1", "U2", "U3"));
  111. assertThat(users).extracting("login").containsExactly("U1", "U2");
  112. users = underTest.selectByOrderedLogins(session, asList("U2", "U3", "U1"));
  113. assertThat(users).extracting("login").containsExactly("U2", "U1");
  114. assertThat(underTest.selectByOrderedLogins(session, emptyList())).isEmpty();
  115. }
  116. @Test
  117. public void selectUsersByQuery_all() {
  118. db.users().insertUser(user -> user.setLogin("user").setName("User"));
  119. db.users().insertUser(user -> user.setLogin("inactive_user").setName("Disabled").setActive(false));
  120. List<UserDto> users = underTest.selectUsers(session, UserQuery.builder().includeDeactivated().build());
  121. assertThat(users).hasSize(2);
  122. }
  123. @Test
  124. public void selectUsersByQuery_only_actives() {
  125. db.users().insertUser(user -> user.setLogin("user").setName("User"));
  126. db.users().insertUser(user -> user.setLogin("inactive_user").setName("Disabled").setActive(false));
  127. List<UserDto> users = underTest.selectUsers(session, UserQuery.ALL_ACTIVES);
  128. assertThat(users).extracting(UserDto::getName).containsExactlyInAnyOrder("User");
  129. }
  130. @Test
  131. public void selectUsersByQuery_filter_by_login() {
  132. db.users().insertUser(user -> user.setLogin("user").setName("User"));
  133. db.users().insertUser(user -> user.setLogin("inactive_user").setName("Disabled").setActive(false));
  134. List<UserDto> users = underTest.selectUsers(session, UserQuery.builder().logins("user", "john").build());
  135. assertThat(users).extracting(UserDto::getName).containsExactlyInAnyOrder("User");
  136. }
  137. @Test
  138. public void selectUsersByQuery_search_by_login_text() {
  139. db.users().insertUser(user -> user.setLogin("user").setName("User"));
  140. db.users().insertUser(user -> user.setLogin("sbrandhof").setName("Simon Brandhof"));
  141. List<UserDto> users = underTest.selectUsers(session, UserQuery.builder().searchText("sbr").build());
  142. assertThat(users).extracting(UserDto::getLogin).containsExactlyInAnyOrder("sbrandhof");
  143. }
  144. @Test
  145. public void selectUsersByQuery_search_by_name_text() {
  146. db.users().insertUser(user -> user.setLogin("user").setName("User"));
  147. db.users().insertUser(user -> user.setLogin("sbrandhof").setName("Simon Brandhof"));
  148. List<UserDto> users = underTest.selectUsers(session, UserQuery.builder().searchText("Simon").build());
  149. assertThat(users).extracting(UserDto::getLogin).containsExactlyInAnyOrder("sbrandhof");
  150. }
  151. @Test
  152. public void selectUsersByQuery_escape_special_characters_in_like() {
  153. db.users().insertUser(user -> user.setLogin("user").setName("User"));
  154. db.users().insertUser(user -> user.setLogin("sbrandhof").setName("Simon Brandhof"));
  155. UserQuery query = UserQuery.builder().searchText("%s%").build();
  156. // we expect really a login or name containing the 3 characters "%s%"
  157. List<UserDto> users = underTest.selectUsers(session, query);
  158. assertThat(users).isEmpty();
  159. }
  160. @Test
  161. public void selectUsers_returns_both_only_root_or_only_non_root_depending_on_mustBeRoot_and_mustNotBeRoot_calls_on_query() {
  162. UserDto user1 = insertUser(true);
  163. UserDto root1 = insertRootUser(newUserDto());
  164. UserDto user2 = insertUser(true);
  165. UserDto root2 = insertRootUser(newUserDto());
  166. assertThat(underTest.selectUsers(session, UserQuery.builder().build()))
  167. .extracting(UserDto::getLogin)
  168. .containsOnly(user1.getLogin(), user2.getLogin(), root1.getLogin(), root2.getLogin());
  169. assertThat(underTest.selectUsers(session, UserQuery.builder().mustBeRoot().build()))
  170. .extracting(UserDto::getLogin)
  171. .containsOnly(root1.getLogin(), root2.getLogin());
  172. assertThat(underTest.selectUsers(session, UserQuery.builder().mustNotBeRoot().build()))
  173. .extracting(UserDto::getLogin)
  174. .containsOnly(user1.getLogin(), user2.getLogin());
  175. }
  176. @Test
  177. public void countRootUsersButLogin_returns_0_when_there_is_no_user_at_all() {
  178. assertThat(underTest.countRootUsersButLogin(session, "bla")).isEqualTo(0);
  179. }
  180. @Test
  181. public void countRootUsersButLogin_returns_0_when_there_is_no_root() {
  182. underTest.insert(session, newUserDto());
  183. session.commit();
  184. assertThat(underTest.countRootUsersButLogin(session, "bla")).isEqualTo(0);
  185. }
  186. @Test
  187. public void countRootUsersButLogin_returns_0_when_there_is_no_active_root() {
  188. insertNonRootUser(newUserDto());
  189. insertInactiveRootUser(newUserDto());
  190. session.commit();
  191. assertThat(underTest.countRootUsersButLogin(session, "bla")).isEqualTo(0);
  192. }
  193. @Test
  194. public void countRootUsersButLogin_returns_count_of_all_active_roots_when_there_specified_login_does_not_exist() {
  195. insertRootUser(newUserDto());
  196. insertNonRootUser(newUserDto());
  197. insertRootUser(newUserDto());
  198. insertRootUser(newUserDto());
  199. insertInactiveRootUser(newUserDto());
  200. insertInactiveRootUser(newUserDto());
  201. session.commit();
  202. assertThat(underTest.countRootUsersButLogin(session, "bla")).isEqualTo(3);
  203. }
  204. @Test
  205. public void countRootUsersButLogin_returns_count_of_all_active_roots_when_specified_login_is_not_root() {
  206. insertRootUser(newUserDto());
  207. String login = insertNonRootUser(newUserDto()).getLogin();
  208. insertRootUser(newUserDto());
  209. insertRootUser(newUserDto());
  210. insertInactiveRootUser(newUserDto());
  211. insertInactiveRootUser(newUserDto());
  212. session.commit();
  213. assertThat(underTest.countRootUsersButLogin(session, login)).isEqualTo(3);
  214. }
  215. @Test
  216. public void countRootUsersButLogin_returns_count_of_all_active_roots_when_specified_login_is_inactive_root() {
  217. insertRootUser(newUserDto());
  218. insertNonRootUser(newUserDto());
  219. insertRootUser(newUserDto());
  220. insertRootUser(newUserDto());
  221. String inactiveRootLogin = insertInactiveRootUser(newUserDto()).getLogin();
  222. insertInactiveRootUser(newUserDto());
  223. session.commit();
  224. assertThat(underTest.countRootUsersButLogin(session, inactiveRootLogin)).isEqualTo(3);
  225. }
  226. @Test
  227. public void countRootUsersButLogin_returns_count_of_all_active_roots_minus_one_when_specified_login_is_active_root() {
  228. insertRootUser(newUserDto());
  229. insertNonRootUser(newUserDto());
  230. insertRootUser(newUserDto());
  231. String rootLogin = insertRootUser(newUserDto()).getLogin();
  232. insertInactiveRootUser(newUserDto());
  233. insertInactiveRootUser(newUserDto());
  234. session.commit();
  235. assertThat(underTest.countRootUsersButLogin(session, rootLogin)).isEqualTo(2);
  236. }
  237. private UserDto insertInactiveRootUser(UserDto dto) {
  238. insertRootUser(dto);
  239. dto.setActive(false);
  240. underTest.update(session, dto);
  241. session.commit();
  242. return dto;
  243. }
  244. private UserDto insertRootUser(UserDto dto) {
  245. underTest.insert(session, dto);
  246. underTest.setRoot(session, dto.getLogin(), true);
  247. session.commit();
  248. return dto;
  249. }
  250. private UserDto insertNonRootUser(UserDto dto) {
  251. underTest.insert(session, dto);
  252. session.commit();
  253. return dto;
  254. }
  255. @Test
  256. public void insert_user() {
  257. Long date = DateUtils.parseDate("2014-06-20").getTime();
  258. UserDto userDto = new UserDto()
  259. .setId(1)
  260. .setLogin("john")
  261. .setName("John")
  262. .setEmail("jo@hn.com")
  263. .setScmAccounts(",jo.hn,john2,")
  264. .setActive(true)
  265. .setOnboarded(true)
  266. .setSalt("1234")
  267. .setCryptedPassword("abcd")
  268. .setHashMethod("SHA1")
  269. .setExternalLogin("johngithub")
  270. .setExternalIdentityProvider("github")
  271. .setExternalId("EXT_ID")
  272. .setLocal(true)
  273. .setHomepageType("project")
  274. .setHomepageParameter("OB1")
  275. .setOrganizationUuid("ORG_UUID")
  276. .setCreatedAt(date)
  277. .setUpdatedAt(date);
  278. underTest.insert(db.getSession(), userDto);
  279. db.getSession().commit();
  280. UserDto user = underTest.selectActiveUserByLogin(session, "john");
  281. assertThat(user).isNotNull();
  282. assertThat(user.getId()).isNotNull();
  283. assertThat(user.getLogin()).isEqualTo("john");
  284. assertThat(user.getName()).isEqualTo("John");
  285. assertThat(user.getEmail()).isEqualTo("jo@hn.com");
  286. assertThat(user.isActive()).isTrue();
  287. assertThat(user.isOnboarded()).isTrue();
  288. assertThat(user.getScmAccounts()).isEqualTo(",jo.hn,john2,");
  289. assertThat(user.getSalt()).isEqualTo("1234");
  290. assertThat(user.getCryptedPassword()).isEqualTo("abcd");
  291. assertThat(user.getHashMethod()).isEqualTo("SHA1");
  292. assertThat(user.getExternalLogin()).isEqualTo("johngithub");
  293. assertThat(user.getExternalIdentityProvider()).isEqualTo("github");
  294. assertThat(user.getExternalId()).isEqualTo("EXT_ID");
  295. assertThat(user.isLocal()).isTrue();
  296. assertThat(user.isRoot()).isFalse();
  297. assertThat(user.getHomepageType()).isEqualTo("project");
  298. assertThat(user.getHomepageParameter()).isEqualTo("OB1");
  299. assertThat(user.getOrganizationUuid()).isEqualTo("ORG_UUID");
  300. }
  301. @Test
  302. public void insert_user_does_not_set_last_connection_date() {
  303. UserDto user = newUserDto().setLastConnectionDate(10_000_000_000L);
  304. underTest.insert(db.getSession(), user);
  305. db.getSession().commit();
  306. UserDto reloaded = underTest.selectByUuid(db.getSession(), user.getUuid());
  307. assertThat(reloaded.getLastConnectionDate()).isNull();
  308. }
  309. @Test
  310. public void update_user() {
  311. UserDto user = db.users().insertUser(u -> u
  312. .setLogin("john")
  313. .setName("John")
  314. .setEmail("jo@hn.com")
  315. .setActive(true)
  316. .setLocal(true)
  317. .setOnboarded(false)
  318. .setOrganizationUuid("OLD_ORG_UUID"));
  319. underTest.update(db.getSession(), newUserDto()
  320. .setUuid(user.getUuid())
  321. .setLogin("johnDoo")
  322. .setName("John Doo")
  323. .setEmail("jodoo@hn.com")
  324. .setScmAccounts(",jo.hn,john2,johndoo,")
  325. .setActive(false)
  326. .setOnboarded(true)
  327. .setSalt("12345")
  328. .setCryptedPassword("abcde")
  329. .setHashMethod("BCRYPT")
  330. .setExternalLogin("johngithub")
  331. .setExternalIdentityProvider("github")
  332. .setExternalId("EXT_ID")
  333. .setLocal(false)
  334. .setHomepageType("project")
  335. .setHomepageParameter("OB1")
  336. .setOrganizationUuid("ORG_UUID")
  337. .setLastConnectionDate(10_000_000_000L));
  338. UserDto reloaded = underTest.selectByUuid(db.getSession(), user.getUuid());
  339. assertThat(reloaded).isNotNull();
  340. assertThat(reloaded.getId()).isEqualTo(user.getId());
  341. assertThat(reloaded.getLogin()).isEqualTo("johnDoo");
  342. assertThat(reloaded.getName()).isEqualTo("John Doo");
  343. assertThat(reloaded.getEmail()).isEqualTo("jodoo@hn.com");
  344. assertThat(reloaded.isActive()).isFalse();
  345. assertThat(reloaded.isOnboarded()).isTrue();
  346. assertThat(reloaded.getScmAccounts()).isEqualTo(",jo.hn,john2,johndoo,");
  347. assertThat(reloaded.getSalt()).isEqualTo("12345");
  348. assertThat(reloaded.getCryptedPassword()).isEqualTo("abcde");
  349. assertThat(reloaded.getHashMethod()).isEqualTo("BCRYPT");
  350. assertThat(reloaded.getExternalLogin()).isEqualTo("johngithub");
  351. assertThat(reloaded.getExternalIdentityProvider()).isEqualTo("github");
  352. assertThat(reloaded.getExternalId()).isEqualTo("EXT_ID");
  353. assertThat(reloaded.isLocal()).isFalse();
  354. assertThat(reloaded.isRoot()).isFalse();
  355. assertThat(reloaded.getHomepageType()).isEqualTo("project");
  356. assertThat(reloaded.getHomepageParameter()).isEqualTo("OB1");
  357. assertThat(reloaded.getOrganizationUuid()).isEqualTo("ORG_UUID");
  358. assertThat(reloaded.getLastConnectionDate()).isEqualTo(10_000_000_000L);
  359. }
  360. @Test
  361. public void deactivate_user() {
  362. UserDto user = insertActiveUser();
  363. insertUserGroup(user);
  364. UserDto otherUser = insertActiveUser();
  365. underTest.update(db.getSession(), user.setLastConnectionDate(10_000_000_000L));
  366. session.commit();
  367. underTest.deactivateUser(session, user);
  368. UserDto userReloaded = underTest.selectUserById(session, user.getId());
  369. assertThat(userReloaded.isActive()).isFalse();
  370. assertThat(userReloaded.getLogin()).isNotNull();
  371. assertThat(userReloaded.getExternalId()).isNotNull();
  372. assertThat(userReloaded.getExternalLogin()).isNotNull();
  373. assertThat(userReloaded.getExternalIdentityProvider()).isNotNull();
  374. assertThat(userReloaded.getEmail()).isNull();
  375. assertThat(userReloaded.getScmAccounts()).isNull();
  376. assertThat(userReloaded.getSalt()).isNull();
  377. assertThat(userReloaded.getCryptedPassword()).isNull();
  378. assertThat(userReloaded.isRoot()).isFalse();
  379. assertThat(userReloaded.getUpdatedAt()).isEqualTo(NOW);
  380. assertThat(userReloaded.getHomepageType()).isNull();
  381. assertThat(userReloaded.getHomepageParameter()).isNull();
  382. assertThat(userReloaded.getLastConnectionDate()).isNull();
  383. assertThat(underTest.selectUserById(session, otherUser.getId())).isNotNull();
  384. }
  385. @Test
  386. public void clean_users_homepage_when_deleting_organization() {
  387. UserDto userUnderTest = newUserDto().setHomepageType("ORGANIZATION").setHomepageParameter("dummy-organization-UUID");
  388. underTest.insert(session, userUnderTest);
  389. UserDto untouchedUser = newUserDto().setHomepageType("ORGANIZATION").setHomepageParameter("not-so-dummy-organization-UUID");
  390. underTest.insert(session, untouchedUser);
  391. session.commit();
  392. underTest.cleanHomepage(session, new OrganizationDto().setUuid("dummy-organization-UUID"));
  393. UserDto userWithAHomepageReloaded = underTest.selectUserById(session, userUnderTest.getId());
  394. assertThat(userWithAHomepageReloaded.getUpdatedAt()).isEqualTo(NOW);
  395. assertThat(userWithAHomepageReloaded.getHomepageType()).isNull();
  396. assertThat(userWithAHomepageReloaded.getHomepageParameter()).isNull();
  397. UserDto untouchedUserReloaded = underTest.selectUserById(session, untouchedUser.getId());
  398. assertThat(untouchedUserReloaded.getUpdatedAt()).isEqualTo(untouchedUser.getUpdatedAt());
  399. assertThat(untouchedUserReloaded.getHomepageType()).isEqualTo(untouchedUser.getHomepageType());
  400. assertThat(untouchedUserReloaded.getHomepageParameter()).isEqualTo(untouchedUser.getHomepageParameter());
  401. }
  402. @Test
  403. public void clean_users_homepage_when_deleting_project() {
  404. UserDto userUnderTest = newUserDto().setHomepageType("PROJECT").setHomepageParameter("dummy-project-UUID");
  405. underTest.insert(session, userUnderTest);
  406. UserDto untouchedUser = newUserDto().setHomepageType("PROJECT").setHomepageParameter("not-so-dummy-project-UUID");
  407. underTest.insert(session, untouchedUser);
  408. session.commit();
  409. underTest.cleanHomepage(session, new ComponentDto().setUuid("dummy-project-UUID"));
  410. UserDto userWithAHomepageReloaded = underTest.selectUserById(session, userUnderTest.getId());
  411. assertThat(userWithAHomepageReloaded.getUpdatedAt()).isEqualTo(NOW);
  412. assertThat(userWithAHomepageReloaded.getHomepageType()).isNull();
  413. assertThat(userWithAHomepageReloaded.getHomepageParameter()).isNull();
  414. UserDto untouchedUserReloaded = underTest.selectUserById(session, untouchedUser.getId());
  415. assertThat(untouchedUserReloaded.getUpdatedAt()).isEqualTo(untouchedUser.getUpdatedAt());
  416. assertThat(untouchedUserReloaded.getHomepageType()).isEqualTo(untouchedUser.getHomepageType());
  417. assertThat(untouchedUserReloaded.getHomepageParameter()).isEqualTo(untouchedUser.getHomepageParameter());
  418. }
  419. @Test
  420. public void clean_user_homepage() {
  421. UserDto user = newUserDto().setHomepageType("RANDOM").setHomepageParameter("any-string");
  422. underTest.insert(session, user);
  423. session.commit();
  424. underTest.cleanHomepage(session, user);
  425. UserDto reloaded = underTest.selectUserById(session, user.getId());
  426. assertThat(reloaded.getUpdatedAt()).isEqualTo(NOW);
  427. assertThat(reloaded.getHomepageType()).isNull();
  428. assertThat(reloaded.getHomepageParameter()).isNull();
  429. }
  430. @Test
  431. public void does_not_fail_to_deactivate_missing_user() {
  432. underTest.deactivateUser(session, newUserDto());
  433. }
  434. @Test
  435. public void select_by_login() {
  436. UserDto user1 = db.users().insertUser(user -> user
  437. .setLogin("marius")
  438. .setName("Marius")
  439. .setEmail("marius@lesbronzes.fr")
  440. .setActive(true)
  441. .setScmAccounts("\nma\nmarius33\n")
  442. .setSalt("79bd6a8e79fb8c76ac8b121cc7e8e11ad1af8365")
  443. .setCryptedPassword("650d2261c98361e2f67f90ce5c65a95e7d8ea2fg")
  444. .setHomepageType("project")
  445. .setHomepageParameter("OB1"));
  446. UserDto user2 = db.users().insertUser();
  447. underTest.setRoot(session, user2.getLogin(), true);
  448. UserDto dto = underTest.selectByLogin(session, user1.getLogin());
  449. assertThat(dto.getId()).isEqualTo(user1.getId());
  450. assertThat(dto.getLogin()).isEqualTo("marius");
  451. assertThat(dto.getName()).isEqualTo("Marius");
  452. assertThat(dto.getEmail()).isEqualTo("marius@lesbronzes.fr");
  453. assertThat(dto.isActive()).isTrue();
  454. assertThat(dto.getScmAccountsAsList()).containsOnly("ma", "marius33");
  455. assertThat(dto.getSalt()).isEqualTo("79bd6a8e79fb8c76ac8b121cc7e8e11ad1af8365");
  456. assertThat(dto.getCryptedPassword()).isEqualTo("650d2261c98361e2f67f90ce5c65a95e7d8ea2fg");
  457. assertThat(dto.isRoot()).isFalse();
  458. assertThat(dto.getCreatedAt()).isEqualTo(user1.getCreatedAt());
  459. assertThat(dto.getUpdatedAt()).isEqualTo(user1.getUpdatedAt());
  460. assertThat(dto.getHomepageType()).isEqualTo("project");
  461. assertThat(dto.getHomepageParameter()).isEqualTo("OB1");
  462. dto = underTest.selectByLogin(session, user2.getLogin());
  463. assertThat(dto.isRoot()).isTrue();
  464. }
  465. @Test
  466. public void select_nullable_by_scm_account() {
  467. db.users().insertUser(user -> user.setLogin("marius").setName("Marius").setEmail("marius@lesbronzes.fr").setScmAccounts(asList("ma", "marius33")));
  468. db.users().insertUser(user -> user.setLogin("sbrandhof").setName("Simon Brandhof").setEmail("sbrandhof@lesbronzes.fr").setScmAccounts((String) null));
  469. assertThat(underTest.selectByScmAccountOrLoginOrEmail(session, "ma")).extracting(UserDto::getLogin).containsExactly("marius");
  470. assertThat(underTest.selectByScmAccountOrLoginOrEmail(session, "marius")).extracting(UserDto::getLogin).containsExactly("marius");
  471. assertThat(underTest.selectByScmAccountOrLoginOrEmail(session, "marius@lesbronzes.fr")).extracting(UserDto::getLogin).containsExactly("marius");
  472. assertThat(underTest.selectByScmAccountOrLoginOrEmail(session, "m")).isEmpty();
  473. assertThat(underTest.selectByScmAccountOrLoginOrEmail(session, "unknown")).isEmpty();
  474. }
  475. @Test
  476. public void select_nullable_by_scm_account_return_many_results_when_same_email_is_used_by_many_users() {
  477. db.users().insertUser(user -> user.setLogin("marius").setName("Marius").setEmail("marius@lesbronzes.fr").setScmAccounts(asList("ma", "marius33")));
  478. db.users().insertUser(user -> user.setLogin("sbrandhof").setName("Simon Brandhof").setEmail("marius@lesbronzes.fr").setScmAccounts((String) null));
  479. List<UserDto> results = underTest.selectByScmAccountOrLoginOrEmail(session, "marius@lesbronzes.fr");
  480. assertThat(results).hasSize(2);
  481. }
  482. @Test
  483. public void select_nullable_by_login() {
  484. db.users().insertUser(user -> user.setLogin("marius"));
  485. db.users().insertUser(user -> user.setLogin("sbrandhof"));
  486. assertThat(underTest.selectByLogin(session, "marius")).isNotNull();
  487. assertThat(underTest.selectByLogin(session, "unknown")).isNull();
  488. }
  489. @Test
  490. public void select_by_email() {
  491. UserDto activeUser1 = db.users().insertUser(u -> u.setEmail("user1@email.com"));
  492. UserDto activeUser2 = db.users().insertUser(u -> u.setEmail("user1@email.com"));
  493. UserDto disableUser = db.users().insertUser(u -> u.setActive(false));
  494. assertThat(underTest.selectByEmail(session, "user1@email.com")).hasSize(2);
  495. assertThat(underTest.selectByEmail(session, disableUser.getEmail())).isEmpty();
  496. assertThat(underTest.selectByEmail(session, "unknown")).isEmpty();
  497. }
  498. @Test
  499. public void select_by_external_id_and_identity_provider() {
  500. UserDto activeUser = db.users().insertUser();
  501. UserDto disableUser = db.users().insertUser(u -> u.setActive(false));
  502. assertThat(underTest.selectByExternalIdAndIdentityProvider(session, activeUser.getExternalId(), activeUser.getExternalIdentityProvider())).isNotNull();
  503. assertThat(underTest.selectByExternalIdAndIdentityProvider(session, disableUser.getExternalId(), disableUser.getExternalIdentityProvider())).isNotNull();
  504. assertThat(underTest.selectByExternalIdAndIdentityProvider(session, "unknown", "unknown")).isNull();
  505. }
  506. @Test
  507. public void select_by_external_ids_and_identity_provider() {
  508. UserDto user1 = db.users().insertUser(u -> u.setExternalIdentityProvider("github"));
  509. UserDto user2 = db.users().insertUser(u -> u.setExternalIdentityProvider("github"));
  510. UserDto user3 = db.users().insertUser(u -> u.setExternalIdentityProvider("bitbucket"));
  511. UserDto disableUser = db.users().insertDisabledUser(u -> u.setExternalIdentityProvider("github"));
  512. assertThat(underTest.selectByExternalIdsAndIdentityProvider(session, singletonList(user1.getExternalId()), "github"))
  513. .extracting(UserDto::getUuid).containsExactlyInAnyOrder(user1.getUuid());
  514. assertThat(underTest.selectByExternalIdsAndIdentityProvider(session,
  515. asList(user1.getExternalId(), user2.getExternalId(), user3.getExternalId(), disableUser.getExternalId()), "github"))
  516. .extracting(UserDto::getUuid).containsExactlyInAnyOrder(user1.getUuid(), user2.getUuid(), disableUser.getUuid());
  517. assertThat(underTest.selectByExternalIdsAndIdentityProvider(session, singletonList("unknown"), "github")).isEmpty();
  518. assertThat(underTest.selectByExternalIdsAndIdentityProvider(session, singletonList(user1.getExternalId()), "unknown")).isEmpty();
  519. }
  520. @Test
  521. public void select_by_external_login_and_identity_provider() {
  522. UserDto activeUser = db.users().insertUser();
  523. UserDto disableUser = db.users().insertUser(u -> u.setActive(false));
  524. assertThat(underTest.selectByExternalLoginAndIdentityProvider(session, activeUser.getExternalLogin(), activeUser.getExternalIdentityProvider())).isNotNull();
  525. assertThat(underTest.selectByExternalLoginAndIdentityProvider(session, disableUser.getExternalLogin(), disableUser.getExternalIdentityProvider())).isNotNull();
  526. assertThat(underTest.selectByExternalLoginAndIdentityProvider(session, "unknown", "unknown")).isNull();
  527. }
  528. @Test
  529. public void setRoot_does_not_fail_on_non_existing_login() {
  530. underTest.setRoot(session, "unkown", true);
  531. underTest.setRoot(session, "unkown", false);
  532. }
  533. @Test
  534. public void setRoot_set_root_flag_of_specified_user_to_specified_value_and_updates_udpateAt() {
  535. String login = insertActiveUser().getLogin();
  536. UserDto otherUser = insertActiveUser();
  537. assertThat(underTest.selectByLogin(session, login).isRoot()).isEqualTo(false);
  538. assertThat(underTest.selectByLogin(session, otherUser.getLogin()).isRoot()).isEqualTo(false);
  539. // does not fail when changing to same value
  540. system2.setNow(15_000L);
  541. commit(() -> underTest.setRoot(session, login, false));
  542. verifyRootAndUpdatedAt(login, false, 15_000L);
  543. verifyRootAndUpdatedAt(otherUser.getLogin(), false, otherUser.getUpdatedAt());
  544. // change value
  545. system2.setNow(26_000L);
  546. commit(() -> underTest.setRoot(session, login, true));
  547. verifyRootAndUpdatedAt(login, true, 26_000L);
  548. verifyRootAndUpdatedAt(otherUser.getLogin(), false, otherUser.getUpdatedAt());
  549. // does not fail when changing to same value
  550. system2.setNow(37_000L);
  551. commit(() -> underTest.setRoot(session, login, true));
  552. verifyRootAndUpdatedAt(login, true, 37_000L);
  553. verifyRootAndUpdatedAt(otherUser.getLogin(), false, otherUser.getUpdatedAt());
  554. // change value back
  555. system2.setNow(48_000L);
  556. commit(() -> underTest.setRoot(session, login, false));
  557. verifyRootAndUpdatedAt(login, false, 48_000L);
  558. verifyRootAndUpdatedAt(otherUser.getLogin(), false, otherUser.getUpdatedAt());
  559. }
  560. private void verifyRootAndUpdatedAt(String login1, boolean root, long updatedAt) {
  561. UserDto userDto = underTest.selectByLogin(session, login1);
  562. assertThat(userDto.isRoot()).isEqualTo(root);
  563. assertThat(userDto.getUpdatedAt()).isEqualTo(updatedAt);
  564. }
  565. @Test
  566. public void setRoot_has_no_effect_on_root_flag_of_inactive_user() {
  567. String nonRootInactiveUser = insertUser(false).getLogin();
  568. commit(() -> underTest.setRoot(session, nonRootInactiveUser, true));
  569. assertThat(underTest.selectByLogin(session, nonRootInactiveUser).isRoot()).isFalse();
  570. // create inactive root user
  571. UserDto rootUser = insertActiveUser();
  572. commit(() -> underTest.setRoot(session, rootUser.getLogin(), true));
  573. rootUser.setActive(false);
  574. commit(() -> underTest.update(session, rootUser));
  575. UserDto inactiveRootUser = underTest.selectByLogin(session, rootUser.getLogin());
  576. assertThat(inactiveRootUser.isRoot()).isTrue();
  577. assertThat(inactiveRootUser.isActive()).isFalse();
  578. commit(() -> underTest.setRoot(session, inactiveRootUser.getLogin(), false));
  579. assertThat(underTest.selectByLogin(session, inactiveRootUser.getLogin()).isRoot()).isTrue();
  580. }
  581. @Test
  582. public void scrollByLUuids() {
  583. UserDto u1 = insertUser(true);
  584. UserDto u2 = insertUser(false);
  585. UserDto u3 = insertUser(false);
  586. List<UserDto> result = new ArrayList<>();
  587. underTest.scrollByUuids(db.getSession(), asList(u2.getUuid(), u3.getUuid(), "does not exist"), result::add);
  588. assertThat(result).extracting(UserDto::getUuid, UserDto::getName)
  589. .containsExactlyInAnyOrder(tuple(u2.getUuid(), u2.getName()), tuple(u3.getUuid(), u3.getName()));
  590. }
  591. @Test
  592. public void scrollByUuids_scrolls_by_pages_of_1000_uuids() {
  593. List<String> uuids = new ArrayList<>();
  594. for (int i = 0; i < DatabaseUtils.PARTITION_SIZE_FOR_ORACLE + 10; i++) {
  595. uuids.add(insertUser(true).getUuid());
  596. }
  597. List<UserDto> result = new ArrayList<>();
  598. underTest.scrollByUuids(db.getSession(), uuids, result::add);
  599. assertThat(result)
  600. .extracting(UserDto::getUuid)
  601. .containsExactlyInAnyOrder(uuids.toArray(new String[0]));
  602. }
  603. @Test
  604. public void scrollAll() {
  605. UserDto u1 = insertUser(true);
  606. UserDto u2 = insertUser(false);
  607. List<UserDto> result = new ArrayList<>();
  608. underTest.scrollAll(db.getSession(), result::add);
  609. assertThat(result).extracting(UserDto::getLogin, UserDto::getName)
  610. .containsExactlyInAnyOrder(tuple(u1.getLogin(), u1.getName()), tuple(u2.getLogin(), u2.getName()));
  611. }
  612. private void commit(Runnable runnable) {
  613. runnable.run();
  614. session.commit();
  615. }
  616. private UserDto insertActiveUser() {
  617. return insertUser(true);
  618. }
  619. private UserDto insertUser(boolean active) {
  620. UserDto dto = newUserDto().setActive(active);
  621. underTest.insert(session, dto);
  622. return dto;
  623. }
  624. private UserGroupDto insertUserGroup(UserDto user) {
  625. GroupDto group = newGroupDto().setName(randomAlphanumeric(30));
  626. dbClient.groupDao().insert(session, group);
  627. UserGroupDto dto = new UserGroupDto().setUserId(user.getId()).setGroupId(group.getId());
  628. dbClient.userGroupDao().insert(session, dto);
  629. return dto;
  630. }
  631. }