jiralicious 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ module Jiralicious
2
+ VERSION = "0.0.6"
3
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
+
4
+ describe Jiralicious::Configuration do
5
+ before :each do
6
+ Jiralicious.reset
7
+ end
8
+
9
+ it "sets the options to their default value" do
10
+ Jiralicious.username.should be_nil
11
+ Jiralicious.password.should be_nil
12
+ Jiralicious.uri.should be_nil
13
+ Jiralicious.api_version.should == "latest"
14
+ end
15
+
16
+ it "allows setting of options in a block" do
17
+ Jiralicious.configure do |config|
18
+ config.username = "jstewart"
19
+ config.password = "derp"
20
+ config.uri = "http://example.com/foo/bar"
21
+ config.api_version = "2.0aplha"
22
+ end
23
+
24
+ Jiralicious.username.should == "jstewart"
25
+ Jiralicious.password.should == "derp"
26
+ Jiralicious.uri = "http://example.com/foo/bar"
27
+ Jiralicious.api_version = "2.0aplha"
28
+ end
29
+ end
@@ -0,0 +1,72 @@
1
+ # encoding: utf-8
2
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
+
4
+ class ParserMock
5
+ include Jiralicious::Parsers::FieldParser
6
+
7
+ def initialize(parsed)
8
+ parse!(parsed)
9
+ end
10
+ end
11
+
12
+ describe Jiralicious::Parsers::FieldParser do
13
+ context "parse!" do
14
+ before :each do
15
+ @parsed_data = {
16
+ "testfield" => {"name" => "testfield", "value" => "Test Data"},
17
+ "methods" => {"name" => "methods", "value" => "Test Data 2"},
18
+ "testField" => {"name" => "testField", "value" => "Test Data 3"},
19
+ "test_field_dash" => {"name" => "test-field-dash", "value" => "Test Data 4"},
20
+ "test_field_space" => {"name" => "test field space", "value" => "Test Data 5"},
21
+ "test_field_hash" => {"name" => "test_field_hash", "value" => {"it" => "is a Hash"}},
22
+ "test_field_array" => {"name" => "test_field_array", "value" => ["Not a hash"]},
23
+ "test_field_array_with_hash" => {"name" => "test_field_array_with_hash",
24
+ "value" => [{"try" => "this"}]}
25
+ }
26
+ @parsed_class = ParserMock.new(@parsed_data)
27
+ end
28
+
29
+ it "raises an error when a hash is not passed in" do
30
+ lambda { ParserMock.new }.should raise_error(ArgumentError)
31
+ end
32
+
33
+ it "creates a hash to store data from the fields internally" do
34
+ @parsed_class.instance_variable_get("@jiralicious_field_parser_data").
35
+ should be_instance_of(Hash)
36
+ end
37
+
38
+ context "defining methods" do
39
+ it "defines getter methods on the object it's called in" do
40
+ @parsed_class.testfield.should == "Test Data"
41
+ end
42
+
43
+ it "prefixes a defined method with jira_ when the method already exists" do
44
+ @parsed_class.jira_methods.should == "Test Data 2"
45
+ end
46
+
47
+ it "downcases java idiom method names" do
48
+ @parsed_class.test_field.should == "Test Data 3"
49
+ end
50
+
51
+ it "converts nonword to underscore" do
52
+ @parsed_class.test_field_dash.should == "Test Data 4"
53
+ @parsed_class.test_field_space.should == "Test Data 5"
54
+ end
55
+ end
56
+
57
+ context "mashifying data" do
58
+ it "makes hashes a mash" do
59
+ @parsed_class.test_field_hash.should be_instance_of(Hashie::Mash)
60
+ end
61
+
62
+ it "recursively makes array elements mashes" do
63
+ @parsed_class.test_field_array_with_hash.
64
+ first.should be_instance_of(Hashie::Mash)
65
+ end
66
+
67
+ it "leaves array data alone when it's not a hash" do
68
+ @parsed_class.test_field_array.should == ["Not a hash"]
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,167 @@
1
+ {
2
+ "expand": "html",
3
+ "self": "http://example.com:8080/jira/rest/api/2.0/issue/EX-1",
4
+ "key": "EX-1",
5
+ "fields": {
6
+ "sub-tasks": {
7
+ "name": "sub-tasks",
8
+ "type": "issuelinks",
9
+ "value": [
10
+ {
11
+ "issueKey": "EX-2",
12
+ "issue": "http://example.com:8080/jira/rest/api/2.0/issue/EX-2",
13
+ "type": {
14
+ "name": "Sub-task",
15
+ "direction": "OUTBOUND"
16
+ }
17
+ }
18
+ ]
19
+ },
20
+ "timetracking": {
21
+ "name": "timetracking",
22
+ "type": "timetracking",
23
+ "value": {
24
+ "timeoriginalestimate": 10,
25
+ "timeestimate": 3,
26
+ "timespent": 6
27
+ }
28
+ },
29
+ "project": {
30
+ "name": "project",
31
+ "type": "com.atlassian.jira.project.Project",
32
+ "value": {
33
+ "self": "http://www.example.com/jira/rest/api/2.0/project/EX",
34
+ "key": "EX",
35
+ "name": "Example"
36
+ }
37
+ },
38
+ "updated": {
39
+ "name": "updated",
40
+ "type": "java.util.Date",
41
+ "value": 1
42
+ },
43
+ "description": {
44
+ "name": "description",
45
+ "type": "java.lang.String",
46
+ "value": "example bug report"
47
+ },
48
+ "links": {
49
+ "name": "links",
50
+ "type": "issuelinks",
51
+ "value": [
52
+ {
53
+ "issueKey": "PRJ-2",
54
+ "issue": "http://example.com:8080/jira/rest/api/2.0/issue/PRJ-2",
55
+ "type": {
56
+ "name": "Dependent",
57
+ "direction": "OUTBOUND",
58
+ "description": "depends on"
59
+ }
60
+ },
61
+ {
62
+ "issueKey": "PRJ-3",
63
+ "issue": "http://example.com:8080/jira/rest/api/2.0/issue/PRJ-3",
64
+ "type": {
65
+ "name": "Dependent",
66
+ "direction": "INBOUND",
67
+ "description": "is depended by"
68
+ }
69
+ }
70
+ ]
71
+ },
72
+ "attachment": {
73
+ "name": "attachment",
74
+ "type": "attachment",
75
+ "value": [
76
+ {
77
+ "self": "http://www.example.com/jira/rest/api/2.0/attachments/10000",
78
+ "filename": "picture.jpg",
79
+ "author": {
80
+ "self": "http://www.example.com/jira/rest/api/2.0/user?username=fred",
81
+ "name": "fred",
82
+ "displayName": "Fred F. User",
83
+ "active": false
84
+ },
85
+ "created": "2011-07-25T06:31:08.307-0500",
86
+ "size": 23123,
87
+ "mimeType": "image/jpeg",
88
+ "content": "http://www.example.com/jira/attachments/10000",
89
+ "thumbnail": "http://www.example.com/jira/secure/thumbnail/10000"
90
+ }
91
+ ]
92
+ },
93
+ "watcher": {
94
+ "name": "watcher",
95
+ "type": "watcher",
96
+ "value": {
97
+ "self": "http://www.example.com/jira/rest/api/2.0/issue/EX-1/watchers",
98
+ "isWatching": false,
99
+ "watchCount": 1,
100
+ "watchers": [
101
+ {
102
+ "self": "http://www.example.com/jira/rest/api/2.0/user?username=fred",
103
+ "name": "fred",
104
+ "displayName": "Fred F. User",
105
+ "active": false
106
+ }
107
+ ]
108
+ }
109
+ },
110
+ "comment": {
111
+ "name": "comment",
112
+ "type": "java.lang.String",
113
+ "value": [
114
+ {
115
+ "self": "http://example.com:8080/jira/rest/api/2.0/comment/10000",
116
+ "author": {
117
+ "self": "http://www.example.com/jira/rest/api/2.0/user?username=fred",
118
+ "name": "fred",
119
+ "displayName": "Fred F. User",
120
+ "active": false
121
+ },
122
+ "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque eget venenatis elit. Duis eu justo eget augue iaculis fermentum. Sed semper quam laoreet nisi egestas at posuere augue semper.",
123
+ "updateAuthor": {
124
+ "self": "http://www.example.com/jira/rest/api/2.0/user?username=fred",
125
+ "name": "fred",
126
+ "displayName": "Fred F. User",
127
+ "active": false
128
+ },
129
+ "created": "2011-07-25T06:31:08.311-0500",
130
+ "updated": "2011-07-25T06:31:08.311-0500",
131
+ "visibility": {
132
+ "type": "ROLE",
133
+ "value": "Administrators"
134
+ }
135
+ }
136
+ ]
137
+ },
138
+ "worklog": {
139
+ "name": "worklog",
140
+ "type": "worklog",
141
+ "value": [
142
+ {
143
+ "self": "http://www.example.com/jira/rest/api/2.0/worklog/10000",
144
+ "author": {
145
+ "self": "http://www.example.com/jira/rest/api/2.0/user?username=fred",
146
+ "name": "fred",
147
+ "displayName": "Fred F. User",
148
+ "active": false
149
+ },
150
+ "updateAuthor": {
151
+ "self": "http://www.example.com/jira/rest/api/2.0/user?username=fred",
152
+ "name": "fred",
153
+ "displayName": "Fred F. User",
154
+ "active": false
155
+ },
156
+ "comment": "I did some work here.",
157
+ "visibility": {
158
+ "type": "GROUP",
159
+ "value": "jira-developers"
160
+ },
161
+ "started": "2011-07-25T06:31:08.314-0500",
162
+ "minutesSpent": 180
163
+ }
164
+ ]
165
+ }
166
+ }
167
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "startAt": 0,
3
+ "maxResults": 50,
4
+ "total": 1,
5
+ "issues": [
6
+ {
7
+ "self": "http://www.example.com/jira/rest/api/2.0/jira/rest/api/2.0/issue/HSP-1",
8
+ "key": "HSP-1"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,65 @@
1
+ {
2
+ "2": {
3
+ "name": "Close Issue",
4
+ "fields": [{
5
+ "id": "resolution",
6
+ "required": true,
7
+ "type": "com.atlassian.jira.issue.resolution.Resolution"
8
+ },
9
+ {
10
+ "id": "fixVersions",
11
+ "required": false,
12
+ "type": "com.atlassian.jira.project.version.Version"
13
+ },
14
+ {
15
+ "id": "customfield_10105",
16
+ "required": false,
17
+ "type": "com.atlassian.jira.plugins.jira-importers-plugin:bug-importid"
18
+ },
19
+ {
20
+ "id": "customfield_10106",
21
+ "required": false,
22
+ "type": "com.atlassian.jira.plugin.system.customfieldtypes:textfield"
23
+ },
24
+ {
25
+ "id": "assignee",
26
+ "required": false,
27
+ "type": "com.opensymphony.user.User"
28
+ }],
29
+ "transitionDestination": "6"
30
+ },
31
+ "4": {
32
+ "name": "Start Progress",
33
+ "fields": [],
34
+ "transitionDestination": "3"
35
+ },
36
+ "5": {
37
+ "name": "Resolve Issue",
38
+ "fields": [{
39
+ "id": "resolution",
40
+ "required": true,
41
+ "type": "com.atlassian.jira.issue.resolution.Resolution"
42
+ },
43
+ {
44
+ "id": "fixVersions",
45
+ "required": false,
46
+ "type": "com.atlassian.jira.project.version.Version"
47
+ },
48
+ {
49
+ "id": "customfield_10105",
50
+ "required": false,
51
+ "type": "com.atlassian.jira.plugins.jira-importers-plugin:bug-importid"
52
+ },
53
+ {
54
+ "id": "customfield_10106",
55
+ "required": false,
56
+ "type": "com.atlassian.jira.plugin.system.customfieldtypes:textfield"
57
+ },
58
+ {
59
+ "id": "assignee",
60
+ "required": false,
61
+ "type": "com.opensymphony.user.User"
62
+ }],
63
+ "transitionDestination": "5"
64
+ }
65
+ }
@@ -0,0 +1,96 @@
1
+ # encoding: utf-8
2
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
+
4
+ describe Jiralicious::Issue, "finding" do
5
+
6
+ before :each do
7
+ Jiralicious.configure do |config|
8
+ config.username = "jstewart"
9
+ config.password = "topsecret"
10
+ config.uri = "http://localhost"
11
+ config.api_version = "latest"
12
+ end
13
+
14
+ FakeWeb.register_uri(:get,
15
+ "#{Jiralicious.rest_path}/issue/EX-1",
16
+ :status => "200",
17
+ :body => issue_json)
18
+ end
19
+
20
+ it "finds the issue by key" do
21
+ Jiralicious::Issue.find("EX-1").should be_instance_of(Jiralicious::Issue)
22
+ issue = Jiralicious::Issue.find("EX-1")
23
+ end
24
+
25
+ it "raises an exception when the issue can't be found or can't be viewed" do
26
+ lambda {
27
+ FakeWeb.register_uri(:get,
28
+ "#{Jiralicious.rest_path}/issue/EX-1",
29
+ :status => ["404" "Not Found"])
30
+ Jiralicious::Issue.find("EX-1")
31
+ }.should raise_error(Jiralicious::IssueNotFound)
32
+ end
33
+
34
+ it "translates the JSON properly" do
35
+ issue = Jiralicious::Issue.find("EX-1")
36
+ issue.jira_key.should == "EX-1"
37
+ issue.jira_self.should == "http://example.com:8080/jira/rest/api/2.0/issue/EX-1"
38
+ end
39
+ end
40
+
41
+
42
+ describe Jiralicious::Issue, "transitions" do
43
+
44
+ before :each do
45
+ Jiralicious.configure do |config|
46
+ config.username = "jstewart"
47
+ config.password = "topsecret"
48
+ config.uri = "http://localhost"
49
+ config.api_version = "latest"
50
+ end
51
+
52
+ end
53
+
54
+ it "returns list of possible transitions" do
55
+ FakeWeb.register_uri(:get,
56
+ "#{Jiralicious.rest_path}/issue/EX-1/transitions",
57
+ :status => "200",
58
+ :body => transitions_json)
59
+
60
+ transitions = Jiralicious::Issue.get_transitions("#{Jiralicious.rest_path}/issue/EX-1/transitions")
61
+ transitions.should be_instance_of(Hash)
62
+ end
63
+
64
+ it "performs transition" do
65
+ FakeWeb.register_uri(:post,
66
+ "#{Jiralicious.rest_path}/issue/EX-1/transitions",
67
+ :status => "204",
68
+ :body => nil)
69
+
70
+ result = Jiralicious::Issue.transition("#{Jiralicious.rest_path}/issue/EX-1/transitions",
71
+ {"transition" => "3", "fields" => []})
72
+ result.should be_empty
73
+ end
74
+
75
+ it "raises an exception on transition failure" do
76
+ FakeWeb.register_uri(:post,
77
+ "#{Jiralicious.rest_path}/issue/EX-1/transitions",
78
+ :status => "400",
79
+ :body => %q{{"errorMessages":["Workflow operation is not valid"],"errors":{}}})
80
+ lambda {
81
+ result = Jiralicious::Issue.transition("#{Jiralicious.rest_path}/issue/EX-1/transitions",
82
+ {"transition" => "invalid"})
83
+ }.should raise_error(Jiralicious::TransitionError)
84
+ end
85
+
86
+ it "raises an IssueNotFound exception if issue is not found" do
87
+ FakeWeb.register_uri(:post,
88
+ "#{Jiralicious.rest_path}/issue/EX-1/transitions",
89
+ :status => "404",
90
+ :body => %q{{"errorMessages":["Issue Does Not Exist"],"errors":{}}})
91
+ lambda {
92
+ result = Jiralicious::Issue.transition("#{Jiralicious.rest_path}/issue/EX-1/transitions",
93
+ {"transition" => "invalid"})
94
+ }.should raise_error(Jiralicious::IssueNotFound)
95
+ end
96
+ end