confuddle 0.0.1
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.
- data/.gitignore +18 -0
- data/.passwd_to_unfuddle.example.yml +7 -0
- data/README.md +40 -0
- data/bin/un +833 -0
- data/bin/un.cmd +1 -0
- data/confuddle.gemspec +22 -0
- data/lib/graft/README.rdoc +138 -0
- data/lib/graft/Rakefile +43 -0
- data/lib/graft/lib/graft/core_ext/hash.rb +9 -0
- data/lib/graft/lib/graft/json.rb +14 -0
- data/lib/graft/lib/graft/json/attribute.rb +18 -0
- data/lib/graft/lib/graft/json/model.rb +28 -0
- data/lib/graft/lib/graft/model.rb +43 -0
- data/lib/graft/lib/graft/version.rb +13 -0
- data/lib/graft/lib/graft/xml.rb +19 -0
- data/lib/graft/lib/graft/xml/attribute.rb +55 -0
- data/lib/graft/lib/graft/xml/model.rb +49 -0
- data/lib/graft/lib/graft/xml/type.rb +91 -0
- data/lib/graft/test/test_helper.rb +38 -0
- data/lib/graft/test/unit/core_ext/hash_test.rb +29 -0
- data/lib/graft/test/unit/json/attribute_test.rb +51 -0
- data/lib/graft/test/unit/json/model_test.rb +86 -0
- data/lib/graft/test/unit/xml/attribute_test.rb +161 -0
- data/lib/graft/test/unit/xml/model_test.rb +173 -0
- data/lib/graft/test/unit/xml/type_test.rb +65 -0
- data/lib/unfuzzle/.gitignore +4 -0
- data/lib/unfuzzle/README.rdoc +129 -0
- data/lib/unfuzzle/Rakefile +39 -0
- data/lib/unfuzzle/lib/unfuzzle.rb +87 -0
- data/lib/unfuzzle/lib/unfuzzle/comment.rb +37 -0
- data/lib/unfuzzle/lib/unfuzzle/component.rb +31 -0
- data/lib/unfuzzle/lib/unfuzzle/milestone.rb +54 -0
- data/lib/unfuzzle/lib/unfuzzle/person.rb +20 -0
- data/lib/unfuzzle/lib/unfuzzle/priority.rb +30 -0
- data/lib/unfuzzle/lib/unfuzzle/project.rb +62 -0
- data/lib/unfuzzle/lib/unfuzzle/request.rb +75 -0
- data/lib/unfuzzle/lib/unfuzzle/response.rb +25 -0
- data/lib/unfuzzle/lib/unfuzzle/severity.rb +31 -0
- data/lib/unfuzzle/lib/unfuzzle/ticket.rb +156 -0
- data/lib/unfuzzle/lib/unfuzzle/ticket_report.rb +29 -0
- data/lib/unfuzzle/lib/unfuzzle/time_entry.rb +75 -0
- data/lib/unfuzzle/lib/unfuzzle/version.rb +13 -0
- data/lib/unfuzzle/test/fixtures/component.xml +8 -0
- data/lib/unfuzzle/test/fixtures/components.xml +17 -0
- data/lib/unfuzzle/test/fixtures/milestone.xml +12 -0
- data/lib/unfuzzle/test/fixtures/milestones.xml +25 -0
- data/lib/unfuzzle/test/fixtures/project.xml +17 -0
- data/lib/unfuzzle/test/fixtures/projects.xml +35 -0
- data/lib/unfuzzle/test/fixtures/severities.xml +24 -0
- data/lib/unfuzzle/test/fixtures/severity.xml +8 -0
- data/lib/unfuzzle/test/fixtures/ticket.xml +25 -0
- data/lib/unfuzzle/test/fixtures/tickets.xml +51 -0
- data/lib/unfuzzle/test/test_helper.rb +60 -0
- data/lib/unfuzzle/test/unit/unfuzzle/component_test.rb +36 -0
- data/lib/unfuzzle/test/unit/unfuzzle/milestone_test.rb +100 -0
- data/lib/unfuzzle/test/unit/unfuzzle/priority_test.rb +25 -0
- data/lib/unfuzzle/test/unit/unfuzzle/project_test.rb +87 -0
- data/lib/unfuzzle/test/unit/unfuzzle/request_test.rb +104 -0
- data/lib/unfuzzle/test/unit/unfuzzle/response_test.rb +37 -0
- data/lib/unfuzzle/test/unit/unfuzzle/severity_test.rb +36 -0
- data/lib/unfuzzle/test/unit/unfuzzle/ticket_test.rb +181 -0
- data/lib/unfuzzle/test/unit/unfuzzle_test.rb +39 -0
- data/lib/unfuzzle/unfuzzle.gemspec +31 -0
- data/lib/version.rb +3 -0
- metadata +176 -0
@@ -0,0 +1,100 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module Unfuzzle
|
4
|
+
class MilestoneTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "The Milestone class" do
|
7
|
+
|
8
|
+
should "be able to find all by project ID" do
|
9
|
+
project_id = 1
|
10
|
+
|
11
|
+
response = mock_request_cycle :for => "/projects/#{project_id}/milestones", :data => 'milestones'
|
12
|
+
|
13
|
+
Unfuzzle::Milestone.expects(:collection_from).with(response.body, 'milestones/milestone').returns(['milestone_1', 'milestone_2'])
|
14
|
+
|
15
|
+
Milestone.find_all_by_project_id(project_id).should == ['milestone_1', 'milestone_2']
|
16
|
+
end
|
17
|
+
|
18
|
+
should "be able to find one by project ID an milestone ID" do
|
19
|
+
project_id = 1
|
20
|
+
milestone_id = 2
|
21
|
+
response = mock_request_cycle :for => "/projects/#{project_id}/milestones/#{milestone_id}", :data => 'milestone'
|
22
|
+
|
23
|
+
Unfuzzle::Milestone.expects(:new).with(response.body).returns('milestone')
|
24
|
+
|
25
|
+
Milestone.find_by_project_id_and_milestone_id(1, 2).should == 'milestone'
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
context "An instance of the Milestone class" do
|
31
|
+
|
32
|
+
when_populating Milestone, :from => 'milestone' do
|
33
|
+
|
34
|
+
value_for :id, :is => 2
|
35
|
+
value_for :project_id, :is => 1
|
36
|
+
value_for :archived, :is => false
|
37
|
+
value_for :created_at, :is => Time.parse('2009-04-02T19:43:16Z')
|
38
|
+
value_for :name, :is => 'Milestone #1'
|
39
|
+
value_for :due_on, :is => Date.parse('2009-04-03')
|
40
|
+
value_for :updated_at, :is => Time.parse('2009-07-02T16:40:28Z')
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
context "with a new instance" do
|
45
|
+
|
46
|
+
setup { @milestone = Milestone.new }
|
47
|
+
|
48
|
+
should "know that it is archived" do
|
49
|
+
@milestone.stubs(:archived).with().returns(true)
|
50
|
+
@milestone.archived?.should be(true)
|
51
|
+
end
|
52
|
+
|
53
|
+
should "know that it isn't archived" do
|
54
|
+
@milestone.stubs(:archived).with().returns(false)
|
55
|
+
@milestone.archived?.should be(false)
|
56
|
+
end
|
57
|
+
|
58
|
+
should "have associated tickets" do
|
59
|
+
id = 1
|
60
|
+
project_id = 1
|
61
|
+
|
62
|
+
Ticket.expects(:find_all_by_project_id_and_milestone_id).with(project_id, id).returns('tickets')
|
63
|
+
|
64
|
+
@milestone.stubs(:id).with().returns(id)
|
65
|
+
@milestone.stubs(:project_id).with().returns(project_id)
|
66
|
+
|
67
|
+
@milestone.tickets.should == 'tickets'
|
68
|
+
end
|
69
|
+
|
70
|
+
should "know that it's in the past if the due date is in the past" do
|
71
|
+
due_date = Date.today
|
72
|
+
today = due_date.next
|
73
|
+
|
74
|
+
@milestone.stubs(:due_on).with().returns(due_date)
|
75
|
+
Date.expects(:today).with().returns(today)
|
76
|
+
|
77
|
+
@milestone.past?.should be(true)
|
78
|
+
end
|
79
|
+
|
80
|
+
should "know that it's not in the past if the date is today" do
|
81
|
+
due_date = Date.today
|
82
|
+
@milestone.stubs(:due_on).with().returns(due_date)
|
83
|
+
|
84
|
+
@milestone.past?.should be(false)
|
85
|
+
end
|
86
|
+
|
87
|
+
should "know that it's not in the past if the due date is in the future" do
|
88
|
+
due_date = Date.today.next
|
89
|
+
@milestone.stubs(:due_on).with().returns(due_date)
|
90
|
+
|
91
|
+
@milestone.past?.should be(false)
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module Unfuzzle
|
4
|
+
class PriorityTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def self.should_have_a_name_of(name, options)
|
7
|
+
should "have a name of '#{name}' when the priority is #{options[:when]}" do
|
8
|
+
p = Priority.new(options[:when])
|
9
|
+
p.name.should == name
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
context "An instance of the Priority class" do
|
15
|
+
|
16
|
+
should_have_a_name_of 'Highest', :when => 5
|
17
|
+
should_have_a_name_of 'High', :when => 4
|
18
|
+
should_have_a_name_of 'Normal', :when => 3
|
19
|
+
should_have_a_name_of 'Low', :when => 2
|
20
|
+
should_have_a_name_of 'Lowest', :when => 1
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module Unfuzzle
|
4
|
+
class ProjectTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "The Project class" do
|
7
|
+
|
8
|
+
should "be able to return a list of all projects" do
|
9
|
+
response = mock_request_cycle :for => '/projects', :data => 'projects'
|
10
|
+
|
11
|
+
Unfuzzle::Project.expects(:collection_from).with(response.body, 'projects/project').returns(['project_1', 'project_2'])
|
12
|
+
|
13
|
+
Project.all.should == ['project_1', 'project_2']
|
14
|
+
end
|
15
|
+
|
16
|
+
should "be able to find a project by its slug" do
|
17
|
+
slug = 'blip'
|
18
|
+
|
19
|
+
response = mock_request_cycle :for => "/projects/by_short_name/#{slug}", :data => 'project'
|
20
|
+
|
21
|
+
Unfuzzle::Project.expects(:new).with(response.body).returns('project')
|
22
|
+
|
23
|
+
Project.find_by_slug(slug).should == 'project'
|
24
|
+
end
|
25
|
+
|
26
|
+
should "be able to find a project by its ID" do
|
27
|
+
id = 1
|
28
|
+
|
29
|
+
response = mock_request_cycle :for => "/projects/#{id}", :data => 'project'
|
30
|
+
|
31
|
+
Unfuzzle::Project.expects(:new).with(response.body).returns('project')
|
32
|
+
|
33
|
+
Project.find_by_id(id).should == 'project'
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
context "An instance of the Project class" do
|
40
|
+
|
41
|
+
when_populating Project, :from => 'project' do
|
42
|
+
|
43
|
+
value_for :id, :is => 1
|
44
|
+
value_for :archived, :is => false
|
45
|
+
value_for :slug, :is => 'blip'
|
46
|
+
value_for :name, :is => 'Blip Bleep Co.'
|
47
|
+
value_for :description, :is => 'This is the project for Blip Bleep Co.'
|
48
|
+
value_for :created_at, :is => Time.parse('2008-07-28T16:57:10Z')
|
49
|
+
value_for :updated_at, :is => Time.parse('2009-04-28T18:48:52Z')
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
context "with a new instance" do
|
54
|
+
|
55
|
+
setup { @project = Project.new }
|
56
|
+
|
57
|
+
should "know that it's archived" do
|
58
|
+
@project.stubs(:archived).with().returns(true)
|
59
|
+
@project.archived?.should be(true)
|
60
|
+
end
|
61
|
+
|
62
|
+
should "know that it's not archived" do
|
63
|
+
@project.stubs(:archived).with().returns(false)
|
64
|
+
@project.archived?.should be(false)
|
65
|
+
end
|
66
|
+
|
67
|
+
should "have a list of associated milestones" do
|
68
|
+
id = 1
|
69
|
+
Milestone.expects(:find_all_by_project_id).with(id).returns('milestones')
|
70
|
+
|
71
|
+
@project.stubs(:id).with().returns(id)
|
72
|
+
@project.milestones.should == 'milestones'
|
73
|
+
end
|
74
|
+
|
75
|
+
should "have a list of associated tickets" do
|
76
|
+
id = 1
|
77
|
+
Ticket.expects(:find_all_by_project_id).with(id).returns('tickets')
|
78
|
+
|
79
|
+
@project.stubs(:id).with().returns(id)
|
80
|
+
@project.tickets.should == 'tickets'
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module Unfuzzle
|
4
|
+
class RequestTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "The Request class" do
|
7
|
+
|
8
|
+
should "be able to perform a GET request" do
|
9
|
+
request = mock() {|r| r.expects(:get).with().returns('response') }
|
10
|
+
Unfuzzle::Request.expects(:new).with('/projects').returns(request)
|
11
|
+
|
12
|
+
Unfuzzle::Request.get('/projects').should == 'response'
|
13
|
+
end
|
14
|
+
|
15
|
+
should "be able to perform a PUT request" do
|
16
|
+
request = mock() {|r| r.expects(:put).with().returns('response') }
|
17
|
+
Unfuzzle::Request.expects(:new).with('/projects', '<payload>').returns(request)
|
18
|
+
|
19
|
+
Unfuzzle::Request.put('/projects', '<payload>').should == 'response'
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
context "An instance of the Request class" do
|
25
|
+
|
26
|
+
should "have an endpoint URI" do
|
27
|
+
Unfuzzle.stubs(:subdomain).with().returns('viget')
|
28
|
+
|
29
|
+
request = Unfuzzle::Request.new('/projects')
|
30
|
+
request.endpoint_uri.should == URI.parse('http://viget.unfuddle.com/api/v1/projects.xml')
|
31
|
+
end
|
32
|
+
|
33
|
+
should "have an endpoint URI with the appropriate format when specified" do
|
34
|
+
Unfuzzle.stubs(:subdomain).with().returns('viget')
|
35
|
+
|
36
|
+
request = Unfuzzle::Request.new('/projects', nil)
|
37
|
+
request.endpoint_uri.should == URI.parse('http://viget.unfuddle.com/api/v1/projects.xml')
|
38
|
+
end
|
39
|
+
|
40
|
+
should "have a client" do
|
41
|
+
client = stub()
|
42
|
+
|
43
|
+
request = Unfuzzle::Request.new('/projects')
|
44
|
+
request.stubs(:endpoint_uri).with().returns(URI.parse('http://example.com'))
|
45
|
+
|
46
|
+
Net::HTTP.expects(:new).with('example.com').returns(client)
|
47
|
+
|
48
|
+
request.client.should == client
|
49
|
+
end
|
50
|
+
|
51
|
+
should "be able to perform a GET request" do
|
52
|
+
Unfuzzle.stubs(:username).with().returns('username')
|
53
|
+
Unfuzzle.stubs(:password).with().returns('password')
|
54
|
+
|
55
|
+
request = Unfuzzle::Request.new('/projects')
|
56
|
+
request.stubs(:endpoint_uri).returns(URI.parse('http://example.com/projects'))
|
57
|
+
|
58
|
+
get_request = mock() do |g|
|
59
|
+
g.expects(:basic_auth).with('username', 'password')
|
60
|
+
end
|
61
|
+
|
62
|
+
client = mock() {|c| c.expects(:request).with(get_request).returns('response') }
|
63
|
+
|
64
|
+
response = stub()
|
65
|
+
Unfuzzle::Response.expects(:new).with('response').returns(response)
|
66
|
+
|
67
|
+
Net::HTTP::Get.expects(:new).with('/projects').returns(get_request)
|
68
|
+
|
69
|
+
request.stubs(:client).with().returns(client)
|
70
|
+
|
71
|
+
request.get.should == response
|
72
|
+
end
|
73
|
+
|
74
|
+
should "be able to perform a PUT request" do
|
75
|
+
Unfuzzle.stubs(:username).with().returns('username')
|
76
|
+
Unfuzzle.stubs(:password).with().returns('password')
|
77
|
+
|
78
|
+
request_body = '<payload>'
|
79
|
+
|
80
|
+
request = Unfuzzle::Request.new('/projects', request_body)
|
81
|
+
|
82
|
+
request.stubs(:endpoint_uri).returns(URI.parse('http://example.com/projects'))
|
83
|
+
|
84
|
+
put_request = mock() do |p|
|
85
|
+
p.expects(:basic_auth).with('username', 'password')
|
86
|
+
p.expects(:content_type=).with('application/xml')
|
87
|
+
end
|
88
|
+
|
89
|
+
client = mock() {|c| c.expects(:request).with(put_request, request_body).returns('response') }
|
90
|
+
|
91
|
+
response = stub()
|
92
|
+
Unfuzzle::Response.expects(:new).with('response').returns(response)
|
93
|
+
|
94
|
+
Net::HTTP::Put.expects(:new).with('/projects').returns(put_request)
|
95
|
+
|
96
|
+
request.stubs(:client).with().returns(client)
|
97
|
+
|
98
|
+
request.put.should == response
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module Unfuzzle
|
4
|
+
class ResponseTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "An instance of the Response class" do
|
7
|
+
|
8
|
+
should "delegate to the HTTP response to determine the body" do
|
9
|
+
http_response = mock() {|r| r.expects(:body).with().returns('check mah boday') }
|
10
|
+
|
11
|
+
response = Unfuzzle::Response.new(http_response)
|
12
|
+
|
13
|
+
response.body.should == 'check mah boday'
|
14
|
+
end
|
15
|
+
|
16
|
+
should "know that there are no errors" do
|
17
|
+
http_response = mock() do |r|
|
18
|
+
r.expects(:is_a?).with(Net::HTTPSuccess).returns(true)
|
19
|
+
end
|
20
|
+
|
21
|
+
response = Unfuzzle::Response.new(http_response)
|
22
|
+
response.error?.should be(false)
|
23
|
+
end
|
24
|
+
|
25
|
+
should "know if there are errors" do
|
26
|
+
http_response = mock() do |r|
|
27
|
+
r.expects(:is_a?).with(Net::HTTPSuccess).returns(false)
|
28
|
+
end
|
29
|
+
|
30
|
+
response = Unfuzzle::Response.new(http_response)
|
31
|
+
response.error?.should be(true)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module Unfuzzle
|
4
|
+
class SeverityTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "The Severity class" do
|
7
|
+
|
8
|
+
should "be able to return a severity for a project and severity id" do
|
9
|
+
project_id = 1
|
10
|
+
severity_id = 1
|
11
|
+
|
12
|
+
response = mock_request_cycle :for => "/projects/#{project_id}/severities/#{severity_id}", :data => 'severity'
|
13
|
+
|
14
|
+
Unfuzzle::Severity.expects(:new).with(response.body).returns('severity')
|
15
|
+
|
16
|
+
Unfuzzle::Severity.find_by_project_id_and_severity_id(project_id, severity_id).should == 'severity'
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
context "An instance of the Severity class" do
|
22
|
+
|
23
|
+
when_populating Severity, :from => 'severity' do
|
24
|
+
|
25
|
+
value_for :id, :is => 1
|
26
|
+
value_for :name, :is => 'Story'
|
27
|
+
value_for :project_id, :is => 2
|
28
|
+
value_for :created_at, :is => Time.parse('2009-04-02T19:44:49Z')
|
29
|
+
value_for :updated_at, :is => Time.parse('2009-04-02T19:44:49Z')
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,181 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module Unfuzzle
|
4
|
+
class TicketTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "The Ticket class" do
|
7
|
+
|
8
|
+
should "be able to return a list of tickets for a project" do
|
9
|
+
project_id = 1
|
10
|
+
|
11
|
+
response = mock_request_cycle :for => "/projects/#{project_id}/tickets", :data => 'tickets'
|
12
|
+
|
13
|
+
Unfuzzle::Ticket.expects(:collection_from).with(response.body, 'tickets/ticket').returns(['ticket_1', 'ticket_2'])
|
14
|
+
|
15
|
+
Ticket.find_all_by_project_id(project_id).should == ['ticket_1', 'ticket_2']
|
16
|
+
end
|
17
|
+
|
18
|
+
should "be able to return a list of tickets for a milestone" do
|
19
|
+
milestone_id = 1
|
20
|
+
project_id = 1
|
21
|
+
|
22
|
+
response = mock_request_cycle :for => "/projects/#{project_id}/milestones/#{milestone_id}/tickets", :data => 'tickets'
|
23
|
+
|
24
|
+
Unfuzzle::Ticket.expects(:collection_from).with(response.body, 'tickets/ticket').returns(['ticket_1', 'ticket_2'])
|
25
|
+
|
26
|
+
Ticket.find_all_by_project_id_and_milestone_id(project_id, milestone_id).should == ['ticket_1', 'ticket_2']
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
context "An instance of the Ticket class" do
|
32
|
+
|
33
|
+
when_populating Ticket, :from => 'ticket' do
|
34
|
+
|
35
|
+
value_for :id, :is => 1
|
36
|
+
value_for :project_id, :is => 1
|
37
|
+
value_for :milestone_id, :is => 1
|
38
|
+
value_for :severity_id, :is => 123
|
39
|
+
value_for :priority_id, :is => 3
|
40
|
+
value_for :component_id, :is => 1
|
41
|
+
value_for :created_at, :is => Time.parse('2008-11-25T14:00:19Z')
|
42
|
+
value_for :updated_at, :is => Time.parse('2008-12-31T15:51:41Z')
|
43
|
+
value_for :number, :is => '1'
|
44
|
+
value_for :title, :is => 'Ticket #1'
|
45
|
+
value_for :description, :is => 'Do something important'
|
46
|
+
value_for :due_on, :is => nil
|
47
|
+
value_for :status, :is => 'closed'
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
should_set_a_value_for :title
|
52
|
+
should_set_a_value_for :description
|
53
|
+
|
54
|
+
context "with a new instance" do
|
55
|
+
setup { @ticket = Ticket.new }
|
56
|
+
|
57
|
+
should "have a due date" do
|
58
|
+
xml = '<ticket><due-on>2009-08-01</due-on></ticket>'
|
59
|
+
|
60
|
+
ticket = Ticket.new(xml)
|
61
|
+
ticket.due_on.should == Date.parse('2009-08-01')
|
62
|
+
end
|
63
|
+
|
64
|
+
should "have an associated milestone" do
|
65
|
+
Milestone.expects(:find_by_project_id_and_milestone_id).with(1, 2).returns('milestone')
|
66
|
+
|
67
|
+
@ticket.stubs(:project_id).with().returns(1)
|
68
|
+
@ticket.stubs(:milestone_id).with().returns(2)
|
69
|
+
|
70
|
+
@ticket.milestone.should == 'milestone'
|
71
|
+
end
|
72
|
+
|
73
|
+
should "have an associated severity" do
|
74
|
+
project_id = 1
|
75
|
+
severity_id = 1
|
76
|
+
|
77
|
+
Severity.expects(:find_by_project_id_and_severity_id).with(project_id, severity_id).returns('severity')
|
78
|
+
|
79
|
+
@ticket.stubs(:project_id).with().returns(project_id)
|
80
|
+
@ticket.stubs(:severity_id).with().returns(severity_id)
|
81
|
+
|
82
|
+
@ticket.severity.should == 'severity'
|
83
|
+
end
|
84
|
+
|
85
|
+
should "have no associated severity if it is not set" do
|
86
|
+
@ticket.stubs(:severity_id).with().returns(nil)
|
87
|
+
@ticket.severity.should be(nil)
|
88
|
+
end
|
89
|
+
|
90
|
+
should "have a severity_name" do
|
91
|
+
@ticket.stubs(:severity).with().returns(stub(:name => 'Story'))
|
92
|
+
@ticket.severity_name.should == 'Story'
|
93
|
+
end
|
94
|
+
|
95
|
+
should "have no severity_name if there is no severity" do
|
96
|
+
@ticket.stubs(:severity).with().returns(nil)
|
97
|
+
@ticket.severity_name.should be(nil)
|
98
|
+
end
|
99
|
+
|
100
|
+
should "have an associated priority" do
|
101
|
+
Priority.expects(:new).with(1).returns('priority')
|
102
|
+
|
103
|
+
@ticket.stubs(:priority_id).with().returns(1)
|
104
|
+
@ticket.priority.should == 'priority'
|
105
|
+
end
|
106
|
+
|
107
|
+
should "have a priority_name" do
|
108
|
+
@ticket.stubs(:priority).with().returns(stub(:name => 'High'))
|
109
|
+
@ticket.priority_name.should == 'High'
|
110
|
+
end
|
111
|
+
|
112
|
+
should "have an associated component" do
|
113
|
+
project_id = 1
|
114
|
+
component_id = 1
|
115
|
+
|
116
|
+
Component.expects(:find_by_project_id_and_component_id).with(project_id, component_id).returns('component')
|
117
|
+
|
118
|
+
@ticket.stubs(:project_id).with().returns(project_id)
|
119
|
+
@ticket.stubs(:component_id).with().returns(component_id)
|
120
|
+
|
121
|
+
@ticket.component.should == 'component'
|
122
|
+
end
|
123
|
+
|
124
|
+
should "have no associated component if it is not set" do
|
125
|
+
@ticket.stubs(:component_id).with().returns(nil)
|
126
|
+
@ticket.component.should be(nil)
|
127
|
+
end
|
128
|
+
|
129
|
+
should "have a component_name" do
|
130
|
+
@ticket.stubs(:component).with().returns(stub(:name => 'Admin'))
|
131
|
+
@ticket.component_name.should == 'Admin'
|
132
|
+
end
|
133
|
+
|
134
|
+
should "have no component_name if there is no component" do
|
135
|
+
@ticket.stubs(:component).with().returns(nil)
|
136
|
+
@ticket.component_name.should be(nil)
|
137
|
+
end
|
138
|
+
|
139
|
+
should "be able to generate a hash representation of itself for updating" do
|
140
|
+
@ticket.id = 1
|
141
|
+
@ticket.project_id = 2
|
142
|
+
@ticket.milestone_id = 3
|
143
|
+
@ticket.number = '12'
|
144
|
+
@ticket.title = 'summary'
|
145
|
+
@ticket.description = 'description'
|
146
|
+
@ticket.status = 'closed'
|
147
|
+
|
148
|
+
|
149
|
+
expected = {
|
150
|
+
'id' => 1,
|
151
|
+
'project_id' => 2,
|
152
|
+
'milestone_id' => 3,
|
153
|
+
'number' => '12',
|
154
|
+
'summary' => 'summary',
|
155
|
+
'description' => 'description',
|
156
|
+
'status' => 'closed'
|
157
|
+
}
|
158
|
+
|
159
|
+
@ticket.to_hash.should == expected
|
160
|
+
end
|
161
|
+
|
162
|
+
should "be able to perform an update" do
|
163
|
+
@ticket.stubs(:project_id).with().returns(1)
|
164
|
+
@ticket.stubs(:id).with().returns(2)
|
165
|
+
|
166
|
+
resource_path = '/projects/1/tickets/2'
|
167
|
+
ticket_xml = '<ticket />'
|
168
|
+
|
169
|
+
@ticket.stubs(:to_xml).with('ticket').returns(ticket_xml)
|
170
|
+
|
171
|
+
Unfuzzle::Request.expects(:put).with(resource_path, ticket_xml).returns('response')
|
172
|
+
|
173
|
+
@ticket.update.should == 'response'
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
end
|