Skip to main content
Example scripts
arrow icon
To homepage
Jira
Data centre icon
Data Center

Transition an Issue when a Zephyr Scale Test Cycle is Updated

Features
Listeners
Created 1 year ago, Updated 2 month(s) ago
App in script
ScriptRunner For Jira
ScriptRunner For Jira
by Adaptavist
Compatibility
compatibility bullet
Jira (7.7 - 8.6)
compatibility bullet
ScriptRunner For Jira (5.6.14)
Language |
groovy
@WithPlugin("com.kanoah.test-manager")
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import com.adaptavist.tm4j.api.event.testcycle.TestCycleChangedEvent
import com.adaptavist.tm4j.api.service.status.StatusService
import com.adaptavist.tm4j.api.service.testcycle.TestCycleService
import com.adaptavist.tm4j.api.service.tracelink.TraceLinkService
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.user.ApplicationUser
import com.opensymphony.workflow.loader.ActionDescriptor
import com.atlassian.jira.issue.Issue

def testCycleService = ComponentAccessor.getOSGiComponentInstanceOfType(TestCycleService)
def statusService = ComponentAccessor.getOSGiComponentInstanceOfType(StatusService)
def currentUser = ComponentAccessor.jiraAuthenticationContext.loggedInUser
def event = event as TestCycleChangedEvent
def testCycleId = event.id
def testCycleModel = testCycleService.getTestCycleModelById(currentUser.key, testCycleId).result
def testCycleStatusId = testCycleModel.statusId
def testCycleStatusModel = statusService.getTestCycleStatusModelById(currentUser.key, testCycleStatusId).result

def doneAction = "Done"
def inProgressAction = "In Progress"
def toDoAction = "To Do"

if (testCycleStatusModel.done) {
    issueTransition(doneAction, currentUser, testCycleId)
} else if (testCycleStatusModel.inProgress) {
    issueTransition(inProgressAction, currentUser, testCycleId)
} else {
    issueTransition(toDoAction, currentUser, testCycleId)
}

def issueTransition(String actionName, ApplicationUser currentUser, Long testCycleId) {
    def issueManager = ComponentAccessor.issueManager
    def issueService = ComponentAccessor.issueService
    def traceLinkService = ComponentAccessor.getOSGiComponentInstanceOfType(TraceLinkService)
    def traceLinks = traceLinkService.getTraceLinkModelsByTestCycleId(currentUser.key, testCycleId).result
    def traceLinksWithIssues = traceLinks.findAll { tl -> tl.issueId != null }
    def issueIds =  traceLinksWithIssues*.issueId
    issueIds.each { issueId ->
        def issue = issueManager.getIssueObject(issueId)
        def action = getAction(actionName, issue)
        if (!action) {
            throw new RuntimeException("Action '$actionName' Not Found")
        }
        def issueInputParameters = issueService.newIssueInputParameters()
        def validateTransition = issueService.validateTransition(currentUser, issue.id, action.id, issueInputParameters)
        if (validateTransition.valid) {
            issueService.transition(currentUser, validateTransition)
        }
    }
}

ActionDescriptor getAction(String actionName, Issue issue) {
    def workflowManager = ComponentAccessor.workflowManager.getWorkflow(issue)
    def actions = workflowManager.getActionsByName(actionName)
    actions.find { action -> action.name == actionName }
}
Having an issue with this script?
Report it here