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 33KB

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