PageRenderTime 54ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/resources/com/onresolve/jira/groovy/test/TestRenameUser.groovy

https://bitbucket.org/sorin/jira-plugin-intellij
Groovy | 365 lines | 301 code | 53 blank | 11 comment | 10 complexity | de31318208a757683757a01a322e0483 MD5 | raw file
  1. package com.onresolve.jira.groovy.test
  2. import com.atlassian.core.action.ActionUtils
  3. import com.atlassian.core.ofbiz.CoreFactory
  4. import com.atlassian.jira.ComponentManager
  5. import com.atlassian.jira.ManagerFactory
  6. import com.atlassian.jira.action.ActionNames
  7. import com.atlassian.jira.bc.JiraServiceContextImpl
  8. import com.atlassian.jira.bc.filter.SearchRequestService
  9. import com.atlassian.jira.bc.user.UserService
  10. import com.atlassian.jira.bc.user.UserService.DeleteUserValidationResult
  11. import com.atlassian.jira.favourites.FavouritesManager
  12. import com.atlassian.jira.issue.CustomFieldManager
  13. import com.atlassian.jira.issue.Issue
  14. import com.atlassian.jira.issue.IssueManager
  15. import com.atlassian.jira.issue.customfields.impl.MultiUserCFType
  16. import com.atlassian.jira.issue.customfields.impl.UserCFType
  17. import com.atlassian.jira.issue.fields.CustomField
  18. import com.atlassian.jira.issue.search.SearchRequest
  19. import com.atlassian.jira.issue.watchers.WatcherManager
  20. import com.atlassian.jira.jql.builder.JqlQueryBuilder
  21. import com.atlassian.jira.jql.parser.JqlQueryParser
  22. import com.atlassian.jira.project.Project
  23. import com.atlassian.jira.security.roles.actor.UserRoleActorFactory
  24. import com.atlassian.jira.sharing.ShareManager
  25. import com.atlassian.jira.sharing.SharedEntity.SharePermissions
  26. import com.atlassian.query.Query
  27. import com.atlassian.query.order.SortOrder
  28. import com.onresolve.jira.groovy.canned.admin.RenameUser
  29. import org.apache.log4j.Category
  30. import org.junit.Before
  31. import org.junit.Test
  32. import org.ofbiz.core.entity.GenericValue
  33. import webwork.dispatcher.ActionResult
  34. import com.atlassian.jira.security.roles.*
  35. import static junit.framework.Assert.*
  36. import com.atlassian.jira.issue.search.SearchProvider
  37. import com.atlassian.jira.web.bean.PagerFilter
  38. import com.atlassian.jira.issue.search.SearchResults
  39. import com.atlassian.jira.bc.user.UserService.CreateUserValidationResult
  40. import com.atlassian.jira.bc.group.GroupService
  41. import com.atlassian.crowd.embedded.api.User
  42. import com.atlassian.jira.user.util.UserUtil
  43. import com.atlassian.jira.security.groups.GroupManager
  44. import com.onresolve.jira.groovy.GroovyRunner
  45. class TestRenameUser {
  46. Category log = Category.getInstance(this.class)
  47. RenameUser renameUser
  48. ComponentManager componentManager = ComponentManager.getInstance()
  49. CustomFieldManager customFieldManager = componentManager.getCustomFieldManager()
  50. JqlQueryBuilder builder = JqlQueryBuilder.newBuilder()
  51. JqlQueryParser jqlQueryParser = ComponentManager.getComponentInstanceOfType(JqlQueryParser.class) as JqlQueryParser
  52. final String sourceUser = "def"
  53. final String targetUser = "abc"
  54. SearchRequestService searchRequestService = componentManager.getSearchRequestService()
  55. User currentUser = componentManager.getJiraAuthenticationContext().getUser()
  56. IssueManager issueManager = ManagerFactory.getIssueManager()
  57. Project project = componentManager.getProjectManager().getProjectObjByKey('JRA')
  58. GroovyRunner runner = new GroovyRunner()
  59. UserUtil userUtil = ComponentManager.getInstance().getUserUtil()
  60. FavouritesManager favouritesManager = ComponentManager.getComponentInstanceOfType(FavouritesManager.class) as FavouritesManager
  61. ShareManager shareManager = ComponentManager.getComponentInstanceOfType(ShareManager.class) as ShareManager
  62. SearchProvider searchProvider = componentManager.getSearchProvider()
  63. UserService userService = ComponentManager.getComponentInstanceOfType(UserService.class) as UserService
  64. GroupService groupService = ComponentManager.getComponentInstanceOfType(GroupService.class) as GroupService
  65. GroupManager groupManager = ComponentManager.getComponentInstanceOfType(GroupManager.class)
  66. @Before
  67. public void setUp() {
  68. renameUser = new RenameUser()
  69. log.debug("===================================================================================================")
  70. // check group exists
  71. userUtil.getGroup("SomeGroup")
  72. ["xxx", "yyy"].each {String u ->
  73. if (userUtil.getUser(u)) {
  74. log.debug("Deleting user: $u")
  75. builder.clear()
  76. Query query = builder.where().reporterUser(u).or().assigneeUser(u).buildQuery()
  77. SearchResults results = searchProvider.search(query, currentUser, PagerFilter.getUnlimitedFilter())
  78. results.getIssues().each {Issue issue ->
  79. log.debug("Delete issue $issue.key")
  80. deleteIssue(issueManager.getIssueObject(issue.id))
  81. }
  82. deleteUser(userUtil.getUser(u))
  83. }
  84. }
  85. }
  86. @Test
  87. public void testUpdateSearchRequest() {
  88. builder.clear()
  89. Query query = builder.where().reporterUser(sourceUser).buildQuery()
  90. query = JqlQueryBuilder.newBuilder(query).orderBy().assignee(SortOrder.ASC).buildQuery()
  91. SearchRequest sr = new SearchRequest(query, currentUser.getName(), "ReporterIsDef", "some desc")
  92. sr = createAndUpdate(sr)
  93. assertEquals '{reporter = "abc"} order by assignee ASC', sr.query.toString()
  94. deleteSearchRequest(sr)
  95. // this query should not need to be updated
  96. builder.clear()
  97. query = builder.where().reporterUser("admin").buildQuery()
  98. sr = new SearchRequest(query, currentUser.getName(), "ReporterIsDef", "some desc")
  99. sr = createAndUpdate(sr)
  100. log.debug(sr.query.queryString)
  101. deleteSearchRequest(sr)
  102. }
  103. private void deleteSearchRequest (SearchRequest sr) {
  104. JiraServiceContextImpl ctx = new JiraServiceContextImpl(userUtil.getUser(sr.ownerUserName))
  105. searchRequestService.deleteFilter(ctx, sr.id)
  106. assertFalse ctx.errorCollection.hasAnyErrors()
  107. }
  108. private SearchRequest createAndUpdate(SearchRequest sr) {
  109. JiraServiceContextImpl ctx = new JiraServiceContextImpl(currentUser)
  110. searchRequestService.validateFilterForCreate(ctx, sr)
  111. assertFalse ctx.errorCollection.hasAnyErrors()
  112. sr = searchRequestService.createFilter(ctx, sr, true)
  113. assertFalse ctx.errorCollection.hasAnyErrors()
  114. renameUser.updateSingleRequest(sr, sourceUser, targetUser)
  115. sr = searchRequestService.getFilter(ctx, sr.id)
  116. sr
  117. }
  118. @Test
  119. public void testTransformQuery() {
  120. log.debug("testTransformQuery")
  121. Query query, transformedQuery
  122. CustomField cfUserPicker = customFieldManager.getCustomFieldObjectByName("UserPicker")
  123. CustomField cfMultiUserPicker = customFieldManager.getCustomFieldObjectByName("MultiUserPicker")
  124. assertNotNull cfUserPicker
  125. assertNotNull cfMultiUserPicker
  126. log.debug(cfMultiUserPicker.getCustomFieldType().class)
  127. assertTrue (cfUserPicker.getCustomFieldType() instanceof UserCFType)
  128. assertTrue (cfMultiUserPicker.getCustomFieldType() instanceof MultiUserCFType)
  129. query = builder.where().reporterUser('def').buildQuery()
  130. query = JqlQueryBuilder.newBuilder(query).orderBy().assignee(SortOrder.ASC).buildQuery()
  131. assertEquals "{reporter = \"def\"} order by assignee ASC", query.toString()
  132. transformedQuery = renameUser.transformSearchRequest(query, "def", "abc")
  133. assertEquals "{reporter = \"abc\"} order by assignee ASC", transformedQuery.toString()
  134. builder.clear()
  135. query = builder.where().reporterUser('def').and().assigneeUser("def").buildQuery()
  136. transformedQuery = renameUser.transformSearchRequest(query, "def", "abc")
  137. assertEquals '{reporter = "abc"} AND {assignee = "abc"}', transformedQuery.toString()
  138. builder.clear()
  139. query = builder.where().reporter().in().strings("admin", "def").buildQuery()
  140. transformedQuery = renameUser.transformSearchRequest(query, "def", "abc")
  141. assertEquals '{reporter in ("admin", "abc")}', transformedQuery.toString()
  142. builder.clear()
  143. query = builder.where().reporter().notIn().strings("admin", "def").buildQuery()
  144. transformedQuery = renameUser.transformSearchRequest(query, "def", "abc")
  145. assertEquals '{reporter not in ("admin", "abc")}', transformedQuery.toString()
  146. builder.clear()
  147. query = builder.where().reporter().notEq("def").buildQuery()
  148. transformedQuery = renameUser.transformSearchRequest(query, "def", "abc")
  149. assertEquals '{reporter != "abc"}', transformedQuery.toString()
  150. builder.clear()
  151. query = builder.where().sub().reporter().eq("def").or().priority("1").endsub().and().sub().reporterUser("admin").or().priority("2").endsub().buildQuery()
  152. assertEquals '( {reporter = "def"} OR {priority = "1"} ) AND ( {reporter = "admin"} OR {priority = "2"} )', query.toString()
  153. transformedQuery = renameUser.transformSearchRequest(query, "def", "abc")
  154. assertEquals '( {reporter = "abc"} OR {priority = "1"} ) AND ( {reporter = "admin"} OR {priority = "2"} )', transformedQuery.toString()
  155. builder.clear()
  156. query = builder.where().not().reporter().eq("def").buildQuery()
  157. transformedQuery = renameUser.transformSearchRequest(query, "def", "abc")
  158. assertEquals 'NOT {reporter = "abc"}', transformedQuery.toString()
  159. builder.clear()
  160. query = builder.where().not().sub().reporter().eq("def").or().priority("1").endsub()
  161. .and().not().sub().reporterUser("admin").or().priority("2").endsub().buildQuery()
  162. transformedQuery = renameUser.transformSearchRequest(query, "def", "abc")
  163. assertEquals 'NOT ( {reporter = "abc"} OR {priority = "1"} ) AND NOT ( {reporter = "admin"} OR {priority = "2"} )', transformedQuery.toString()
  164. // custom fields
  165. builder.clear()
  166. query = builder.where().customField(cfUserPicker.idAsLong).eq("def").buildQuery()
  167. log.debug query
  168. transformedQuery = renameUser.transformSearchRequest(query, "def", "abc")
  169. log.debug(transformedQuery)
  170. assertEquals '{cf[10040] = "abc"}', transformedQuery.toString()
  171. // There are two UserPickers, how is it supposed to know which is which
  172. // Do we want two user pickers for these tests?
  173. query = jqlQueryParser.parseQuery("UserPicker is def")
  174. transformedQuery = renameUser.transformSearchRequest(query, "def", "abc")
  175. log.debug(transformedQuery)
  176. assertEquals '{UserPicker is "abc"}', transformedQuery.toString()
  177. query = jqlQueryParser.parseQuery("UserPicker IN (admin, def)")
  178. transformedQuery = renameUser.transformSearchRequest(query, "def", "abc")
  179. log.debug(transformedQuery)
  180. assertEquals '{UserPicker in ("admin", "abc")}', transformedQuery.toString()
  181. query = jqlQueryParser.parseQuery("project = JRA AND MultiUserPicker in (def,admin)")
  182. log.debug(query.queryString)
  183. transformedQuery = renameUser.transformSearchRequest(query, "def", "abc")
  184. log.debug(transformedQuery)
  185. assertEquals '{project = "JRA"} AND {MultiUserPicker in ("abc", "admin")}', transformedQuery.toString()
  186. }
  187. @Test
  188. public void testRename() {
  189. testDoScript(false)
  190. }
  191. @Test
  192. public void testMerge() {
  193. testDoScript(true)
  194. }
  195. public void testDoScript(boolean merge) {
  196. log.debug('testDoScript')
  197. User userSrc = createUser("xxx")
  198. User userTarget = null
  199. if (merge) {
  200. userTarget = createUser("yyy")
  201. }
  202. groupManager.addUserToGroup(userSrc, userUtil.getGroup("SomeGroup"))
  203. GenericValue issueGv1 = createIssue(userSrc);
  204. GenericValue issueGv2 = null
  205. if (merge) {
  206. issueGv2 = createIssue(userTarget);
  207. }
  208. builder.clear()
  209. Query query = builder.where().reporterUser(userSrc.name).buildQuery()
  210. query = JqlQueryBuilder.newBuilder(query).orderBy().assignee(SortOrder.ASC).buildQuery()
  211. SearchRequest sr = new SearchRequest(query, userSrc.name, "ReporterIsXXDef", "some desc")
  212. sr.setPermissions(SharePermissions.GLOBAL)
  213. JiraServiceContextImpl ctx = new JiraServiceContextImpl(userSrc)
  214. searchRequestService.validateFilterForCreate(ctx, sr)
  215. log.debug(ctx.errorCollection)
  216. assertFalse ctx.errorCollection.hasAnyErrors()
  217. sr = searchRequestService.createFilter(ctx, sr, true)
  218. assertFalse ctx.errorCollection.hasAnyErrors()
  219. favouritesManager.addFavourite(userSrc, sr)
  220. if (merge) {
  221. favouritesManager.addFavourite(userTarget, sr)
  222. }
  223. WatcherManager watcherManager = componentManager.getWatcherManager()
  224. watcherManager.startWatching(userSrc, issueGv1)
  225. if (merge) {
  226. watcherManager.startWatching(userSrc, issueGv2)
  227. watcherManager.startWatching(userTarget, issueGv1)
  228. }
  229. ProjectRoleManager projectRoleManager = ComponentManager.getComponentInstanceOfType(ProjectRoleManager.class) as ProjectRoleManager
  230. RoleActorFactory roleActorFactory = ComponentManager.getComponentInstanceOfType(RoleActorFactory.class) as RoleActorFactory
  231. ProjectRole devsRole = projectRoleManager.getProjectRole("Developers")
  232. ProjectRoleActors actors = projectRoleManager.getProjectRoleActors(devsRole, project)
  233. RoleActor roleActor = roleActorFactory.createRoleActor(null, devsRole.id, project.id, UserRoleActorFactory.TYPE, userSrc.name);
  234. actors = actors.addRoleActor(roleActor) as ProjectRoleActors
  235. if (merge) {
  236. roleActor = roleActorFactory.createRoleActor(null, devsRole.id, project.id, UserRoleActorFactory.TYPE, userTarget.name);
  237. actors = actors.addRoleActor(roleActor) as ProjectRoleActors
  238. }
  239. projectRoleManager.updateProjectRoleActors(actors)
  240. assertTrue projectRoleManager.getProjectRoleActors(devsRole, project).getUsers()*.name.contains(userSrc.name)
  241. Map<String, Object> inputs = [
  242. (RenameUser.FIELD_FROM_USER_ID) : userSrc.name,
  243. (RenameUser.FIELD_TO_USER_ID): (merge ? userTarget.name : "yyy"),
  244. (RenameUser.FIELD_MERGE): merge,
  245. ] as Map<String, Object>
  246. log.debug(inputs)
  247. Map params = new RenameUser().doScript(inputs)
  248. userTarget = userUtil.getUser("yyy")
  249. // post-script assertions
  250. if (merge) {
  251. assertEquals "Mr yyy", userTarget.displayName
  252. }
  253. assertNull userUtil.getUser(userSrc.name)
  254. assertNotNull userUtil.getUser(userTarget.name)
  255. assertTrue groupManager.isUserInGroup(userTarget.name, "SomeGroup")
  256. assertTrue projectRoleManager.getProjectRoleActors(devsRole, project).getUsers()*.name.contains(userTarget.name)
  257. assertFalse projectRoleManager.getProjectRoleActors(devsRole, project).getUsers()*.name.contains(userSrc.name)
  258. assertTrue watcherManager.isWatching(userTarget, issueGv1)
  259. if (merge) {
  260. assertTrue watcherManager.isWatching(userTarget, issueGv2)
  261. }
  262. // reload sr because the owner has changed now
  263. sr = searchRequestService.getFilter(new JiraServiceContextImpl(userTarget), sr.id)
  264. // check that the favourite count has been reduced now these two are the same user
  265. assertEquals(1, sr.getFavouriteCount())
  266. // post-script clean-up
  267. Issue issue = issueManager.getIssueObject(issueGv1.getLong("id"))
  268. assertEquals userTarget.name, issue.reporterId
  269. // deleteUser(userSrc)
  270. deleteIssue(issueManager.getIssueObject(issueGv1.getLong("id")))
  271. if (merge) {
  272. deleteIssue(issueManager.getIssueObject(issueGv2.getLong("id")))
  273. }
  274. deleteUser(userTarget)
  275. // don't deleteSearchRequest(sr) because it's handled when the user is deleted properly
  276. }
  277. private GenericValue createIssue(User user) {
  278. Issue issue = componentManager.getIssueFactory().getIssue()
  279. issue.setProject(project.getGenericValue())
  280. issue.setSummary "my summary"
  281. issue.setReporterId user.name
  282. issue.setIssueTypeId "1"
  283. issue.setPriorityId('2')
  284. GenericValue issueGv = issueManager.createIssue(user, issue)
  285. return issueGv
  286. }
  287. private def deleteUser(User user) {
  288. DeleteUserValidationResult validationResult = userService.validateDeleteUser(componentManager.getJiraAuthenticationContext().getUser(), user.name)
  289. log.debug(validationResult.errorCollection)
  290. assertTrue validationResult.isValid()
  291. userService.removeUser(user, validationResult)
  292. assertNull userUtil.getUser(user.name)
  293. }
  294. private User createUser(String userId) {
  295. assertNull userUtil.getUser(userId)
  296. CreateUserValidationResult res = userService.validateCreateUserForAdmin(currentUser, userId, "pw", "pw", "${userId}@blah.com", "Mr ${userId}")
  297. assertFalse res.errorCollection.hasAnyErrors()
  298. User user = userService.createUserNoNotification(res)
  299. assertNotNull userUtil.getUser(userId)
  300. return user
  301. }
  302. public def deleteIssue(Issue theIssue) {
  303. Map parameters = [
  304. issue: theIssue.getGenericValue(),
  305. remoteUser: userUtil.getUser("admin"),
  306. dispatchEvent: false,
  307. permissionOverride: true,
  308. ]
  309. ActionResult aResult = CoreFactory.getActionDispatcher().execute(ActionNames.ISSUE_DELETE, parameters);
  310. ActionUtils.checkForErrors(aResult)
  311. }
  312. }