PageRenderTime 51ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/test/integration/net/biomodels/jummp/core/UserServiceTests.groovy

https://bitbucket.org/stefanjummp/jummp
Groovy | 374 lines | 342 code | 19 blank | 13 comment | 1 complexity | b32e88429afa47421ed90385d11d300d MD5 | raw file
  1. package net.biomodels.jummp.core
  2. import static org.junit.Assert.*
  3. import org.junit.*
  4. import org.springframework.security.authentication.BadCredentialsException
  5. import net.biomodels.jummp.plugins.security.Role
  6. import net.biomodels.jummp.plugins.security.User
  7. import net.biomodels.jummp.plugins.security.UserRole
  8. import org.springframework.security.access.AccessDeniedException
  9. import net.biomodels.jummp.core.user.RegistrationException
  10. import net.biomodels.jummp.core.user.RoleNotFoundException
  11. import net.biomodels.jummp.core.user.UserCodeExpiredException
  12. import net.biomodels.jummp.core.user.UserCodeInvalidException
  13. import net.biomodels.jummp.core.user.UserNotFoundException
  14. class UserServiceTests extends JummpIntegrationTest {
  15. def userService
  16. def grailsApplication
  17. @Before
  18. void setUp() {
  19. createUserAndRoles()
  20. grailsApplication.config.jummp.security.anonymousRegistration = true
  21. }
  22. @Override
  23. @After
  24. void tearDown() {
  25. }
  26. @Test
  27. void testChangePassword() {
  28. authenticateAsTestUser()
  29. shouldFail(BadCredentialsException) {
  30. userService.changePassword("wrong", "secure")
  31. }
  32. userService.changePassword("secret", "secure")
  33. shouldFail(BadCredentialsException) {
  34. authenticateAsTestUser()
  35. }
  36. authenticate("testuser", "secure")
  37. }
  38. @Test
  39. void testEditUser() {
  40. authenticateAsTestUser()
  41. User user = User.findByUsername("username")
  42. user.userRealName = "Changed Name"
  43. shouldFail(AccessDeniedException) {
  44. userService.editUser(user)
  45. }
  46. authenticateAsUser()
  47. userService.editUser(user)
  48. authenticateAsAdmin()
  49. userService.editUser(user)
  50. userService.editUser(user)
  51. }
  52. @Test
  53. void testGetCurrentUser() {
  54. authenticateAnonymous()
  55. shouldFail(AccessDeniedException) {
  56. userService.getCurrentUser()
  57. }
  58. authenticateAsUser()
  59. User user = userService.getCurrentUser()
  60. assertEquals("username", user.username)
  61. }
  62. @Test
  63. void testGetUser() {
  64. authenticateAnonymous()
  65. shouldFail(AccessDeniedException) {
  66. userService.getUser("username")
  67. }
  68. authenticateAsTestUser()
  69. shouldFail(AccessDeniedException) {
  70. userService.getUser("username")
  71. }
  72. authenticateAsUser()
  73. User user = userService.getUser("username")
  74. assertEquals("username", user.username)
  75. assertNull(user.password)
  76. assertNull(user.enabled)
  77. assertNull(user.accountExpired)
  78. assertNull(user.accountLocked)
  79. assertNull(user.passwordExpired)
  80. authenticateAsAdmin()
  81. userService.getUser("username")
  82. shouldFail(UserNotFoundException) {
  83. userService.getUser("noSuchUser")
  84. }
  85. }
  86. @Test
  87. void testGetAllUsers() {
  88. authenticateAnonymous()
  89. shouldFail(AccessDeniedException) {
  90. userService.getAllUsers(0, 0)
  91. }
  92. authenticateAsUser()
  93. shouldFail(AccessDeniedException) {
  94. userService.getAllUsers(0, 0)
  95. }
  96. authenticateAsAdmin()
  97. List<User> users = userService.getAllUsers(0, 10)
  98. assertEquals(4, users.size())
  99. // TODO: add tests for the size - requires creation of more users
  100. }
  101. @Test
  102. void testEnableUser() {
  103. authenticateAnonymous()
  104. shouldFail(AccessDeniedException) {
  105. userService.enableUser(1, true)
  106. }
  107. authenticateAsUser()
  108. shouldFail(AccessDeniedException) {
  109. userService.enableUser(1, true)
  110. }
  111. authenticateAsAdmin()
  112. shouldFail(UserNotFoundException) {
  113. userService.enableUser(0, true)
  114. }
  115. assertFalse(userService.enableUser(User.findByUsername("testuser").id, true))
  116. assertTrue(userService.enableUser(User.findByUsername("testuser").id, false))
  117. }
  118. @Test
  119. void testLockAccount() {
  120. authenticateAnonymous()
  121. shouldFail(AccessDeniedException) {
  122. userService.lockAccount(1, true)
  123. }
  124. authenticateAsUser()
  125. shouldFail(AccessDeniedException) {
  126. userService.lockAccount(1, true)
  127. }
  128. authenticateAsAdmin()
  129. shouldFail(UserNotFoundException) {
  130. userService.lockAccount(0, true)
  131. }
  132. assertFalse(userService.lockAccount(User.findByUsername("testuser").id, false))
  133. assertTrue(userService.lockAccount(User.findByUsername("testuser").id, true))
  134. }
  135. @Test
  136. void testExpireAccount() {
  137. authenticateAnonymous()
  138. shouldFail(AccessDeniedException) {
  139. userService.expireAccount(1, true)
  140. }
  141. authenticateAsUser()
  142. shouldFail(AccessDeniedException) {
  143. userService.expireAccount(1, true)
  144. }
  145. authenticateAsAdmin()
  146. shouldFail(UserNotFoundException) {
  147. userService.expireAccount(0, true)
  148. }
  149. assertFalse(userService.expireAccount(User.findByUsername("testuser").id, false))
  150. assertTrue(userService.expireAccount(User.findByUsername("testuser").id, true))
  151. }
  152. @Test
  153. void testExpirePassword() {
  154. authenticateAnonymous()
  155. shouldFail(AccessDeniedException) {
  156. userService.expirePassword(1, true)
  157. }
  158. authenticateAsUser()
  159. shouldFail(AccessDeniedException) {
  160. userService.expirePassword(1, true)
  161. }
  162. authenticateAsAdmin()
  163. shouldFail(UserNotFoundException) {
  164. userService.expirePassword(0, true)
  165. }
  166. assertFalse(userService.expirePassword(User.findByUsername("testuser").id, false))
  167. assertTrue(userService.expirePassword(User.findByUsername("testuser").id, true))
  168. }
  169. @Test
  170. void testRegister() {
  171. User user = new User(username: "register", password: "test", userRealName: "Test Name", email: "test@example.com")
  172. authenticateAsUser()
  173. shouldFail(AccessDeniedException) {
  174. userService.register(user)
  175. }
  176. boolean anonymousRegistration = grailsApplication.config.jummp.security.anonymousRegistration
  177. grailsApplication.config.jummp.security.anonymousRegistration = false
  178. authenticateAnonymous()
  179. shouldFail(AccessDeniedException) {
  180. userService.register(user)
  181. }
  182. grailsApplication.config.jummp.security.anonymousRegistration = true
  183. Long id = userService.register(user)
  184. shouldFail(RegistrationException) {
  185. userService.register(user)
  186. }
  187. User registeredUser = User.findByUsername("register")
  188. assertEquals(registeredUser.id, id)
  189. assertFalse(registeredUser.enabled)
  190. assertFalse(registeredUser.accountLocked)
  191. assertFalse(registeredUser.accountExpired)
  192. assertFalse(registeredUser.passwordExpired)
  193. assertNotNull(registeredUser.registrationCode)
  194. assertNotNull(registeredUser.registrationInvalidation)
  195. GregorianCalendar calendar = new GregorianCalendar()
  196. calendar.add(GregorianCalendar.DAY_OF_MONTH, 1)
  197. GregorianCalendar validateCal = new GregorianCalendar()
  198. validateCal.setTime(registeredUser.registrationInvalidation)
  199. assertEquals(calendar.get(GregorianCalendar.DAY_OF_MONTH), validateCal.get(GregorianCalendar.DAY_OF_MONTH))
  200. // try another user as amdin
  201. authenticateAsAdmin()
  202. grailsApplication.config.jummp.security.anonymousRegistration = false
  203. user.username = "register2"
  204. id = userService.register(user)
  205. User adminRegisteredUser = User.findByUsername("register2")
  206. assertEquals(adminRegisteredUser.id, id)
  207. assertTrue(adminRegisteredUser.enabled)
  208. assertFalse(adminRegisteredUser.accountLocked)
  209. assertFalse(adminRegisteredUser.accountExpired)
  210. assertTrue(adminRegisteredUser.passwordExpired)
  211. assertNotNull(adminRegisteredUser.registrationCode)
  212. assertNotNull(adminRegisteredUser.registrationInvalidation)
  213. assertEquals(adminRegisteredUser.password, "*")
  214. assertFalse(registeredUser.registrationCode == adminRegisteredUser.registrationCode)
  215. grailsApplication.config.jummp.security.anonymousRegistration = anonymousRegistration
  216. }
  217. @Test
  218. void testValidateRegistration() {
  219. authenticateAsUser()
  220. shouldFail(AccessDeniedException) {
  221. userService.validateRegistration("username", "1234")
  222. }
  223. authenticateAnonymous()
  224. shouldFail(UserNotFoundException) {
  225. userService.validateRegistration("notExistingUser", "1234")
  226. }
  227. // first register a user
  228. User user = new User(username: "register", password: "test", userRealName: "Test Name", email: "test@example.com")
  229. userService.register(user)
  230. User registeredUser = User.findByUsername("register")
  231. // exception with wrong registration code
  232. shouldFail(UserCodeInvalidException) {
  233. userService.validateRegistration("register", "1234")
  234. }
  235. // change the registrationInvalidation to be in the past
  236. GregorianCalendar validateCal = new GregorianCalendar()
  237. validateCal.setTime(registeredUser.registrationInvalidation)
  238. validateCal.add(GregorianCalendar.DAY_OF_MONTH, -1)
  239. registeredUser.registrationInvalidation = validateCal.getTime()
  240. registeredUser.save(flush: true)
  241. shouldFail(UserCodeExpiredException) {
  242. userService.validateRegistration("register", registeredUser.registrationCode)
  243. }
  244. validateCal.add(GregorianCalendar.DAY_OF_MONTH, 1)
  245. registeredUser.registrationInvalidation = validateCal.getTime()
  246. registeredUser.save(flush: true)
  247. // with correct validation code it should work
  248. userService.validateRegistration("register", registeredUser.registrationCode)
  249. // refresh
  250. registeredUser = User.get(registeredUser.id)
  251. assertTrue(registeredUser.enabled)
  252. assertNull(registeredUser.registrationCode)
  253. assertNull(registeredUser.registrationInvalidation)
  254. // trying to validate again should fail
  255. shouldFail(RegistrationException) {
  256. userService.validateRegistration("register", registeredUser.registrationCode)
  257. }
  258. }
  259. @Test
  260. void testGetAllRoles() {
  261. authenticateAnonymous()
  262. shouldFail(AccessDeniedException) {
  263. userService.getAllRoles()
  264. }
  265. authenticateAsUser()
  266. shouldFail(AccessDeniedException) {
  267. userService.getAllRoles()
  268. }
  269. authenticateAsAdmin()
  270. List<Role> roles = userService.getAllRoles()
  271. assertEquals(Role.findByAuthority("ROLE_USER").id, roles[0].id)
  272. assertEquals(Role.findByAuthority("ROLE_ADMIN").id, roles[1].id)
  273. assertEquals(Role.findByAuthority("ROLE_CURATOR").id, roles[2].id)
  274. }
  275. @Test
  276. void testGetRolesForUser() {
  277. User user = User.findByUsername("testuser")
  278. authenticateAnonymous()
  279. shouldFail(AccessDeniedException) {
  280. userService.getRolesForUser(user.id)
  281. }
  282. authenticateAsUser()
  283. shouldFail(AccessDeniedException) {
  284. userService.getRolesForUser(user.id)
  285. }
  286. authenticateAsAdmin()
  287. assertTrue(userService.getRolesForUser(0).isEmpty())
  288. assertArrayEquals([Role.findByAuthority("ROLE_USER")].toArray(), userService.getRolesForUser(user.id).toArray())
  289. User admin = User.findByUsername("admin")
  290. assertArrayEquals([Role.findByAuthority("ROLE_USER"), Role.findByAuthority("ROLE_ADMIN")].toArray(), userService.getRolesForUser(admin.id).toArray())
  291. }
  292. @Test
  293. void testAddRoleToUser() {
  294. authenticateAnonymous()
  295. shouldFail(AccessDeniedException) {
  296. userService.addRoleToUser(0, 0)
  297. }
  298. authenticateAsUser()
  299. shouldFail(AccessDeniedException) {
  300. userService.addRoleToUser(0, 0)
  301. }
  302. authenticateAsAdmin()
  303. shouldFail(UserNotFoundException) {
  304. userService.addRoleToUser(0, 0)
  305. }
  306. User user = User.findByUsername("testuser")
  307. shouldFail(RoleNotFoundException) {
  308. userService.addRoleToUser(user.id, 0)
  309. }
  310. Role role = Role.findByAuthority("ROLE_USER")
  311. Role adminRole = Role.findByAuthority("ROLE_ADMIN")
  312. // adding a role to a user who already has the role should not change anything
  313. assertNotNull(UserRole.get(user.id, role.id))
  314. userService.addRoleToUser(user.id, role.id)
  315. assertNotNull(UserRole.get(user.id, role.id))
  316. // adding a role not yet added to the user should change it
  317. assertNull(UserRole.get(user.id, adminRole.id))
  318. userService.addRoleToUser(user.id, adminRole.id)
  319. assertNotNull(UserRole.get(user.id, adminRole.id))
  320. }
  321. @Test
  322. void testRemoveRoleFromUser() {
  323. authenticateAnonymous()
  324. shouldFail(AccessDeniedException) {
  325. userService.removeRoleFromUser(0, 0)
  326. }
  327. authenticateAsUser()
  328. shouldFail(AccessDeniedException) {
  329. userService.removeRoleFromUser(0, 0)
  330. }
  331. authenticateAsAdmin()
  332. shouldFail(UserNotFoundException) {
  333. userService.removeRoleFromUser(0, 0)
  334. }
  335. User user = User.findByUsername("testuser")
  336. shouldFail(RoleNotFoundException) {
  337. userService.removeRoleFromUser(user.id, 0)
  338. }
  339. Role role = Role.findByAuthority("ROLE_USER")
  340. Role adminRole = Role.findByAuthority("ROLE_ADMIN")
  341. // removing a role from a user who does not have the role should not change anything
  342. assertNull(UserRole.get(user.id, adminRole.id))
  343. userService.removeRoleFromUser(user.id, adminRole.id)
  344. assertNull(UserRole.get(user.id, adminRole.id))
  345. // removing a role the user has should change it
  346. assertNotNull(UserRole.get(user.id, role.id))
  347. userService.removeRoleFromUser(user.id, role.id)
  348. assertNull(UserRole.get(user.id, role.id))
  349. // just once - add it and remove it
  350. userService.addRoleToUser(user.id, role.id)
  351. assertNotNull(UserRole.get(user.id, role.id))
  352. userService.removeRoleFromUser(user.id, role.id)
  353. assertNull(UserRole.get(user.id, role.id))
  354. }
  355. }