PageRenderTime 53ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

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

https://bitbucket.org/sorin/jira-plugin-intellij
Groovy | 211 lines | 150 code | 44 blank | 17 comment | 9 complexity | 89ca1f4134bf0fc00ef00d7daf9a85d5 MD5 | raw file
  1. package com.onresolve.jira.groovy.test;
  2. import org.apache.log4j.Category
  3. import com.atlassian.jira.issue.comments.Comment
  4. import org.apache.log4j.Category
  5. import org.junit.After
  6. import org.junit.Before
  7. import org.junit.Test
  8. import static junit.framework.Assert.assertNotNull
  9. import com.atlassian.jira.issue.customfields.CustomFieldType
  10. import com.atlassian.jira.issue.customfields.CustomFieldSearcher
  11. import com.atlassian.jira.issue.fields.CustomField
  12. import com.atlassian.core.util.collection.EasyList
  13. import com.atlassian.jira.issue.context.GlobalIssueContext
  14. import com.atlassian.jira.component.ComponentAccessor
  15. import com.onresolve.jira.groovy.canned.admin.BulkImportCustomFieldValues
  16. import com.atlassian.jira.ComponentManager
  17. import com.atlassian.jira.issue.fields.config.manager.FieldConfigSchemeManager
  18. import static junit.framework.Assert.assertEquals
  19. import com.atlassian.jira.issue.managers.DefaultCustomFieldManager
  20. import org.apache.log4j.Level
  21. import com.atlassian.jira.issue.context.manager.JiraContextTreeManager
  22. import com.atlassian.jira.issue.customfields.CustomFieldUtils
  23. import com.atlassian.jira.issue.util.IssueChangeHolder
  24. import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
  25. import com.atlassian.jira.issue.ModifiedValue
  26. import com.onresolve.jira.groovy.canned.admin.SplitCustomFieldContext
  27. import com.atlassian.jira.project.Project
  28. import com.atlassian.jira.issue.fields.config.FieldConfigScheme
  29. import com.onresolve.jira.groovy.canned.CannedScript
  30. import com.onresolve.jira.groovy.GroovyRunner
  31. import com.atlassian.jira.util.ImportUtils
  32. import com.atlassian.jira.issue.index.IssueIndexManager
  33. import com.onresolve.jira.groovy.ScriptManager
  34. import com.onresolve.jira.groovy.ScriptManagerProxyImpl
  35. import com.onresolve.jira.groovy.CannedScriptRunner
  36. import com.atlassian.jira.issue.customfields.option.Option
  37. import com.atlassian.jira.issue.fields.config.FieldConfig
  38. import com.atlassian.jira.issue.context.IssueContextImpl
  39. import com.atlassian.jira.issue.customfields.view.CustomFieldParamsImpl
  40. import com.atlassian.jira.util.BuildUtils
  41. public class TestSplitCustomFieldContext extends CustomFieldBaseTests {
  42. Project jrtwoProj
  43. Project jraProj
  44. def FieldConfigScheme currentFCS
  45. def CustomField cf
  46. TestSplitCustomFieldContext() {
  47. // def gcl = this.class.classLoader.parent
  48. // gcl.clearCache()
  49. jrtwoProj = projectManager.getProjectObjByKey("JRTWO")
  50. jraProj = projectManager.getProjectObjByKey("JRA")
  51. }
  52. @Test
  53. public void testCascadingSelect() {
  54. setUp("SplittableCascadingSelectList", "com.atlassian.jira.plugin.system.customfieldtypes:cascadingselect",
  55. "com.atlassian.jira.plugin.system.customfieldtypes:cascadingselectsearcher")
  56. Map<String, Object> inputs = [
  57. issue: issue,
  58. (SplitCustomFieldContext.FIELD_FCS): currentFCS.id as String,
  59. (SplitCustomFieldContext.FIELD_PROJECT_IDS): [jrtwoProj.key as String], // the project to remove from this context
  60. (SplitCustomFieldContext.FIELD_ISSUE_TYPE_IDS): ["1"],
  61. (SplitCustomFieldContext.FIELD_NEW_CONTEXT_NAME): "Some new context name",
  62. ] as Map<String, Object>
  63. def splitCustomFieldContext = new SplitCustomFieldContext()
  64. log.debug splitCustomFieldContext.doValidate(inputs, true)
  65. def outputs = splitCustomFieldContext.doScript(inputs)
  66. log.debug outputs
  67. }
  68. @Test
  69. public void testBasicSelect() {
  70. setUp("SplittableSelect", "com.atlassian.jira.plugin.system.customfieldtypes:select",
  71. "com.atlassian.jira.plugin.system.customfieldtypes:selectsearcher")
  72. Map<String, Object> inputs = [
  73. issue: issue,
  74. (SplitCustomFieldContext.FIELD_FCS): currentFCS.id as String,
  75. (SplitCustomFieldContext.FIELD_PROJECT_IDS): [jrtwoProj.key as String], // the project to remove from this context
  76. (SplitCustomFieldContext.FIELD_ISSUE_TYPE_IDS): ["1"],
  77. (SplitCustomFieldContext.FIELD_NEW_CONTEXT_NAME): "Some new context name",
  78. ] as Map<String, Object>
  79. def splitCustomFieldContext = new SplitCustomFieldContext()
  80. log.debug splitCustomFieldContext.doValidate(inputs, true)
  81. def outputs = splitCustomFieldContext.doScript(inputs)
  82. log.debug outputs
  83. // assertions....
  84. // test the issue has the right value, and that it's the option from the new select list
  85. def cfValue = issue.getCustomFieldValue(cf)
  86. assert cfValue instanceof Option
  87. assertEquals("A", cfValue.value)
  88. def fieldConfig = cf.getRelevantConfig(issue)
  89. assert(cfValue == optionsManager.getOptions(fieldConfig).find {it.value == "A"})
  90. // check that the options are the same
  91. def targetFC = outputs["targetFC"] as FieldConfig
  92. assertEquals optionsManager.getOptions(targetFC)*.value, optionsManager.getOptions(fieldConfig)*.value
  93. // and that we have the same default value
  94. assertEquals(cf.getCustomFieldType().getDefaultValue(targetFC), cf.getCustomFieldType().getDefaultValue(fieldConfig))
  95. // and that the new context is associated with the field
  96. assertEquals([jrtwoProj.key], fieldConfigSchemeManager.getConfigSchemeForFieldConfig(fieldConfig).getAssociatedProjects()*.key)
  97. // and that the original context is no longer associated with the field
  98. assert([jraProj.key] == fieldConfigSchemeManager.getRelevantConfigScheme(new IssueContextImpl(jraProj.id, "1"), cf).getAssociatedProjects()*.key)
  99. }
  100. public void setUp(String cfName, String cfKey, String cfSearcher) {
  101. tearDown() // do first so we can see results
  102. def isCascadingSelect = cfKey.contains("cascadingselect");
  103. log.debug("setup")
  104. // disable warnings about missing custom field types
  105. Category.getInstance(DefaultCustomFieldManager.class).setLevel(Level.OFF)
  106. // create cf assoc'd with 2 projects, create options, update issue, run script, check we have the new option value
  107. cf = createCustomField(cfName, cfKey, cfSearcher)
  108. log.debug(cf.getConfigurationSchemes()*.name)
  109. // associate with both projects
  110. JiraContextTreeManager jiraContextTreeManager = new JiraContextTreeManager(projectManager, ComponentManager.getInstance().getConstantsManager())
  111. List contexts = CustomFieldUtils.buildJiraIssueContexts(
  112. false,
  113. null,
  114. ["JRA", "JRTWO"].collect{projectManager.getProjectObjByKey(it).id} as Long[],
  115. jiraContextTreeManager);
  116. currentFCS = fieldConfigSchemeManager.getConfigSchemesForField(cf).first()
  117. def fieldConfig = currentFCS.getOneAndOnlyConfig()
  118. def configs = ["1": fieldConfig, "2": fieldConfig]
  119. currentFCS = new FieldConfigScheme.Builder(currentFCS).setConfigs(configs).toFieldConfigScheme()
  120. fieldConfigSchemeManager.updateFieldConfigScheme(currentFCS, contexts, cf)
  121. componentManager.getFieldManager().refresh()
  122. // create options
  123. ["A", "B"].each {
  124. optionsManager.createOption(fieldConfig, null, null, it)
  125. }
  126. // create an issue without these custom fields
  127. createIssue("admin", jrtwoProj)
  128. // create issue and set CF value
  129. createIssue("admin", jrtwoProj)
  130. IssueChangeHolder changeHolder = new DefaultIssueChangeHolder()
  131. def Option targetOption = optionsManager.getOptions(fieldConfig).find {it.value == "A"} as Option
  132. log.debug("targetOption: ${targetOption.genericValue}")
  133. if (isCascadingSelect) {
  134. def subOption = optionsManager.createOption(fieldConfig, targetOption.optionId, null, "A1")
  135. // jira 5 wants this different from jira4, fucking PITA
  136. def customFieldParams
  137. if ((BuildUtils.getCurrentBuildNumber() as Long) > 713) {
  138. def cfOptions = [(null): targetOption, "1": subOption]
  139. customFieldParams = cfOptions
  140. }
  141. else {
  142. def cfOptions = [(null): [targetOption], "1": [subOption]]
  143. customFieldParams = new CustomFieldParamsImpl(cf, cfOptions)
  144. }
  145. cf.updateValue(null, issue, new ModifiedValue(null, customFieldParams), changeHolder)
  146. cf.getCustomFieldType().setDefaultValue(fieldConfig, customFieldParams)
  147. }
  148. else {
  149. cf.updateValue(null, issue, new ModifiedValue(null, targetOption), changeHolder)
  150. // set default
  151. cf.getCustomFieldType().setDefaultValue(fieldConfig, optionsManager.getOptions(fieldConfig).getOptionForValue("A", null))
  152. }
  153. boolean wasIndexing = ImportUtils.isIndexIssues();
  154. indexManager.reIndex(issue);
  155. ImportUtils.setIndexIssues(wasIndexing);
  156. }
  157. // @After
  158. public void tearDown() {
  159. ["SplittableSelect", "SplittableCascadingSelectList"].each {
  160. def cf = customFieldManager.getCustomFieldObjectByName(it)
  161. if (cf)
  162. customFieldManager.removeCustomField(cf)
  163. }
  164. deleteAllIssues()
  165. deleteAllIssues(jrtwoProj)
  166. }
  167. }