mirror of
https://github.com/interviewstreet/go-jira.git
synced 2024-11-28 08:39:03 +02:00
80c02828ca
GitHub actions is a workflow engine. This testing workflow will - keep everything inside GitHub (one platform) - reduce dependency to an external service (TravisCI) - introduce stricter testing (next to unit tests, staticcheck, fmt, vet) * fix(tests): TestIssueService_GetEditMeta_Fail fails on windows due to error message checking We check the error string in TestIssueService_GetEditMeta_Fail. On different operting systems, this error message is different. See - Linux: TestIssueService_GetEditMeta_Fail: metaissue_test.go:456: Error Get "http://127.0.0.1:65328/rest/api/2/issue/PROJ-9001/editmeta": dial tcp 127.0.0.1:65328: connect: connection refused - Windows: Error Get "http://127.0.0.1:50122/rest/api/2/issue/PROJ-9001/editmeta": dial tcp 127.0.0.1:50122: connectex: No connection could be made because the target machine actively refused it. Now we check the error type instead of the error message * chore(tests): Support only the current + the last two versions go-jira follows Go's Release Policy for testing. See https://golang.org/doc/devel/release.html#policy Related #290
1079 lines
28 KiB
Go
1079 lines
28 KiB
Go
package jira
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"testing"
|
|
)
|
|
|
|
func TestIssueService_GetCreateMeta_Success(t *testing.T) {
|
|
setup()
|
|
defer teardown()
|
|
|
|
testAPIEndpoint := "/rest/api/2/issue/createmeta"
|
|
|
|
testMux.HandleFunc(testAPIEndpoint, func(w http.ResponseWriter, r *http.Request) {
|
|
testMethod(t, r, "GET")
|
|
testRequestURL(t, r, testAPIEndpoint)
|
|
|
|
fmt.Fprint(w, `{
|
|
"expand": "projects",
|
|
"projects": [{
|
|
"expand": "issuetypes",
|
|
"self": "https://my.jira.com/rest/api/2/project/11300",
|
|
"id": "11300",
|
|
"key": "SPN",
|
|
"name": "Super Project Name",
|
|
"avatarUrls": {
|
|
"48x48": "https://my.jira.com/secure/projectavatar?pid=11300&avatarId=14405",
|
|
"24x24": "https://my.jira.com/secure/projectavatar?size=small&pid=11300&avatarId=14405",
|
|
"16x16": "https://my.jira.com/secure/projectavatar?size=xsmall&pid=11300&avatarId=14405",
|
|
"32x32": "https://my.jira.com/secure/projectavatar?size=medium&pid=11300&avatarId=14405"
|
|
},
|
|
"issuetypes": [{
|
|
"self": "https://my.jira.com/rest/api/2/issuetype/6",
|
|
"id": "6",
|
|
"description": "An issue which ideally should be able to be completed in one step",
|
|
"iconUrl": "https://my.jira.com/secure/viewavatar?size=xsmall&avatarId=14006&avatarType=issuetype",
|
|
"name": "Request",
|
|
"subtask": false,
|
|
"expand": "fields",
|
|
"fields": {
|
|
"summary": {
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"system": "summary"
|
|
},
|
|
"name": "Summary",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
"set"
|
|
]
|
|
},
|
|
"issuetype": {
|
|
"required": true,
|
|
"schema": {
|
|
"type": "issuetype",
|
|
"system": "issuetype"
|
|
},
|
|
"name": "Issue Type",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
|
|
],
|
|
"allowedValues": [{
|
|
"self": "https://my.jira.com/rest/api/2/issuetype/6",
|
|
"id": "6",
|
|
"description": "An issue which ideally should be able to be completed in one step",
|
|
"iconUrl": "https://my.jira.com/secure/viewavatar?size=xsmall&avatarId=14006&avatarType=issuetype",
|
|
"name": "Request",
|
|
"subtask": false,
|
|
"avatarId": 14006
|
|
}]
|
|
},
|
|
"components": {
|
|
"required": true,
|
|
"schema": {
|
|
"type": "array",
|
|
"items": "component",
|
|
"system": "components"
|
|
},
|
|
"name": "Component/s",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
"add",
|
|
"set",
|
|
"remove"
|
|
],
|
|
"allowedValues": [{
|
|
"self": "https://my.jira.com/rest/api/2/component/14144",
|
|
"id": "14144",
|
|
"name": "Build automation",
|
|
"description": "Jenkins, webhooks, etc."
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14149",
|
|
"id": "14149",
|
|
"name": "Caches and noSQL",
|
|
"description": "Cassandra, Memcached, Redis, Twemproxy, Xcache"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14152",
|
|
"id": "14152",
|
|
"name": "Cloud services",
|
|
"description": "AWS and similar services"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14147",
|
|
"id": "14147",
|
|
"name": "Code quality tools",
|
|
"description": "Code sniffer, Sonar"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14156",
|
|
"id": "14156",
|
|
"name": "Configuration management and provisioning",
|
|
"description": "Apache/PHP modules, Consul, Salt"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/13606",
|
|
"id": "13606",
|
|
"name": "Cronjobs",
|
|
"description": "Cronjobs in general"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14150",
|
|
"id": "14150",
|
|
"name": "Data pipelines and queues",
|
|
"description": "Kafka, RabbitMq"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14159",
|
|
"id": "14159",
|
|
"name": "Database",
|
|
"description": "MySQL related problems"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14314",
|
|
"id": "14314",
|
|
"name": "Documentation"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14151",
|
|
"id": "14151",
|
|
"name": "Git",
|
|
"description": "Bitbucket, GitHub, GitLab, Git in general"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14155",
|
|
"id": "14155",
|
|
"name": "HTTP services",
|
|
"description": "CDN, HaProxy, HTTP, Varnish"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14154",
|
|
"id": "14154",
|
|
"name": "Job and service scheduling",
|
|
"description": "Chronos, Docker, Marathon, Mesos"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14158",
|
|
"id": "14158",
|
|
"name": "Legacy",
|
|
"description": "Everything related to legacy"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14157",
|
|
"id": "14157",
|
|
"name": "Monitoring",
|
|
"description": "Collectd, Nagios, Monitoring in general"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14148",
|
|
"id": "14148",
|
|
"name": "Other services"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/13602",
|
|
"id": "13602",
|
|
"name": "Package management",
|
|
"description": "Composer, Medusa, Satis"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14145",
|
|
"id": "14145",
|
|
"name": "Release",
|
|
"description": "Directory config, release queries, rewrite rules"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14146",
|
|
"id": "14146",
|
|
"name": "Staging systems and VMs",
|
|
"description": "Stage, QA machines, KVMs,Vagrant"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14153",
|
|
"id": "14153",
|
|
"name": "Blog"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14143",
|
|
"id": "14143",
|
|
"name": "Test automation",
|
|
"description": "Testing infrastructure in general"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14221",
|
|
"id": "14221",
|
|
"name": "Internal Infrastructure"
|
|
}]
|
|
},
|
|
"attachment": {
|
|
"required": false,
|
|
"schema": {
|
|
"type": "array",
|
|
"items": "attachment",
|
|
"system": "attachment"
|
|
},
|
|
"name": "Attachment",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
|
|
]
|
|
},
|
|
"duedate": {
|
|
"required": false,
|
|
"schema": {
|
|
"type": "date",
|
|
"system": "duedate"
|
|
},
|
|
"name": "Due Date",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
"set"
|
|
]
|
|
},
|
|
"description": {
|
|
"required": false,
|
|
"schema": {
|
|
"type": "string",
|
|
"system": "description"
|
|
},
|
|
"name": "Description",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
"set"
|
|
]
|
|
},
|
|
"customfield_10806": {
|
|
"required": false,
|
|
"schema": {
|
|
"type": "any",
|
|
"custom": "com.pyxis.greenhopper.jira:gh-epic-link",
|
|
"customId": 10806
|
|
},
|
|
"name": "Epic Link",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
"set"
|
|
]
|
|
},
|
|
"project": {
|
|
"required": true,
|
|
"schema": {
|
|
"type": "project",
|
|
"system": "project"
|
|
},
|
|
"name": "Project",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
"set"
|
|
],
|
|
"allowedValues": [{
|
|
"self": "https://my.jira.com/rest/api/2/project/11300",
|
|
"id": "11300",
|
|
"key": "SPN",
|
|
"name": "Super Project Name",
|
|
"avatarUrls": {
|
|
"48x48": "https://my.jira.com/secure/projectavatar?pid=11300&avatarId=14405",
|
|
"24x24": "https://my.jira.com/secure/projectavatar?size=small&pid=11300&avatarId=14405",
|
|
"16x16": "https://my.jira.com/secure/projectavatar?size=xsmall&pid=11300&avatarId=14405",
|
|
"32x32": "https://my.jira.com/secure/projectavatar?size=medium&pid=11300&avatarId=14405"
|
|
},
|
|
"projectCategory": {
|
|
"self": "https://my.jira.com/rest/api/2/projectCategory/10100",
|
|
"id": "10100",
|
|
"description": "",
|
|
"name": "Product & Development"
|
|
}
|
|
}]
|
|
},
|
|
"assignee": {
|
|
"required": true,
|
|
"schema": {
|
|
"type": "user",
|
|
"system": "assignee"
|
|
},
|
|
"name": "Assignee",
|
|
"autoCompleteUrl": "https://my.jira.com/rest/api/latest/user/assignable/search?issueKey=null&username=",
|
|
"hasDefaultValue": true,
|
|
"operations": [
|
|
"set"
|
|
]
|
|
},
|
|
"priority": {
|
|
"required": false,
|
|
"schema": {
|
|
"type": "priority",
|
|
"system": "priority"
|
|
},
|
|
"name": "Priority",
|
|
"hasDefaultValue": true,
|
|
"operations": [
|
|
"set"
|
|
],
|
|
"allowedValues": [{
|
|
"self": "https://my.jira.com/rest/api/2/priority/1",
|
|
"iconUrl": "https://my.jira.com/images/icons/priorities/blocker.svg",
|
|
"name": "Immediate",
|
|
"id": "1"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/priority/2",
|
|
"iconUrl": "https://my.jira.com/images/icons/priorities/critical.svg",
|
|
"name": "Urgent",
|
|
"id": "2"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/priority/3",
|
|
"iconUrl": "https://my.jira.com/images/icons/priorities/major.svg",
|
|
"name": "High",
|
|
"id": "3"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/priority/6",
|
|
"iconUrl": "https://my.jira.com/images/icons/priorities/moderate.svg",
|
|
"name": "Moderate",
|
|
"id": "6"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/priority/4",
|
|
"iconUrl": "https://my.jira.com/images/icons/priorities/minor.svg",
|
|
"name": "Normal",
|
|
"id": "4"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/priority/5",
|
|
"iconUrl": "https://my.jira.com/images/icons/priorities/trivial.svg",
|
|
"name": "Low",
|
|
"id": "5"
|
|
}]
|
|
},
|
|
"labels": {
|
|
"required": false,
|
|
"schema": {
|
|
"type": "array",
|
|
"items": "string",
|
|
"system": "labels"
|
|
},
|
|
"name": "Labels",
|
|
"autoCompleteUrl": "https://my.jira.com/rest/api/1.0/labels/suggest?query=",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
"add",
|
|
"set",
|
|
"remove"
|
|
]
|
|
}
|
|
}
|
|
}]
|
|
}]
|
|
}`)
|
|
})
|
|
|
|
issue, _, err := testClient.Issue.GetCreateMeta("SPN")
|
|
if err != nil {
|
|
t.Errorf("Expected nil error but got %s", err)
|
|
}
|
|
|
|
if len(issue.Projects) != 1 {
|
|
t.Errorf("Expected 1 project, got %d", len(issue.Projects))
|
|
}
|
|
for _, project := range issue.Projects {
|
|
if len(project.IssueTypes) != 1 {
|
|
t.Errorf("Expected 1 issueTypes, got %d", len(project.IssueTypes))
|
|
}
|
|
for _, issueTypes := range project.IssueTypes {
|
|
requiredFields := 0
|
|
fields := issueTypes.Fields
|
|
for _, value := range fields {
|
|
for key, value := range value.(map[string]interface{}) {
|
|
if key == "required" && value == true {
|
|
requiredFields = requiredFields + 1
|
|
}
|
|
}
|
|
|
|
}
|
|
if requiredFields != 5 {
|
|
t.Errorf("Expected 5 required fields from Create Meta information, got %d", requiredFields)
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
func TestIssueService_GetEditMeta_Success(t *testing.T) {
|
|
setup()
|
|
defer teardown()
|
|
|
|
testAPIEndpoint := "/rest/api/2/issue/PROJ-9001/editmeta"
|
|
|
|
testMux.HandleFunc(testAPIEndpoint, func(w http.ResponseWriter, r *http.Request) {
|
|
testMethod(t, r, "GET")
|
|
testRequestURL(t, r, testAPIEndpoint)
|
|
|
|
fmt.Fprint(w, `{
|
|
"fields": {
|
|
"summary": {
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"system": "summary"
|
|
},
|
|
"name": "Summary",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
"set"
|
|
]
|
|
},
|
|
"attachment": {
|
|
"required": false,
|
|
"schema": {
|
|
"type": "array",
|
|
"items": "attachment",
|
|
"system": "attachment"
|
|
},
|
|
"name": "Attachment",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
|
|
]
|
|
}
|
|
}
|
|
}`)
|
|
})
|
|
|
|
editMeta, _, err := testClient.Issue.GetEditMeta(&Issue{Key: "PROJ-9001"})
|
|
if err != nil {
|
|
t.Errorf("Expected nil error but got %s", err)
|
|
}
|
|
|
|
requiredFields := 0
|
|
fields := editMeta.Fields
|
|
for _, value := range fields {
|
|
for key, value := range value.(map[string]interface{}) {
|
|
if key == "required" && value == true {
|
|
requiredFields = requiredFields + 1
|
|
}
|
|
}
|
|
|
|
}
|
|
summary := fields["summary"].(map[string]interface{})
|
|
attachment := fields["attachment"].(map[string]interface{})
|
|
if summary["required"] != true {
|
|
t.Error("Expected summary to be required")
|
|
}
|
|
if attachment["required"] != false {
|
|
t.Error("Expected attachment to not be required")
|
|
}
|
|
}
|
|
|
|
func TestIssueService_GetEditMeta_Fail(t *testing.T) {
|
|
_, _, err := testClient.Issue.GetEditMeta(&Issue{Key: "PROJ-9001"})
|
|
if err == nil {
|
|
t.Error("Expected to receive an error, received nil instead")
|
|
}
|
|
|
|
if _, ok := err.(*url.Error); !ok {
|
|
t.Errorf("Expected to receive an *url.Error, got %T instead", err)
|
|
}
|
|
}
|
|
|
|
func TestMetaIssueType_GetCreateMetaWithOptions(t *testing.T) {
|
|
setup()
|
|
defer teardown()
|
|
|
|
testAPIEndpoint := "/rest/api/2/issue/createmeta"
|
|
|
|
testMux.HandleFunc(testAPIEndpoint, func(w http.ResponseWriter, r *http.Request) {
|
|
testMethod(t, r, "GET")
|
|
testRequestURL(t, r, testAPIEndpoint)
|
|
|
|
fmt.Fprint(w, `{
|
|
"expand": "projects",
|
|
"projects": [{
|
|
"expand": "issuetypes",
|
|
"self": "https://my.jira.com/rest/api/2/project/11300",
|
|
"id": "11300",
|
|
"key": "SPN",
|
|
"name": "Super Project Name",
|
|
"avatarUrls": {
|
|
"48x48": "https://my.jira.com/secure/projectavatar?pid=11300&avatarId=14405",
|
|
"24x24": "https://my.jira.com/secure/projectavatar?size=small&pid=11300&avatarId=14405",
|
|
"16x16": "https://my.jira.com/secure/projectavatar?size=xsmall&pid=11300&avatarId=14405",
|
|
"32x32": "https://my.jira.com/secure/projectavatar?size=medium&pid=11300&avatarId=14405"
|
|
},
|
|
"issuetypes": [{
|
|
"self": "https://my.jira.com/rest/api/2/issuetype/6",
|
|
"id": "6",
|
|
"description": "An issue which ideally should be able to be completed in one step",
|
|
"iconUrl": "https://my.jira.com/secure/viewavatar?size=xsmall&avatarId=14006&avatarType=issuetype",
|
|
"name": "Request",
|
|
"subtask": false,
|
|
"expand": "fields",
|
|
"fields": {
|
|
"summary": {
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"system": "summary"
|
|
},
|
|
"name": "Summary",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
"set"
|
|
]
|
|
},
|
|
"issuetype": {
|
|
"required": true,
|
|
"schema": {
|
|
"type": "issuetype",
|
|
"system": "issuetype"
|
|
},
|
|
"name": "Issue Type",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
|
|
],
|
|
"allowedValues": [{
|
|
"self": "https://my.jira.com/rest/api/2/issuetype/6",
|
|
"id": "6",
|
|
"description": "An issue which ideally should be able to be completed in one step",
|
|
"iconUrl": "https://my.jira.com/secure/viewavatar?size=xsmall&avatarId=14006&avatarType=issuetype",
|
|
"name": "Request",
|
|
"subtask": false,
|
|
"avatarId": 14006
|
|
}]
|
|
},
|
|
"components": {
|
|
"required": true,
|
|
"schema": {
|
|
"type": "array",
|
|
"items": "component",
|
|
"system": "components"
|
|
},
|
|
"name": "Component/s",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
"add",
|
|
"set",
|
|
"remove"
|
|
],
|
|
"allowedValues": [{
|
|
"self": "https://my.jira.com/rest/api/2/component/14144",
|
|
"id": "14144",
|
|
"name": "Build automation",
|
|
"description": "Jenkins, webhooks, etc."
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14149",
|
|
"id": "14149",
|
|
"name": "Caches and noSQL",
|
|
"description": "Cassandra, Memcached, Redis, Twemproxy, Xcache"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14152",
|
|
"id": "14152",
|
|
"name": "Cloud services",
|
|
"description": "AWS and similar services"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14147",
|
|
"id": "14147",
|
|
"name": "Code quality tools",
|
|
"description": "Code sniffer, Sonar"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14156",
|
|
"id": "14156",
|
|
"name": "Configuration management and provisioning",
|
|
"description": "Apache/PHP modules, Consul, Salt"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/13606",
|
|
"id": "13606",
|
|
"name": "Cronjobs",
|
|
"description": "Cronjobs in general"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14150",
|
|
"id": "14150",
|
|
"name": "Data pipelines and queues",
|
|
"description": "Kafka, RabbitMq"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14159",
|
|
"id": "14159",
|
|
"name": "Database",
|
|
"description": "MySQL related problems"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14314",
|
|
"id": "14314",
|
|
"name": "Documentation"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14151",
|
|
"id": "14151",
|
|
"name": "Git",
|
|
"description": "Bitbucket, GitHub, GitLab, Git in general"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14155",
|
|
"id": "14155",
|
|
"name": "HTTP services",
|
|
"description": "CDN, HaProxy, HTTP, Varnish"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14154",
|
|
"id": "14154",
|
|
"name": "Job and service scheduling",
|
|
"description": "Chronos, Docker, Marathon, Mesos"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14158",
|
|
"id": "14158",
|
|
"name": "Legacy",
|
|
"description": "Everything related to legacy"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14157",
|
|
"id": "14157",
|
|
"name": "Monitoring",
|
|
"description": "Collectd, Nagios, Monitoring in general"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14148",
|
|
"id": "14148",
|
|
"name": "Other services"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/13602",
|
|
"id": "13602",
|
|
"name": "Package management",
|
|
"description": "Composer, Medusa, Satis"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14145",
|
|
"id": "14145",
|
|
"name": "Release",
|
|
"description": "Directory config, release queries, rewrite rules"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14146",
|
|
"id": "14146",
|
|
"name": "Staging systems and VMs",
|
|
"description": "Stage, QA machines, KVMs,Vagrant"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14153",
|
|
"id": "14153",
|
|
"name": "Blog"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14143",
|
|
"id": "14143",
|
|
"name": "Test automation",
|
|
"description": "Testing infrastructure in general"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/component/14221",
|
|
"id": "14221",
|
|
"name": "Internal Infrastructure"
|
|
}]
|
|
},
|
|
"attachment": {
|
|
"required": false,
|
|
"schema": {
|
|
"type": "array",
|
|
"items": "attachment",
|
|
"system": "attachment"
|
|
},
|
|
"name": "Attachment",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
|
|
]
|
|
},
|
|
"duedate": {
|
|
"required": false,
|
|
"schema": {
|
|
"type": "date",
|
|
"system": "duedate"
|
|
},
|
|
"name": "Due Date",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
"set"
|
|
]
|
|
},
|
|
"description": {
|
|
"required": false,
|
|
"schema": {
|
|
"type": "string",
|
|
"system": "description"
|
|
},
|
|
"name": "Description",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
"set"
|
|
]
|
|
},
|
|
"customfield_10806": {
|
|
"required": false,
|
|
"schema": {
|
|
"type": "any",
|
|
"custom": "com.pyxis.greenhopper.jira:gh-epic-link",
|
|
"customId": 10806
|
|
},
|
|
"name": "Epic Link",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
"set"
|
|
]
|
|
},
|
|
"project": {
|
|
"required": true,
|
|
"schema": {
|
|
"type": "project",
|
|
"system": "project"
|
|
},
|
|
"name": "Project",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
"set"
|
|
],
|
|
"allowedValues": [{
|
|
"self": "https://my.jira.com/rest/api/2/project/11300",
|
|
"id": "11300",
|
|
"key": "SPN",
|
|
"name": "Super Project Name",
|
|
"avatarUrls": {
|
|
"48x48": "https://my.jira.com/secure/projectavatar?pid=11300&avatarId=14405",
|
|
"24x24": "https://my.jira.com/secure/projectavatar?size=small&pid=11300&avatarId=14405",
|
|
"16x16": "https://my.jira.com/secure/projectavatar?size=xsmall&pid=11300&avatarId=14405",
|
|
"32x32": "https://my.jira.com/secure/projectavatar?size=medium&pid=11300&avatarId=14405"
|
|
},
|
|
"projectCategory": {
|
|
"self": "https://my.jira.com/rest/api/2/projectCategory/10100",
|
|
"id": "10100",
|
|
"description": "",
|
|
"name": "Product & Development"
|
|
}
|
|
}]
|
|
},
|
|
"assignee": {
|
|
"required": true,
|
|
"schema": {
|
|
"type": "user",
|
|
"system": "assignee"
|
|
},
|
|
"name": "Assignee",
|
|
"autoCompleteUrl": "https://my.jira.com/rest/api/latest/user/assignable/search?issueKey=null&username=",
|
|
"hasDefaultValue": true,
|
|
"operations": [
|
|
"set"
|
|
]
|
|
},
|
|
"priority": {
|
|
"required": false,
|
|
"schema": {
|
|
"type": "priority",
|
|
"system": "priority"
|
|
},
|
|
"name": "Priority",
|
|
"hasDefaultValue": true,
|
|
"operations": [
|
|
"set"
|
|
],
|
|
"allowedValues": [{
|
|
"self": "https://my.jira.com/rest/api/2/priority/1",
|
|
"iconUrl": "https://my.jira.com/images/icons/priorities/blocker.svg",
|
|
"name": "Immediate",
|
|
"id": "1"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/priority/2",
|
|
"iconUrl": "https://my.jira.com/images/icons/priorities/critical.svg",
|
|
"name": "Urgent",
|
|
"id": "2"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/priority/3",
|
|
"iconUrl": "https://my.jira.com/images/icons/priorities/major.svg",
|
|
"name": "High",
|
|
"id": "3"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/priority/6",
|
|
"iconUrl": "https://my.jira.com/images/icons/priorities/moderate.svg",
|
|
"name": "Moderate",
|
|
"id": "6"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/priority/4",
|
|
"iconUrl": "https://my.jira.com/images/icons/priorities/minor.svg",
|
|
"name": "Normal",
|
|
"id": "4"
|
|
}, {
|
|
"self": "https://my.jira.com/rest/api/2/priority/5",
|
|
"iconUrl": "https://my.jira.com/images/icons/priorities/trivial.svg",
|
|
"name": "Low",
|
|
"id": "5"
|
|
}]
|
|
},
|
|
"labels": {
|
|
"required": false,
|
|
"schema": {
|
|
"type": "array",
|
|
"items": "string",
|
|
"system": "labels"
|
|
},
|
|
"name": "Labels",
|
|
"autoCompleteUrl": "https://my.jira.com/rest/api/1.0/labels/suggest?query=",
|
|
"hasDefaultValue": false,
|
|
"operations": [
|
|
"add",
|
|
"set",
|
|
"remove"
|
|
]
|
|
}
|
|
}
|
|
}]
|
|
}]
|
|
}`)
|
|
})
|
|
|
|
issue, _, err := testClient.Issue.GetCreateMetaWithOptions(&GetQueryOptions{Expand: "projects.issuetypes.fields"})
|
|
if err != nil {
|
|
t.Errorf("Expected nil error but got %s", err)
|
|
}
|
|
|
|
if len(issue.Projects) != 1 {
|
|
t.Errorf("Expected 1 project, got %d", len(issue.Projects))
|
|
}
|
|
for _, project := range issue.Projects {
|
|
if len(project.IssueTypes) != 1 {
|
|
t.Errorf("Expected 1 issueTypes, got %d", len(project.IssueTypes))
|
|
}
|
|
for _, issueTypes := range project.IssueTypes {
|
|
requiredFields := 0
|
|
fields := issueTypes.Fields
|
|
for _, value := range fields {
|
|
for key, value := range value.(map[string]interface{}) {
|
|
if key == "required" && value == true {
|
|
requiredFields = requiredFields + 1
|
|
}
|
|
}
|
|
|
|
}
|
|
if requiredFields != 5 {
|
|
t.Errorf("Expected 5 required fields from Create Meta information, got %d", requiredFields)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestMetaIssueType_GetMandatoryFields(t *testing.T) {
|
|
data := make(map[string]interface{})
|
|
|
|
data["summary"] = map[string]interface{}{
|
|
"required": true,
|
|
"name": "Summary",
|
|
}
|
|
|
|
data["components"] = map[string]interface{}{
|
|
"required": true,
|
|
"name": "Components",
|
|
}
|
|
|
|
data["epicLink"] = map[string]interface{}{
|
|
"required": false,
|
|
"name": "Epic Link",
|
|
}
|
|
|
|
m := new(MetaIssueType)
|
|
m.Fields = data
|
|
|
|
mandatory, err := m.GetMandatoryFields()
|
|
if err != nil {
|
|
t.Errorf("Expected nil error, received %s", err)
|
|
}
|
|
|
|
if len(mandatory) != 2 {
|
|
t.Errorf("Expected 2 received %+v", mandatory)
|
|
}
|
|
}
|
|
|
|
func TestMetaIssueType_GetMandatoryFields_NonExistentRequiredKey_Fail(t *testing.T) {
|
|
data := make(map[string]interface{})
|
|
|
|
data["summary"] = map[string]interface{}{
|
|
"name": "Summary",
|
|
}
|
|
|
|
m := new(MetaIssueType)
|
|
m.Fields = data
|
|
|
|
_, err := m.GetMandatoryFields()
|
|
if err == nil {
|
|
t.Error("Expected non nil errpr, received nil")
|
|
}
|
|
}
|
|
|
|
func TestMetaIssueType_GetMandatoryFields_NonExistentNameKey_Fail(t *testing.T) {
|
|
data := make(map[string]interface{})
|
|
|
|
data["summary"] = map[string]interface{}{
|
|
"required": true,
|
|
}
|
|
|
|
m := new(MetaIssueType)
|
|
m.Fields = data
|
|
|
|
_, err := m.GetMandatoryFields()
|
|
if err == nil {
|
|
t.Error("Expected non nil errpr, received nil")
|
|
}
|
|
}
|
|
|
|
func TestMetaIssueType_GetAllFields(t *testing.T) {
|
|
data := make(map[string]interface{})
|
|
|
|
data["summary"] = map[string]interface{}{
|
|
"required": true,
|
|
"name": "Summary",
|
|
}
|
|
|
|
data["components"] = map[string]interface{}{
|
|
"required": true,
|
|
"name": "Components",
|
|
}
|
|
|
|
data["epicLink"] = map[string]interface{}{
|
|
"required": false,
|
|
"name": "Epic Link",
|
|
}
|
|
|
|
m := new(MetaIssueType)
|
|
m.Fields = data
|
|
|
|
mandatory, err := m.GetAllFields()
|
|
|
|
if err != nil {
|
|
t.Errorf("Expected nil err, received %s", err)
|
|
}
|
|
|
|
if len(mandatory) != 3 {
|
|
t.Errorf("Expected 3 received %+v", mandatory)
|
|
}
|
|
}
|
|
|
|
func TestMetaIssueType_GetAllFields_NonExistingNameKey_Fail(t *testing.T) {
|
|
data := make(map[string]interface{})
|
|
|
|
data["summary"] = map[string]interface{}{
|
|
"required": true,
|
|
}
|
|
|
|
m := new(MetaIssueType)
|
|
m.Fields = data
|
|
|
|
_, err := m.GetAllFields()
|
|
if err == nil {
|
|
t.Error("Expected non nil error, received nil")
|
|
}
|
|
}
|
|
|
|
func TestMetaIssueType_CheckCompleteAndAvailable_MandatoryMissing(t *testing.T) {
|
|
data := make(map[string]interface{})
|
|
|
|
data["summary"] = map[string]interface{}{
|
|
"required": true,
|
|
"name": "Summary",
|
|
}
|
|
|
|
data["someKey"] = map[string]interface{}{
|
|
"required": false,
|
|
"name": "SomeKey",
|
|
}
|
|
|
|
config := map[string]string{
|
|
"SomeKey": "somevalue",
|
|
}
|
|
|
|
m := new(MetaIssueType)
|
|
m.Fields = data
|
|
|
|
ok, err := m.CheckCompleteAndAvailable(config)
|
|
if err == nil {
|
|
t.Error("Expected non nil error. Received nil")
|
|
}
|
|
|
|
if ok != false {
|
|
t.Error("Expected false, got true")
|
|
}
|
|
|
|
}
|
|
|
|
func TestMetaIssueType_CheckCompleteAndAvailable_NotAvailable(t *testing.T) {
|
|
data := make(map[string]interface{})
|
|
|
|
data["summary"] = map[string]interface{}{
|
|
"required": true,
|
|
"name": "Summary",
|
|
}
|
|
|
|
config := map[string]string{
|
|
"Summary": "Issue Summary",
|
|
"SomeKey": "somevalue",
|
|
}
|
|
|
|
m := new(MetaIssueType)
|
|
m.Fields = data
|
|
|
|
ok, err := m.CheckCompleteAndAvailable(config)
|
|
if err == nil {
|
|
t.Error("Expected non nil error. Received nil")
|
|
}
|
|
|
|
if ok != false {
|
|
t.Error("Expected false, got true")
|
|
}
|
|
|
|
}
|
|
|
|
func TestMetaIssueType_CheckCompleteAndAvailable_Success(t *testing.T) {
|
|
data := make(map[string]interface{})
|
|
|
|
data["summary"] = map[string]interface{}{
|
|
"required": true,
|
|
"name": "Summary",
|
|
}
|
|
|
|
data["someKey"] = map[string]interface{}{
|
|
"required": false,
|
|
"name": "SomeKey",
|
|
}
|
|
|
|
config := map[string]string{
|
|
"SomeKey": "somevalue",
|
|
"Summary": "Issue summary",
|
|
}
|
|
|
|
m := new(MetaIssueType)
|
|
m.Fields = data
|
|
|
|
ok, err := m.CheckCompleteAndAvailable(config)
|
|
if err != nil {
|
|
t.Errorf("Expected nil error. Received %s", err)
|
|
}
|
|
|
|
if ok != true {
|
|
t.Error("Expected true, got false")
|
|
}
|
|
|
|
}
|
|
|
|
func TestCreateMetaInfo_GetProjectWithName_Success(t *testing.T) {
|
|
metainfo := new(CreateMetaInfo)
|
|
metainfo.Projects = append(metainfo.Projects, &MetaProject{
|
|
Name: "SPN",
|
|
})
|
|
|
|
project := metainfo.GetProjectWithName("SPN")
|
|
if project == nil {
|
|
t.Errorf("Expected non nil value, received nil")
|
|
}
|
|
}
|
|
|
|
func TestMetaProject_GetIssueTypeWithName_CaseMismatch_Success(t *testing.T) {
|
|
m := new(MetaProject)
|
|
m.IssueTypes = append(m.IssueTypes, &MetaIssueType{
|
|
Name: "Bug",
|
|
})
|
|
|
|
issuetype := m.GetIssueTypeWithName("BUG")
|
|
|
|
if issuetype == nil {
|
|
t.Errorf("Expected non nil value, received nil")
|
|
}
|
|
}
|
|
|
|
func TestCreateMetaInfo_GetProjectWithKey_Success(t *testing.T) {
|
|
metainfo := new(CreateMetaInfo)
|
|
metainfo.Projects = append(metainfo.Projects, &MetaProject{
|
|
Key: "SPNKEY",
|
|
})
|
|
|
|
project := metainfo.GetProjectWithKey("SPNKEY")
|
|
if project == nil {
|
|
t.Errorf("Expected non nil value, received nil")
|
|
}
|
|
}
|
|
|
|
func TestCreateMetaInfo_GetProjectWithKey_NilForNonExistent(t *testing.T) {
|
|
metainfo := new(CreateMetaInfo)
|
|
metainfo.Projects = append(metainfo.Projects, &MetaProject{
|
|
Key: "SPNKEY",
|
|
})
|
|
|
|
project := metainfo.GetProjectWithKey("SPN")
|
|
if project != nil {
|
|
t.Errorf("Expected nil, received value")
|
|
}
|
|
}
|