confuddle 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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,29 @@
|
|
1
|
+
module Unfuzzle
|
2
|
+
|
3
|
+
# = Project
|
4
|
+
#
|
5
|
+
# Represents an Unfuddle project. Has the following attributes:
|
6
|
+
#
|
7
|
+
# [id] The unique identifier for this project
|
8
|
+
# [slug] The "short name" for this project
|
9
|
+
# [name] The name of this project
|
10
|
+
# [description] The description for the project
|
11
|
+
# [archived] The archived status of this project (see Project#archived?)
|
12
|
+
# [created_at] The date/time that this project was created
|
13
|
+
# [updated_at] The date/time that this project was last updated
|
14
|
+
#
|
15
|
+
class TicketReport
|
16
|
+
|
17
|
+
include Graft
|
18
|
+
|
19
|
+
attribute :id, :type => :integer
|
20
|
+
attribute :relationship
|
21
|
+
attribute :title
|
22
|
+
|
23
|
+
def self.all
|
24
|
+
response = Request.get('/ticket_reports')
|
25
|
+
collection_from(response.body, 'ticket-report')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Unfuzzle
|
2
|
+
|
3
|
+
class TimeEntryGroup
|
4
|
+
include Graft
|
5
|
+
attribute :title
|
6
|
+
end
|
7
|
+
|
8
|
+
class TimeEntry
|
9
|
+
|
10
|
+
include Graft
|
11
|
+
|
12
|
+
attribute :date
|
13
|
+
attribute :description
|
14
|
+
attribute :hours
|
15
|
+
attribute :person_id, :from => "person-id", :type => :integer
|
16
|
+
attribute :ticket_id, :from => "ticket-id", :time => :integer
|
17
|
+
|
18
|
+
attr_accessor :title # title of ticket
|
19
|
+
|
20
|
+
# Hash representation of this time entry's data (for updating)
|
21
|
+
def to_hash
|
22
|
+
{
|
23
|
+
'date' => date,
|
24
|
+
'description' => description,
|
25
|
+
'hours' => hours,
|
26
|
+
'person-id' => person_id,
|
27
|
+
"ticket-id" => ticket_id
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
# times for project
|
33
|
+
def self.time_invested(project_id, start_date, end_date)
|
34
|
+
response = Request.get("/projects/#{project_id}/time_invested", query(start_date, end_date))
|
35
|
+
parse_group_collection(response.body)
|
36
|
+
end
|
37
|
+
|
38
|
+
# times for account
|
39
|
+
def self.all_time_invested(start_date, end_date)
|
40
|
+
response = Request.get("/account/time_invested", query(start_date, end_date))
|
41
|
+
parse_group_collection(response.body)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.all_for_ticket(ticket, start_date = nil, end_date = nil)
|
45
|
+
response = Request.get("/projects/#{ticket.project_id}/tickets/#{ticket.id}/time_entries", query(start_date, end_date))
|
46
|
+
collection_from(response.body, 'time-entries/time-entry')
|
47
|
+
end
|
48
|
+
|
49
|
+
# Create a ticket in unfuddle
|
50
|
+
def create(project_id, ticket_id)
|
51
|
+
resource_path = "/projects/#{project_id}/tickets/#{ticket_id}/time_entries"
|
52
|
+
Request.post(resource_path, self.to_xml('time-entry'))
|
53
|
+
end
|
54
|
+
|
55
|
+
protected
|
56
|
+
|
57
|
+
def self.query(start_date, end_date)
|
58
|
+
# [person, ticket, priority, component, version, severity, milestone, due_on, reporter, assignee, status, resolution]
|
59
|
+
group = "ticket"
|
60
|
+
query = "?group_by=#{group}"
|
61
|
+
query += "&start_date=#{start_date.strftime("%Y/%m/%d")}" if start_date
|
62
|
+
query += "&end_date=#{end_date.strftime("%Y/%m/%d")}" if end_date
|
63
|
+
query
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.parse_group_collection(body)
|
67
|
+
res = collection_from_block(body, "groups/group") do |str|
|
68
|
+
group = TimeEntryGroup.new(str)
|
69
|
+
times = collection_from(str, 'time-entries/time-entry').map{|time| time.title = group.title; time}
|
70
|
+
end
|
71
|
+
res.flatten
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<components type="array">
|
3
|
+
<component>
|
4
|
+
<id type="integer">1</id>
|
5
|
+
<name>Administration</name>
|
6
|
+
<project-id type="integer">1</project-id>
|
7
|
+
<created-at>2009-06-15T20:40:29Z</created-at>
|
8
|
+
<updated-at>2009-06-15T20:40:29Z</updated-at>
|
9
|
+
</component>
|
10
|
+
<component>
|
11
|
+
<id type="integer">2</id>
|
12
|
+
<name>Notifications</name>
|
13
|
+
<project-id type="integer">2</project-id>
|
14
|
+
<created-at>2009-06-15T20:40:49Z</created-at>
|
15
|
+
<updated-at>2009-06-15T20:40:49Z</updated-at>
|
16
|
+
</component>
|
17
|
+
</components>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<milestone>
|
3
|
+
<archived type="boolean">false</archived>
|
4
|
+
<completed type="boolean">false</completed>
|
5
|
+
<due-on type="date">2009-04-03</due-on>
|
6
|
+
<id type="integer">2</id>
|
7
|
+
<person-responsible-id type="integer">123</person-responsible-id>
|
8
|
+
<project-id type="integer">1</project-id>
|
9
|
+
<title>Milestone #1</title>
|
10
|
+
<created-at>2009-04-02T19:43:16Z</created-at>
|
11
|
+
<updated-at>2009-07-02T16:40:28Z</updated-at>
|
12
|
+
</milestone>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<milestones type="array">
|
3
|
+
<milestone>
|
4
|
+
<archived type="boolean">false</archived>
|
5
|
+
<completed type="boolean">false</completed>
|
6
|
+
<due-on type="date">2009-04-03</due-on>
|
7
|
+
<id type="integer">1</id>
|
8
|
+
<person-responsible-id type="integer">123</person-responsible-id>
|
9
|
+
<project-id type="integer">1</project-id>
|
10
|
+
<title>Milestone #1</title>
|
11
|
+
<created-at>2009-04-02T19:43:16Z</created-at>
|
12
|
+
<updated-at>2009-07-06T18:00:26Z</updated-at>
|
13
|
+
</milestone>
|
14
|
+
<milestone>
|
15
|
+
<archived type="boolean">false</archived>
|
16
|
+
<completed type="boolean">false</completed>
|
17
|
+
<due-on type="date">2009-04-06</due-on>
|
18
|
+
<id type="integer">2</id>
|
19
|
+
<person-responsible-id type="integer">123</person-responsible-id>
|
20
|
+
<project-id type="integer">1</project-id>
|
21
|
+
<title>Milestone #2</title>
|
22
|
+
<created-at>2009-04-06T04:45:54Z</created-at>
|
23
|
+
<updated-at>2009-04-10T15:29:01Z</updated-at>
|
24
|
+
</milestone>
|
25
|
+
</milestones>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<project>
|
3
|
+
<account-id type="integer">1</account-id>
|
4
|
+
<archived type="boolean">false</archived>
|
5
|
+
<assignee-on-resolve>none</assignee-on-resolve>
|
6
|
+
<close-ticket-simultaneously-default type="boolean">true</close-ticket-simultaneously-default>
|
7
|
+
<default-ticket-report-id type="integer">0</default-ticket-report-id>
|
8
|
+
<description>This is the project for Blip Bleep Co.</description>
|
9
|
+
<disk-usage type="integer">1416</disk-usage>
|
10
|
+
<enable-time-tracking type="boolean">true</enable-time-tracking>
|
11
|
+
<id type="integer">1</id>
|
12
|
+
<short-name>blip</short-name>
|
13
|
+
<theme>teal</theme>
|
14
|
+
<title>Blip Bleep Co.</title>
|
15
|
+
<created-at>2008-07-28T16:57:10Z</created-at>
|
16
|
+
<updated-at>2009-04-28T18:48:52Z</updated-at>
|
17
|
+
</project>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<projects type="array">
|
3
|
+
<project>
|
4
|
+
<account-id type="integer">10710</account-id>
|
5
|
+
<archived type="boolean">false</archived>
|
6
|
+
<assignee-on-resolve>none</assignee-on-resolve>
|
7
|
+
<close-ticket-simultaneously-default type="boolean">true</close-ticket-simultaneously-default>
|
8
|
+
<default-ticket-report-id type="integer">0</default-ticket-report-id>
|
9
|
+
<description></description>
|
10
|
+
<disk-usage type="integer">1416</disk-usage>
|
11
|
+
<enable-time-tracking type="boolean">true</enable-time-tracking>
|
12
|
+
<id type="integer">24541</id>
|
13
|
+
<short-name>aa</short-name>
|
14
|
+
<theme>teal</theme>
|
15
|
+
<title>Agency Access</title>
|
16
|
+
<created-at>2008-07-28T16:57:10Z</created-at>
|
17
|
+
<updated-at>2009-04-28T18:48:52Z</updated-at>
|
18
|
+
</project>
|
19
|
+
<project>
|
20
|
+
<account-id type="integer">10710</account-id>
|
21
|
+
<archived type="boolean">false</archived>
|
22
|
+
<assignee-on-resolve>reporter</assignee-on-resolve>
|
23
|
+
<close-ticket-simultaneously-default type="boolean">false</close-ticket-simultaneously-default>
|
24
|
+
<default-ticket-report-id type="integer" nil="true"></default-ticket-report-id>
|
25
|
+
<description nil="true"></description>
|
26
|
+
<disk-usage type="integer">28736</disk-usage>
|
27
|
+
<enable-time-tracking type="boolean">true</enable-time-tracking>
|
28
|
+
<id type="integer">22830</id>
|
29
|
+
<short-name>brianregan</short-name>
|
30
|
+
<theme>orange</theme>
|
31
|
+
<title>Brian Regan</title>
|
32
|
+
<created-at>2008-07-02T14:19:32Z</created-at>
|
33
|
+
<updated-at>2009-07-09T20:19:51Z</updated-at>
|
34
|
+
</project>
|
35
|
+
</projects>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<severities type="array">
|
3
|
+
<severity>
|
4
|
+
<id type="integer">34942</id>
|
5
|
+
<name>Design</name>
|
6
|
+
<project-id type="integer">26984</project-id>
|
7
|
+
<created-at>2009-04-02T19:44:49Z</created-at>
|
8
|
+
<updated-at>2009-04-02T19:44:49Z</updated-at>
|
9
|
+
</severity>
|
10
|
+
<severity>
|
11
|
+
<id type="integer">34943</id>
|
12
|
+
<name>Development</name>
|
13
|
+
<project-id type="integer">26984</project-id>
|
14
|
+
<created-at>2009-04-02T19:44:53Z</created-at>
|
15
|
+
<updated-at>2009-04-02T19:44:53Z</updated-at>
|
16
|
+
</severity>
|
17
|
+
<severity>
|
18
|
+
<id type="integer">34944</id>
|
19
|
+
<name>Project Management</name>
|
20
|
+
<project-id type="integer">26984</project-id>
|
21
|
+
<created-at>2009-04-02T19:44:59Z</created-at>
|
22
|
+
<updated-at>2009-04-02T19:44:59Z</updated-at>
|
23
|
+
</severity>
|
24
|
+
</severities>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<ticket>
|
3
|
+
<assignee-id type="integer">123</assignee-id>
|
4
|
+
<component-id type="integer">1</component-id>
|
5
|
+
<description>Do something important</description>
|
6
|
+
<description-format>markdown</description-format>
|
7
|
+
<due-on type="date"></due-on>
|
8
|
+
<hours-estimate-current type="float">0.0</hours-estimate-current>
|
9
|
+
<hours-estimate-initial type="float">2.0</hours-estimate-initial>
|
10
|
+
<id type="integer">1</id>
|
11
|
+
<milestone-id type="integer">1</milestone-id>
|
12
|
+
<number type="integer">1</number>
|
13
|
+
<priority>3</priority>
|
14
|
+
<project-id type="integer">1</project-id>
|
15
|
+
<reporter-id type="integer">122</reporter-id>
|
16
|
+
<resolution>postponed</resolution>
|
17
|
+
<resolution-description>done</resolution-description>
|
18
|
+
<resolution-description-format>markdown</resolution-description-format>
|
19
|
+
<severity-id type="integer">123</severity-id>
|
20
|
+
<status>closed</status>
|
21
|
+
<summary>Ticket #1</summary>
|
22
|
+
<version-id type="integer">17329</version-id>
|
23
|
+
<created-at>2008-11-25T14:00:19Z</created-at>
|
24
|
+
<updated-at>2008-12-31T15:51:41Z</updated-at>
|
25
|
+
</ticket>
|
@@ -0,0 +1,51 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<tickets type="array">
|
3
|
+
<ticket>
|
4
|
+
<assignee-id type="integer">27736</assignee-id>
|
5
|
+
<component-id type="integer">47394</component-id>
|
6
|
+
<description></description>
|
7
|
+
<description-format>markdown</description-format>
|
8
|
+
<due-on type="date">2009-04-03</due-on>
|
9
|
+
<hours-estimate-current type="float">0.0</hours-estimate-current>
|
10
|
+
<hours-estimate-initial type="float">2.0</hours-estimate-initial>
|
11
|
+
<id type="integer">557168</id>
|
12
|
+
<milestone-id type="integer">52212</milestone-id>
|
13
|
+
<number type="integer">5</number>
|
14
|
+
<priority>3</priority>
|
15
|
+
<project-id type="integer">26984</project-id>
|
16
|
+
<reporter-id type="integer">27736</reporter-id>
|
17
|
+
<resolution>postponed</resolution>
|
18
|
+
<resolution-description>awaiting contracts</resolution-description>
|
19
|
+
<resolution-description-format>markdown</resolution-description-format>
|
20
|
+
<severity-id type="integer">34943</severity-id>
|
21
|
+
<status>closed</status>
|
22
|
+
<summary>User can log in to the site</summary>
|
23
|
+
<version-id type="integer">17329</version-id>
|
24
|
+
<created-at>2009-04-02T19:16:26Z</created-at>
|
25
|
+
<updated-at>2009-07-02T16:42:30Z</updated-at>
|
26
|
+
</ticket>
|
27
|
+
<ticket>
|
28
|
+
<assignee-id type="integer">27736</assignee-id>
|
29
|
+
<component-id type="integer">47394</component-id>
|
30
|
+
<description></description>
|
31
|
+
<description-format>markdown</description-format>
|
32
|
+
<due-on type="date">2009-04-03</due-on>
|
33
|
+
<hours-estimate-current type="float">0.0</hours-estimate-current>
|
34
|
+
<hours-estimate-initial type="float">2.0</hours-estimate-initial>
|
35
|
+
<id type="integer">557169</id>
|
36
|
+
<milestone-id type="integer">52212</milestone-id>
|
37
|
+
<number type="integer">6</number>
|
38
|
+
<priority>3</priority>
|
39
|
+
<project-id type="integer">26984</project-id>
|
40
|
+
<reporter-id type="integer">27736</reporter-id>
|
41
|
+
<resolution>postponed</resolution>
|
42
|
+
<resolution-description>awaiting contracts</resolution-description>
|
43
|
+
<resolution-description-format>markdown</resolution-description-format>
|
44
|
+
<severity-id type="integer">34943</severity-id>
|
45
|
+
<status>closed</status>
|
46
|
+
<summary>User can edit profile</summary>
|
47
|
+
<version-id type="integer">17329</version-id>
|
48
|
+
<created-at>2009-04-02T19:17:40Z</created-at>
|
49
|
+
<updated-at>2009-04-10T15:28:54Z</updated-at>
|
50
|
+
</ticket>
|
51
|
+
</tickets>
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# http://sneaq.net/textmate-wtf
|
2
|
+
$:.reject! { |e| e.include? 'TextMate' }
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'throat_punch'
|
6
|
+
|
7
|
+
require File.dirname(__FILE__) + '/../lib/unfuzzle'
|
8
|
+
|
9
|
+
|
10
|
+
class Test::Unit::TestCase
|
11
|
+
|
12
|
+
def self.read_fixture(method_name)
|
13
|
+
file = File.dirname(__FILE__) + "/fixtures/#{method_name}.xml"
|
14
|
+
File.read(file)
|
15
|
+
end
|
16
|
+
|
17
|
+
def read_fixture(method_name)
|
18
|
+
self.class.read_fixture(method_name)
|
19
|
+
end
|
20
|
+
|
21
|
+
def mock_request_cycle(options)
|
22
|
+
response = Unfuzzle::Response.new(stub())
|
23
|
+
|
24
|
+
data = read_fixture(options[:data])
|
25
|
+
|
26
|
+
response.stubs(:body).with().returns(data)
|
27
|
+
|
28
|
+
Unfuzzle::Request.stubs(:get).with(options[:for]).returns(response)
|
29
|
+
|
30
|
+
response
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.when_populating(klass, options, &block)
|
34
|
+
context "with data populated for #{klass}" do
|
35
|
+
setup { @object = klass.new(read_fixture(options[:from])) }
|
36
|
+
merge_block(&block)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.value_for(method_name, options)
|
42
|
+
should "have a value for :#{method_name}" do
|
43
|
+
@object.send(method_name).should == options[:is]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.should_set_a_value_for(attribute, value = nil)
|
48
|
+
class_name = self.to_s.sub(/^Unfuzzle::(.*)Test$/, '\\1')
|
49
|
+
klass = Unfuzzle.const_get(class_name)
|
50
|
+
|
51
|
+
value = attribute if value.nil?
|
52
|
+
|
53
|
+
should "be able to set a value for :#{attribute}" do
|
54
|
+
object = klass.new
|
55
|
+
object.send("#{attribute}=", value)
|
56
|
+
object.send(attribute).should == value
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module Unfuzzle
|
4
|
+
class ComponentTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "The Component class" do
|
7
|
+
|
8
|
+
should "be able to return a severity for a project and component id" do
|
9
|
+
project_id = 1
|
10
|
+
component_id = 1
|
11
|
+
|
12
|
+
response = mock_request_cycle :for => "/projects/#{project_id}/components/#{component_id}", :data => 'component'
|
13
|
+
|
14
|
+
Unfuzzle::Component.expects(:new).with(response.body).returns('component')
|
15
|
+
|
16
|
+
Unfuzzle::Component.find_by_project_id_and_component_id(project_id, component_id).should == 'component'
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
context "An instance of the Component class" do
|
22
|
+
|
23
|
+
when_populating Component, :from => 'component' do
|
24
|
+
|
25
|
+
value_for :id, :is => 1
|
26
|
+
value_for :name, :is => 'Administration'
|
27
|
+
value_for :project_id, :is => 2
|
28
|
+
value_for :created_at, :is => Time.parse('2009-06-15T20:40:29Z')
|
29
|
+
value_for :updated_at, :is => Time.parse('2009-06-15T20:40:29Z')
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|