taskmapper-kanbanpad 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.rbenv-gemsets +1 -0
- data/.rbenv-version +1 -0
- data/.travis.yml +4 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +51 -0
- data/LICENSE +22 -0
- data/README.md +39 -0
- data/Rakefile +43 -0
- data/VERSION +1 -0
- data/lib/kanbanpad/kanbanpad-api.rb +126 -0
- data/lib/provider/comment.rb +69 -0
- data/lib/provider/kanbanpad.rb +34 -0
- data/lib/provider/project.rb +78 -0
- data/lib/provider/ticket.rb +127 -0
- data/lib/taskmapper-kanbanpad.rb +6 -0
- data/spec/fixtures/comments.json +1 -0
- data/spec/fixtures/comments/4ef2719bf17365000110df9e.json +1 -0
- data/spec/fixtures/projects.json +8 -0
- data/spec/fixtures/projects.xml +23 -0
- data/spec/fixtures/projects/be74b643b64e3dc79aa0.json +2 -0
- data/spec/fixtures/projects/be74b643b64e3dc79aa0.xml +13 -0
- data/spec/fixtures/projects/create.json +1 -0
- data/spec/fixtures/projects/create.xml +1 -0
- data/spec/fixtures/projects/test.rb +7 -0
- data/spec/fixtures/steps/4dc312f49bd0ff6c37000040.json +1 -0
- data/spec/fixtures/tasks.json +2 -0
- data/spec/fixtures/tasks.xml +25 -0
- data/spec/fixtures/tasks/4cd428c496f0734eef000007.json +3 -0
- data/spec/fixtures/tasks/4cd428c496f0734eef000007.xml +14 -0
- data/spec/fixtures/tasks/4cd428c496f0734eef000008.json +1 -0
- data/spec/fixtures/tasks/4cd428c496f0734eef000008.xml +13 -0
- data/spec/fixtures/tasks/4dc31c4c9bd0ff6c3700004e.json +1 -0
- data/spec/fixtures/tasks/create.xml +1 -0
- data/spec/project_comments_spec.rb +37 -0
- data/spec/projects_spec.rb +49 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/ticket_comments_spec.rb +55 -0
- data/spec/ticketmaster-kanbanpad_spec.rb +11 -0
- data/spec/tickets_spec.rb +105 -0
- data/taskmapper-kanbanpad.gemspec +98 -0
- metadata +172 -0
@@ -0,0 +1,127 @@
|
|
1
|
+
module TaskMapper::Provider
|
2
|
+
module Kanbanpad
|
3
|
+
# Ticket class for taskmapper-kanbanpad
|
4
|
+
#
|
5
|
+
class Ticket < TaskMapper::Provider::Base::Ticket
|
6
|
+
API = KanbanpadAPI::TaskList
|
7
|
+
STEP_API = KanbanpadAPI::Step
|
8
|
+
TASK_COMMENT_API = KanbanpadAPI::TaskCommentCreator
|
9
|
+
|
10
|
+
def initialize(*object)
|
11
|
+
if object.first
|
12
|
+
object = object.first
|
13
|
+
@system_data = {:client => object}
|
14
|
+
unless object.is_? Hash
|
15
|
+
hash = {:id => object.id,
|
16
|
+
:finished => object.finished,
|
17
|
+
:title => object.title,
|
18
|
+
:backlog => object.backlog,
|
19
|
+
:assigned_to => object.assigned_to,
|
20
|
+
:wip => object.wip,
|
21
|
+
:project_slug => object.project_slug,
|
22
|
+
:step_id => object.step_id,
|
23
|
+
:urgent => object.urgent}
|
24
|
+
else
|
25
|
+
hash = object
|
26
|
+
end
|
27
|
+
super hash
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def priority
|
32
|
+
self.urgent ? "Urgent" : "Not Urgent"
|
33
|
+
end
|
34
|
+
|
35
|
+
def status
|
36
|
+
return "Finished" if self.finished
|
37
|
+
return "Backlog" if self.backlog
|
38
|
+
self.wip? ? "#{step_name} - In-Progress" : "#{step_name} - Queue"
|
39
|
+
end
|
40
|
+
|
41
|
+
def description
|
42
|
+
self.note
|
43
|
+
end
|
44
|
+
|
45
|
+
def assignee
|
46
|
+
self.assigned_to.blank? ? 'Nobody' : self.assigned_to.first
|
47
|
+
end
|
48
|
+
|
49
|
+
def project_id
|
50
|
+
self.project_slug
|
51
|
+
end
|
52
|
+
|
53
|
+
def created_at
|
54
|
+
if self[:created_at].blank?
|
55
|
+
Time.parse('2010-03-25 3:06:34') #kanbanpad used to not track the created_at
|
56
|
+
else
|
57
|
+
begin
|
58
|
+
Time.parse(self[:created_at])
|
59
|
+
rescue
|
60
|
+
self[:created_at]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.create(*options)
|
66
|
+
if options.first.is_a? Hash
|
67
|
+
options.first.merge!(:assigned_to => options.first.delete(:assignee),
|
68
|
+
:note => options.first[:description])
|
69
|
+
task = API.new(options.first)
|
70
|
+
task.save
|
71
|
+
ticket = self.new task
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def save
|
76
|
+
task = KanbanpadAPI::TaskList.find(:all, :params => {:project_id => self.project_id}).select { |task| task.id == self.id }.first
|
77
|
+
task.update_attributes(:title => self.title, :project_id => self.project_id)
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.find_by_attributes(project_id, attributes = {})
|
81
|
+
self.search_by_attribute(self.search(project_id), attributes)
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.search(project_id, options = {}, limit = 1000)
|
85
|
+
tickets = API.find(:all, :params => {:project_id => project_id, :backlog => 'yes', :finished => 'yes'}).collect do |ticket|
|
86
|
+
self.new ticket
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def updated_at
|
91
|
+
if self[:updated_at].blank?
|
92
|
+
Time.parse('2010-03-25 3:06:34') #kanbanpad used to not track the updated_at
|
93
|
+
else
|
94
|
+
begin
|
95
|
+
Time.parse(self[:updated_at])
|
96
|
+
rescue
|
97
|
+
self[:updated_at]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
#TODO?
|
103
|
+
def comment
|
104
|
+
warn 'Kanbanpad does not allow find by id of comments. Perhaps you should leave feedback to request it?'
|
105
|
+
nil
|
106
|
+
end
|
107
|
+
|
108
|
+
def comment!(*options)
|
109
|
+
if options.first.is_a? Hash
|
110
|
+
options.first.merge!(:project_id => self.project_id,
|
111
|
+
:task_id => self.id,
|
112
|
+
:step_id => self.step_id)
|
113
|
+
|
114
|
+
task_comment = TASK_COMMENT_API.new(options.first)
|
115
|
+
task_comment.save
|
116
|
+
comment = Comment.new(task_comment.attributes.merge :ticket_id => id)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
private
|
121
|
+
def step_name
|
122
|
+
STEP_API.find(self.step_id, :params => {:project_id => self.project_id}).name
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
[{"created_at":"2011-02-26T00:50:55Z","author":"Rafael George <george.rafael@gmail.com>","body":"testing comments","updated_at":"2011-02-26T00:50:55Z","id":"4d684e6f973c7d5648000009","user_id":"4d62b9acc26df8076000004c"},{"created_at":"2011-02-26T01:02:25Z","author":"Rafael George <george.rafael@gmail.com>","body":"another comment\n","updated_at":"2011-02-26T01:02:25Z","id":"4d685121e87f1467ab00001d","user_id":"4d62b9acc26df8076000004c"},{"created_at":"2011-02-26T01:02:31Z","author":"Rafael George <george.rafael@gmail.com>","body":"and another one","updated_at":"2011-02-26T01:02:31Z","id":"4d685127d1c632140800000c","user_id":"4d62b9acc26df8076000004c"}]
|
@@ -0,0 +1 @@
|
|
1
|
+
{"created_at":"2012-02-20T23:30:33Z", "author":"Alexander Giraldo", "body":"Testing", "updated_at":"2012-02-20T23:30:33Z", "id":"4f42d79987b92f1c4f000004", "grav_id":"a0f8f657f4af926df53ee90ce8a31760", "user_id":"4f3eb3e287b92f239e000001", "author_email":"alexanderg@hybridgroup.com"}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
[
|
2
|
+
{"email":"sonia@g.com", "id":"7e2cad4b3cbe5954950c","slug":"7e2cad4b3cbe5954950c","name":"project1",
|
3
|
+
"wip_limit":"10", "organization_id":"4cd428da96f0734eef000008", "collaborator_ids":"4cd428da96f0734eef000009",
|
4
|
+
"privacy":"0", "created_at":"2011-09-16T12:56:26Z","updated_at":"2011-10-13T16:18:20Z"},
|
5
|
+
{"email":"jhon@g.com", "id":"be74b643b64e3dc79aa0","slug":"be74b643b64e3dc79aa0","name":"project2",
|
6
|
+
"wip_limit":"10", "organization_id":"4cd428da96f0734eef000008", "collaborator_ids":"4cd428da96f0734eef000009",
|
7
|
+
"privacy":"0", "created_at":"2011-09-16T12:56:26Z","updated_at":"2011-10-13T16:18:20Z"}
|
8
|
+
]
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<projects type="array">
|
3
|
+
<project>
|
4
|
+
<email>sonia@g.com</email>
|
5
|
+
<id>7e2cad4b3cbe5954950c</id>
|
6
|
+
<slug>7e2cad4b3cbe5954950c</slug>
|
7
|
+
<name>project1</name>
|
8
|
+
<wip_limit>10</wip_limit>
|
9
|
+
<organization_id>4cd428da96f0734eef000008</organization_id>
|
10
|
+
<collaborator_ids>4cd428da96f0734eef000009</collaborator_ids>
|
11
|
+
<privacy>0</privacy>
|
12
|
+
</project>
|
13
|
+
<project>
|
14
|
+
<email>jhon@g.com</email>
|
15
|
+
<id>be74b643b64e3dc79aa0</id>
|
16
|
+
<slug>be74b643b64e3dc79aa0</slug>
|
17
|
+
<name>project2</name>
|
18
|
+
<wip_limit>10</wip_limit>
|
19
|
+
<organization_id>4cd428da96f0734eef000008</organization_id>
|
20
|
+
<collaborator_ids>4cd428da96f0734eef000009</collaborator_ids>
|
21
|
+
<privacy>0</privacy>
|
22
|
+
</project>
|
23
|
+
</projects>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<project>
|
3
|
+
<email>cris@g.com</email>
|
4
|
+
<id>be74b643b64e3dc79aa0</id>
|
5
|
+
<slug>be74b643b64e3dc79aa0</slug>
|
6
|
+
<created-at type="datetime">2011-03-29T13:10:09Z</created-at>
|
7
|
+
<updated-at type="datetime">2011-07-25T17:01:25Z</updated-at>
|
8
|
+
<name>Untitled</name>
|
9
|
+
<wip_limit>10</wip_limit>
|
10
|
+
<organization_id></organization_id>
|
11
|
+
<collaborator_ids></collaborator_ids>
|
12
|
+
<privacy>0</privacy>
|
13
|
+
</project>
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
{"name":"Planning","queue_name":null,"wip_name":null,"id":"4dc312f49bd0ff6c37000040","wip_limit":null,"all_limit":null}
|
@@ -0,0 +1,2 @@
|
|
1
|
+
[{"assigned_to":[],"backlog":false,"comments_total":0,"created_at":"2011-05-05T21:53:16Z","finished":false,"id":"4cd428c496f0734eef000007","note":"","project_slug":"1c36637a4508065059b3","step_id":"4dc312f49bd0ff6c37000040","task_id":2,"title":"Task","updated_at":"2011-07-15T19:44:04Z","urgent":false,"wip":false},{"assigned_to":[],"backlog":false,"comments_total":1,"created_at":"2011-05-07T02:46:03Z","finished":false,"id":"4dc4b26aa6db681276000013","project_slug":"1c36637a4508065059b3","step_id":"4dc312f49bd0ff6c37000040","task_id":3,"title":"VAMOS A VER SI ES VERDAD","updated_at":"2011-07-15T19:44:04Z","urgent":false,"wip":false},{"assigned_to":[],"backlog":false,"comments_total":0,"created_at":"2011-05-07T02:55:09Z","finished":false,"id":"4dc4b48da6db68138a00000b","project_slug":"1c36637a4508065059b3","step_id":"4dc312f49bd0ff6c37000040","task_id":4,"title":"ANOTHER TASK","updated_at":"2011-07-15T19:44:04Z","urgent":false,"wip":false},{"assigned_to":[],"backlog":false,"comments_total":0,"created_at":"2011-05-07T03:31:23Z","finished":false,"id":"4dc4bd0ba6db681276000017","project_slug":"1c36637a4508065059b3","step_id":"4dc312f49bd0ff6c37000040","task_id":6,"title":"newer task","updated_at":"2011-07-15T19:44:04Z","urgent":false,"wip":false},{"assigned_to":[],"backlog":false,"comments_total":2,"created_at":"2011-05-07T03:33:34Z","finished":false,"id":"4dc4bd8e88de2c119600000c","project_slug":"1c36637a4508065059b3","step_id":"4dc312f49bd0ff6c37000040","task_id":7,"title":"a more newer task","updated_at":"2011-07-15T19:44:04Z","urgent":false,"wip":false}]
|
2
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<tasks type="array">
|
3
|
+
<task>
|
4
|
+
<id>4cd428c496f0734eef000007</id>
|
5
|
+
<task_id>1</task_id>
|
6
|
+
<title>Configure app</title>
|
7
|
+
<assigned_to>jhon</assigned_to>
|
8
|
+
<note></note>
|
9
|
+
<wip type="boolean">false</wip>
|
10
|
+
<project_slug>7e2cad4b3cbe5954950c</project_slug>
|
11
|
+
<backlog>false</backlog>
|
12
|
+
<finished>false</finished>
|
13
|
+
</task>
|
14
|
+
<task>
|
15
|
+
<id>4cd428c496f0734eef000008</id>
|
16
|
+
<task_id>2</task_id>
|
17
|
+
<title>Fix issue</title>
|
18
|
+
<assigned_to>james</assigned_to>
|
19
|
+
<note></note>
|
20
|
+
<wip type="boolean">false</wip>
|
21
|
+
<project_slug>7e2cad4b3cbe5954950c</project_slug>
|
22
|
+
<backlog>false</backlog>
|
23
|
+
<finished>true</finished>
|
24
|
+
</task>
|
25
|
+
</tasks>
|
@@ -0,0 +1,3 @@
|
|
1
|
+
{"id":"4cd428c496f0734eef000007","title":"Fix UI detail","assigned_to":["Rafael George"],"task_id":2,"urgent":false,
|
2
|
+
"note":"Lorem ipsum dolor sit amet, consectetur adipiscing elit.","wip":"false","project_slug":"be74b643b64e3dc79aa0",
|
3
|
+
"project_id":"be74b643b64e3dc79aa0","backlog":"false","finished":"false", "step_id":"4dc312f49bd0ff6c37000040", "created_at":"2011-05-07T02:59:10Z","updated_at":"2011-12-17T00:45:07Z"}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<task>
|
3
|
+
<id>4cd428c496f0734eef000007</id>
|
4
|
+
<task_id>1</task_id>
|
5
|
+
<title>Fix UI detail</title>
|
6
|
+
<urgent>false</urgent>
|
7
|
+
<assigned_to>jhon</assigned_to>
|
8
|
+
<note>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</note>
|
9
|
+
<wip type="boolean">false</wip>
|
10
|
+
<project_slug>be74b643b64e3dc79aa0</project_slug>
|
11
|
+
<project_id>be74b643b64e3dc79aa0</project_id>
|
12
|
+
<backlog>false</backlog>
|
13
|
+
<finished>false</finished>
|
14
|
+
</task>
|
@@ -0,0 +1 @@
|
|
1
|
+
{"assigned_to":[],"backlog":false,"comments_total":0,"created_at":"2011-05-05T21:53:16Z","finished":false,"id":"4cd428c496f0734eef000007","note":"","project_slug":"1c36637a4508065059b3","step_id":"4dc312f49bd0ff6c37000040","task_id":2,"title":"Task","updated_at":"2011-07-15T19:44:04Z","urgent":false,"wip":false}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<task>
|
3
|
+
<id>4cd428c496f0734eef000008</id>
|
4
|
+
<title>Fix bug</title>
|
5
|
+
<assigned_to>chris</assigned_to>
|
6
|
+
<note></note>
|
7
|
+
<task_id>2</task_id>
|
8
|
+
<urgent>false</urgent>
|
9
|
+
<wip type="boolean">false</wip>
|
10
|
+
<project_slug>be74b643b64e3dc79aa0</project_slug>
|
11
|
+
<backlog>false</backlog>
|
12
|
+
<finished>true</finished>
|
13
|
+
</task>
|
@@ -0,0 +1 @@
|
|
1
|
+
{"assigned_to":[],"created_at":"2011-05-05T21:53:16Z","title":"Task","updated_at":"2011-05-06T18:30:39Z","urgent":false,"task_id":2,"id":"4dc31c4c9bd0ff6c3700004e","step_id":"4dc312f49bd0ff6c37000040","note":"","wip":false,"project_slug":"1c36637a4508065059b3","finished":false,"backlog":false, "step_id":"4dc312f49bd0ff6c37000044"}
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe TaskMapper::Provider::Kanbanpad::Comment do
|
4
|
+
before(:all) do
|
5
|
+
headers = {'Authorization' => 'Basic YWJjQGcuY29tOmllODIzZDYzanM='}
|
6
|
+
wheaders = headers.merge('Accept' => 'application/json')
|
7
|
+
pheaders = headers.merge("Content-Type" => "application/json")
|
8
|
+
|
9
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
10
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0.json', wheaders, fixture_for('projects/be74b643b64e3dc79aa0'), 200
|
11
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/comments.json', wheaders, fixture_for('comments'), 200
|
12
|
+
mock.post '/api/v1/projects/be74b643b64e3dc79aa0/comments.json', pheaders, fixture_for('comments/4ef2719bf17365000110df9e'), 200
|
13
|
+
end
|
14
|
+
@project_id = 'be74b643b64e3dc79aa0'
|
15
|
+
@ticket_id = '4cd428c496f0734eef000007'
|
16
|
+
@comment_id = '4d684e6f973c7d5648000009'
|
17
|
+
end
|
18
|
+
|
19
|
+
before(:each) do
|
20
|
+
@taskmapper = TaskMapper.new(:kanbanpad, :username => 'abc@g.com', :password => 'ie823d63js')
|
21
|
+
@project = @taskmapper.project(@project_id)
|
22
|
+
@klass = TaskMapper::Provider::Kanbanpad::Comment
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should be able to load all comments" do
|
26
|
+
comments = @project.comments
|
27
|
+
comments.should be_instance_of Array
|
28
|
+
comments.first.should be_instance_of TaskMapper::Provider::Kanbanpad::Comment
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should be able to create a comment" do
|
32
|
+
comment = @project.comment!(:body => "New Project Comment")
|
33
|
+
comment.should be_an_instance_of(@klass)
|
34
|
+
comment.project_id.should be_a String
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe TaskMapper::Provider::Kanbanpad::Project do
|
4
|
+
before(:all) do
|
5
|
+
headers = {'Authorization' => 'Basic YWJjQGcuY29tOmllODIzZDYzanM='}
|
6
|
+
wheaders = headers.merge('Accept' => 'application/json')
|
7
|
+
@project_id = 'be74b643b64e3dc79aa0'
|
8
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
9
|
+
mock.get '/api/v1/projects.json', wheaders, fixture_for('projects'), 200
|
10
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0.json', wheaders, fixture_for('projects/be74b643b64e3dc79aa0'), 200
|
11
|
+
mock.get '/api/v1/projects/create.json', headers, fixture_for('projects/create'), 200
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
before(:each) do
|
16
|
+
@taskmapper = TaskMapper.new(:kanbanpad, :username => 'abc@g.com', :password => 'ie823d63js')
|
17
|
+
@klass = TaskMapper::Provider::Kanbanpad::Project
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should be able to load all projects" do
|
21
|
+
@taskmapper.projects.should be_an_instance_of(Array)
|
22
|
+
@taskmapper.projects.first.should be_an_instance_of(@klass)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should be able to load projects from an array of ids" do
|
26
|
+
@projects = @taskmapper.projects([@project_id])
|
27
|
+
@projects.should be_an_instance_of(Array)
|
28
|
+
@projects.first.should be_an_instance_of(@klass)
|
29
|
+
@projects.first.slug.should == @project_id
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should be able to load all projects from attributes" do
|
33
|
+
@projects = @taskmapper.projects(:slug => @project_id)
|
34
|
+
@projects.should be_an_instance_of(Array)
|
35
|
+
@projects.first.should be_an_instance_of(@klass)
|
36
|
+
@projects.first.slug.should == @project_id
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should be able to find a project" do
|
40
|
+
@taskmapper.project.should == @klass
|
41
|
+
@taskmapper.project.find(@project_id).should be_an_instance_of(@klass)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should be able to find a project by slug" do
|
45
|
+
@taskmapper.project(@project_id).should be_an_instance_of(@klass)
|
46
|
+
@taskmapper.project(@project_id).slug.should == @project_id
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'rubygems'
|
4
|
+
require 'taskmapper'
|
5
|
+
require 'taskmapper-kanbanpad'
|
6
|
+
require 'rspec'
|
7
|
+
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.color_enabled = true
|
10
|
+
end
|
11
|
+
|
12
|
+
def fixture_for(name)
|
13
|
+
File.read(File.dirname(__FILE__) + '/fixtures/' + name + '.json')
|
14
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe TaskMapper::Provider::Kanbanpad::Comment do
|
4
|
+
before(:all) do
|
5
|
+
headers = {'Authorization' => 'Basic YWJjQGcuY29tOmllODIzZDYzanM='}
|
6
|
+
wheaders = headers.merge('Accept' => 'application/json')
|
7
|
+
pheaders = headers.merge("Content-Type" => "application/json")
|
8
|
+
|
9
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
10
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0.json', wheaders, fixture_for('projects/be74b643b64e3dc79aa0'), 200
|
11
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/tasks.json', wheaders, fixture_for('tasks'), 200
|
12
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/tasks.json?backlog=yes&finished=yes', wheaders, fixture_for('tasks'), 200
|
13
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/tasks/4cd428c496f0734eef000007.json', wheaders, fixture_for('tasks/4cd428c496f0734eef000007'), 200
|
14
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/tasks/4cd428c496f0734eef000007/comments.json', wheaders, fixture_for('comments'), 200
|
15
|
+
mock.post '/api/v1/projects/be74b643b64e3dc79aa0/steps/4dc312f49bd0ff6c37000040/tasks/4cd428c496f0734eef000007/comments.json', pheaders, fixture_for('comments/4ef2719bf17365000110df9e'), 200
|
16
|
+
end
|
17
|
+
@project_id = 'be74b643b64e3dc79aa0'
|
18
|
+
@ticket_id = '4cd428c496f0734eef000007'
|
19
|
+
@comment_id = '4d684e6f973c7d5648000009'
|
20
|
+
end
|
21
|
+
|
22
|
+
before(:each) do
|
23
|
+
@taskmapper = TaskMapper.new(:kanbanpad, :username => 'abc@g.com', :password => 'ie823d63js')
|
24
|
+
@project = @taskmapper.project(@project_id)
|
25
|
+
@ticket = @project.ticket(@ticket_id)
|
26
|
+
@klass = TaskMapper::Provider::Kanbanpad::Comment
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should be able to load all comments" do
|
30
|
+
@comments = @ticket.comments
|
31
|
+
@comments.should be_an_instance_of(Array)
|
32
|
+
@comments.first.should be_an_instance_of(@klass)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should be able to load all comments based on array of id's" do
|
36
|
+
@comments = @ticket.comments([@comment_id])
|
37
|
+
@comments.should be_an_instance_of(Array)
|
38
|
+
@comments.first.should be_an_instance_of(@klass)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should be able to load all comments based on attributes" do
|
42
|
+
@comments = @ticket.comments(:id => @comment_id)
|
43
|
+
@comments.should be_an_instance_of(Array)
|
44
|
+
@comments.first.should be_an_instance_of(@klass)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should be able to create a comment for a given task" do
|
48
|
+
comment = @ticket.comment!(:body => "New Ticket")
|
49
|
+
comment.should be_an_instance_of(@klass)
|
50
|
+
|
51
|
+
comment.ticket_id.should_not be_nil
|
52
|
+
comment.ticket_id.should_not == 0
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|