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

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