tracco 0.0.14 → 0.0.15
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/CHANGELOG +16 -0
- data/Gemfile.lock +1 -1
- data/README.md +4 -4
- data/lib/patches/trello/card.rb +3 -2
- data/lib/patches/trello/member.rb +4 -2
- data/lib/tasks/tasks.rake +2 -2
- data/lib/tracco/google_docs_exporter.rb +50 -47
- data/lib/tracco/models/effort.rb +40 -0
- data/lib/tracco/models/estimate.rb +29 -0
- data/lib/tracco/models/member.rb +64 -0
- data/lib/tracco/models/tracked_card.rb +148 -0
- data/lib/tracco/tracking/base.rb +68 -65
- data/lib/tracco/tracking/card_done_tracking.rb +9 -6
- data/lib/tracco/tracking/effort_tracking.rb +32 -29
- data/lib/tracco/tracking/estimate_tracking.rb +16 -13
- data/lib/tracco/tracking/factory.rb +18 -16
- data/lib/tracco/tracking/invalid_tracking.rb +15 -13
- data/lib/tracco/trello_tracker.rb +34 -30
- data/lib/tracco/version.rb +2 -2
- data/lib/tracco.rb +4 -4
- data/spec/factories/effort_factory.rb +2 -2
- data/spec/factories/estimate_factory.rb +1 -1
- data/spec/factories/tracked_card_factory.rb +1 -1
- data/spec/integration/trello_tracker_spec.rb +49 -47
- data/spec/models/effort_spec.rb +61 -0
- data/spec/models/estimate_spec.rb +40 -0
- data/spec/models/member_spec.rb +83 -0
- data/spec/models/tracked_card_spec.rb +467 -0
- data/spec/support/spec_helper_methods.rb +7 -1
- data/spec/tracking/card_done_tracking_spec.rb +11 -9
- data/spec/tracking/effort_tracking_spec.rb +77 -75
- data/spec/tracking/estimate_tracking_spec.rb +30 -28
- data/spec/tracking/factory_spec.rb +39 -0
- data/spec/trello_tracker_spec.rb +20 -18
- data/tracco.gemspec +1 -1
- metadata +12 -12
- data/lib/tracco/effort.rb +0 -37
- data/lib/tracco/estimate.rb +0 -26
- data/lib/tracco/member.rb +0 -61
- data/lib/tracco/tracked_card.rb +0 -145
- data/spec/effort_spec.rb +0 -59
- data/spec/estimate_spec.rb +0 -38
- data/spec/member_spec.rb +0 -81
- data/spec/tracked_card_spec.rb +0 -465
- data/spec/tracking_factory_spec.rb +0 -42
data/spec/tracked_card_spec.rb
DELETED
@@ -1,465 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe TrackedCard do
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
Date.stub(:today).and_return(Date.parse("2012-11-05"))
|
7
|
-
end
|
8
|
-
|
9
|
-
subject(:card) { build(:tracked_card) }
|
10
|
-
|
11
|
-
before(:each) do
|
12
|
-
# adding a muted effort to check that won't be counted
|
13
|
-
card.efforts << build(:effort, amount: 1000, muted: true)
|
14
|
-
end
|
15
|
-
|
16
|
-
%w{piero tommaso michele}.each do |username|
|
17
|
-
let(username.to_sym) { Member.new(username: username) }
|
18
|
-
end
|
19
|
-
|
20
|
-
describe "validations" do
|
21
|
-
it "is not valid when a name is not given" do
|
22
|
-
TrackedCard.new(trello_id: "123456789", short_id: 1234).should_not be_valid
|
23
|
-
end
|
24
|
-
|
25
|
-
it "is not valid when a short_id is not given" do
|
26
|
-
TrackedCard.new(name: "any", trello_id: "123456789").should_not be_valid
|
27
|
-
end
|
28
|
-
|
29
|
-
it "is not valid when a trello_id is not given" do
|
30
|
-
TrackedCard.new(name: "any", short_id: 1234).should_not be_valid
|
31
|
-
end
|
32
|
-
|
33
|
-
it "is valid when has a name, a short id and a trello id" do
|
34
|
-
TrackedCard.new(name: "any", trello_id: "123456789", short_id: 1234).should be_valid
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe ".find_by_trello_id" do
|
39
|
-
it "finds a card given its Trello id" do
|
40
|
-
card = create(:tracked_card, trello_id: "1")
|
41
|
-
another_card = create(:tracked_card, trello_id: "2")
|
42
|
-
|
43
|
-
TrackedCard.find_by_trello_id("1").should == card
|
44
|
-
TrackedCard.find_by_trello_id("3").should == nil
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
describe ".with_effort_spent_by" do
|
49
|
-
it "finds all the cards worked by a given member" do
|
50
|
-
card = create(:tracked_card, efforts: [build(:effort, members: [piero, tommaso])])
|
51
|
-
another_card = create(:tracked_card, efforts: [build(:effort, members: [piero, michele])])
|
52
|
-
|
53
|
-
TrackedCard.with_effort_spent_by("piero").should =~ [card, another_card]
|
54
|
-
TrackedCard.with_effort_spent_by("tommaso").should == [card]
|
55
|
-
TrackedCard.with_effort_spent_by("michele").should == [another_card]
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe ".efforts_between" do
|
60
|
-
it "finds all the cards worked in a given date range" do
|
61
|
-
a_card = create(:tracked_card, efforts: [build(:effort, date: Date.parse("2013-01-02"))])
|
62
|
-
another_card = create(:tracked_card, efforts: [build(:effort, date: Date.parse("2013-11-03"))])
|
63
|
-
a_very_old_card = create(:tracked_card, efforts: [build(:effort, date: Date.parse("2009-11-03"))])
|
64
|
-
|
65
|
-
TrackedCard.efforts_between(from_date: Date.parse("2012-01-01")).should =~ [a_card, another_card]
|
66
|
-
TrackedCard.efforts_between(from_date: Date.parse("2013-01-01")).should =~ [a_card, another_card]
|
67
|
-
TrackedCard.efforts_between(from_date: Date.parse("2013-01-22")).should == [another_card]
|
68
|
-
TrackedCard.efforts_between(from_date: Date.parse("2014-01-22")).should == []
|
69
|
-
|
70
|
-
TrackedCard.efforts_between(from_date: Date.parse("2012-01-01"), to_date: Date.parse("2012-11-01")).should == []
|
71
|
-
TrackedCard.efforts_between(from_date: Date.parse("2012-01-01"), to_date: Date.parse("2013-02-02")).should == [a_card]
|
72
|
-
TrackedCard.efforts_between(from_date: Date.parse("2012-01-01"), to_date: Date.parse("2014-02-02")).should =~ [a_card, another_card]
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
describe ".all_tracked_cards" do
|
77
|
-
let!(:card) { create(:tracked_card, name: "AAA", estimates: [build(:estimate)], efforts: [build(:effort)]) }
|
78
|
-
let!(:another_card) { create(:tracked_card, name: "ZZZ", estimates: [build(:estimate)], efforts: [build(:effort)]) }
|
79
|
-
let!(:card_without_tracking) { create(:tracked_card) }
|
80
|
-
|
81
|
-
it "finds all tracked cards with a valid tracking" do
|
82
|
-
TrackedCard.all_tracked_cards.should =~ [card, another_card]
|
83
|
-
end
|
84
|
-
|
85
|
-
it "optionally sorts the cards using a given sorting method" do
|
86
|
-
card.update_attributes(name: "AAA")
|
87
|
-
another_card.update_attributes(name: "ZZZ")
|
88
|
-
|
89
|
-
TrackedCard.all_tracked_cards(:sort_by => :name).should == [card, another_card]
|
90
|
-
end
|
91
|
-
|
92
|
-
it "applies an optional sorting order" do
|
93
|
-
card.update_attributes(name: "AAA")
|
94
|
-
another_card.update_attributes(name: "ZZZ")
|
95
|
-
|
96
|
-
card_without_tracking = create(:tracked_card)
|
97
|
-
|
98
|
-
TrackedCard.all_tracked_cards(:sort_by => :name, :order => :desc).should == [another_card, card]
|
99
|
-
end
|
100
|
-
|
101
|
-
it "uses the ascending order as default sorting order option" do
|
102
|
-
card.update_attributes(name: "AAA", short_id: 44)
|
103
|
-
another_card.update_attributes(name: "ZZZ", short_id: 11)
|
104
|
-
card_without_tracking.update_attributes(short_id: 3456)
|
105
|
-
|
106
|
-
TrackedCard.all_tracked_cards(:sort_by => :short_id).should == [another_card, card]
|
107
|
-
end
|
108
|
-
|
109
|
-
end
|
110
|
-
|
111
|
-
describe ".update_or_create_with" do
|
112
|
-
let(:trello_card) { Trello::Card.new("id" => "ABC123", "name" => "a name", "idShort" => 1, "desc" => "any description") }
|
113
|
-
|
114
|
-
before(:each) do
|
115
|
-
Trello::Card.any_instance.stub(:in_done_column?)
|
116
|
-
end
|
117
|
-
|
118
|
-
it "creates a tracked card on a given trello card" do
|
119
|
-
tracked_card = TrackedCard.update_or_create_with(trello_card)
|
120
|
-
|
121
|
-
tracked_card.name.should == "a name"
|
122
|
-
tracked_card.trello_id == "ABC123"
|
123
|
-
tracked_card.short_id == 1
|
124
|
-
end
|
125
|
-
|
126
|
-
it "updates an existing tracked card on a given trello card" do
|
127
|
-
existing_card = create(:tracked_card, name: "an old name", trello_id: trello_card.id)
|
128
|
-
|
129
|
-
updated_card = TrackedCard.update_or_create_with(trello_card)
|
130
|
-
|
131
|
-
updated_card.should == existing_card
|
132
|
-
updated_card.name.should == "a name"
|
133
|
-
end
|
134
|
-
|
135
|
-
it "is nil when the trello card is not valid" do
|
136
|
-
invalid_trello_card = Trello::Card.new("id" => nil, "name" => nil)
|
137
|
-
|
138
|
-
TrackedCard.update_or_create_with(invalid_trello_card).should be_nil
|
139
|
-
TrackedCard.all.should be_empty
|
140
|
-
end
|
141
|
-
|
142
|
-
it "tracks the card as done when the original trello card is moved in a DONE column" do
|
143
|
-
trello_card.stub(:in_done_column?).and_return(true)
|
144
|
-
|
145
|
-
tracked_card = TrackedCard.update_or_create_with(trello_card)
|
146
|
-
|
147
|
-
tracked_card.should be_done
|
148
|
-
end
|
149
|
-
|
150
|
-
it "tracks the card as NOT done when the original trello card is moved in a column different from DONE" do
|
151
|
-
trello_card.stub(:in_done_column?).and_return(false)
|
152
|
-
|
153
|
-
tracked_card = TrackedCard.update_or_create_with(trello_card)
|
154
|
-
|
155
|
-
tracked_card.should_not be_done
|
156
|
-
end
|
157
|
-
|
158
|
-
end
|
159
|
-
|
160
|
-
describe ".build_from" do
|
161
|
-
it "builds a TrackedCard from a Trello Card" do
|
162
|
-
tracked_card = TrackedCard.build_from(Trello::Card.new("name" => "a name", "desc" => "any description"))
|
163
|
-
|
164
|
-
tracked_card.name.should == "a name"
|
165
|
-
tracked_card.description.should == "any description"
|
166
|
-
end
|
167
|
-
|
168
|
-
it "takes the Trello Card id and set it as trello_id" do
|
169
|
-
tracked_card = TrackedCard.build_from(Trello::Card.new("id" => "abc123", "name" => "a name", "desc" => "any description"))
|
170
|
-
|
171
|
-
tracked_card.id.should_not == "abc123"
|
172
|
-
tracked_card.trello_id.should == "abc123"
|
173
|
-
end
|
174
|
-
|
175
|
-
end
|
176
|
-
|
177
|
-
describe "card with muted effort" do
|
178
|
-
it "fetches only non-muted efforts" do
|
179
|
-
card = create(:tracked_card, efforts: [build(:effort, muted: false)])
|
180
|
-
card_with_muted_effort = create(:tracked_card, efforts: [build(:effort, muted: true)])
|
181
|
-
|
182
|
-
TrackedCard.should have(2).cards
|
183
|
-
|
184
|
-
card.efforts.should have(1).effort
|
185
|
-
|
186
|
-
card_with_muted_effort.efforts.should be_empty
|
187
|
-
card_with_muted_effort.efforts.unscoped.should have(1).effort
|
188
|
-
end
|
189
|
-
|
190
|
-
it "skips muted effort when computing the total effort on the card" do
|
191
|
-
card.efforts << build(:effort, amount: 3, muted: true)
|
192
|
-
card.efforts << build(:effort, amount: 5, muted: false)
|
193
|
-
|
194
|
-
card.total_effort.should == 5
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
it "has no estimates and efforts initially" do
|
199
|
-
card.estimates.should be_empty
|
200
|
-
card.efforts.should be_empty
|
201
|
-
end
|
202
|
-
|
203
|
-
it "is possible to add estimates" do
|
204
|
-
card.estimates << build(:estimate) << build(:estimate)
|
205
|
-
card.estimates.should have(2).estimates
|
206
|
-
end
|
207
|
-
|
208
|
-
it "is possible to add efforts" do
|
209
|
-
card.efforts << build(:effort) << build(:effort)
|
210
|
-
card.efforts.should have(2).efforts
|
211
|
-
end
|
212
|
-
|
213
|
-
describe "#trello_notifications" do
|
214
|
-
let(:first_notification) { stub("notification1", date: Date.yesterday) }
|
215
|
-
let(:second_notification) { stub("notification1", date: Date.today) }
|
216
|
-
|
217
|
-
it "fetches all the card notifications from trello" do
|
218
|
-
card.estimates << Estimate.new(tracking_notification_id: "xyz987", amount: 5, date: Date.yesterday)
|
219
|
-
card.efforts << Effort.new(tracking_notification_id: "abc123", amount: 3, date: Date.today, members: [piero])
|
220
|
-
|
221
|
-
Trello::Notification.should_receive(:find).with("xyz987").and_return(second_notification)
|
222
|
-
Trello::Notification.should_receive(:find).with("abc123").and_return(first_notification)
|
223
|
-
|
224
|
-
card.trello_notifications.should == [first_notification, second_notification]
|
225
|
-
end
|
226
|
-
|
227
|
-
it "skips the notifications not found" do
|
228
|
-
card.estimates << build(:estimate, tracking_notification_id: "unexisting_id")
|
229
|
-
card.efforts << build(:effort, tracking_notification_id: "first_notification_id")
|
230
|
-
|
231
|
-
Trello::Notification.should_receive(:find).with("unexisting_id").and_raise(Trello::Error)
|
232
|
-
Trello::Notification.should_receive(:find).with("first_notification_id").and_return(first_notification)
|
233
|
-
|
234
|
-
card.trello_notifications.should == [first_notification]
|
235
|
-
end
|
236
|
-
|
237
|
-
end
|
238
|
-
|
239
|
-
describe "equality" do
|
240
|
-
it "is equal to another TrelloCard when the trello id is the same" do
|
241
|
-
card = TrackedCard.new(name: "a name", trello_id: "123456789")
|
242
|
-
same_card = TrackedCard.new(name: "a name", trello_id: "123456789")
|
243
|
-
another_card = TrackedCard.new(name: "a name", trello_id: "987654321")
|
244
|
-
|
245
|
-
card.should == same_card
|
246
|
-
card.should_not == another_card
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
describe "#add" do
|
251
|
-
let(:card) { build(:tracked_card) }
|
252
|
-
let(:estimate_tracking) { Tracking::EstimateTracking.new(create_notification(data: { 'text' => "@trackinguser [1h]" })) }
|
253
|
-
|
254
|
-
it "adds an estimate from a tracking estimate notification" do
|
255
|
-
card.add(estimate_tracking)
|
256
|
-
card.estimates.should have(1).estimate
|
257
|
-
end
|
258
|
-
|
259
|
-
it "adds an estimate only once" do
|
260
|
-
card.add(estimate_tracking)
|
261
|
-
card.add(estimate_tracking)
|
262
|
-
|
263
|
-
card.estimates.should have(1).estimate
|
264
|
-
end
|
265
|
-
|
266
|
-
it "is done when has a DONE notification" do
|
267
|
-
card.should_not be_done
|
268
|
-
|
269
|
-
card.add(Tracking::CardDoneTracking.new(stub(:notification)))
|
270
|
-
card.should be_done
|
271
|
-
end
|
272
|
-
|
273
|
-
end
|
274
|
-
|
275
|
-
describe "#add!" do
|
276
|
-
let(:card) { build(:tracked_card) }
|
277
|
-
|
278
|
-
it "saves the tracked card after adding the tracking" do
|
279
|
-
any_tracking = Tracking::EstimateTracking.new(create_notification(data: { 'text' => "@trackinguser [1h]" }))
|
280
|
-
|
281
|
-
card.add!(any_tracking)
|
282
|
-
card.reload.should_not be_nil
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
describe "#total_effort" do
|
287
|
-
it "is zero when there's no effort" do
|
288
|
-
card.total_effort.should == 0
|
289
|
-
end
|
290
|
-
|
291
|
-
it "computes the total effort on the card" do
|
292
|
-
card.efforts << build(:effort, amount: 3)
|
293
|
-
card.efforts << build(:effort, amount: 5)
|
294
|
-
|
295
|
-
card.total_effort.should == 3+5
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
describe "#last_estimate_error" do
|
300
|
-
|
301
|
-
it "is nil when the card has no estimate" do
|
302
|
-
card.efforts << build(:effort, amount: 5)
|
303
|
-
|
304
|
-
card.last_estimate_error.should be_nil
|
305
|
-
end
|
306
|
-
|
307
|
-
it "is nil when the card has no effort" do
|
308
|
-
card.efforts << build(:estimate)
|
309
|
-
|
310
|
-
card.last_estimate_error.should be_nil
|
311
|
-
end
|
312
|
-
|
313
|
-
it "is zero when actual effort is equal to estimate" do
|
314
|
-
card.estimates << build(:estimate, amount: 5)
|
315
|
-
card.efforts << build(:effort, amount: 5)
|
316
|
-
|
317
|
-
card.last_estimate_error.should == 0.0
|
318
|
-
end
|
319
|
-
|
320
|
-
it "is 100 when the actual effort is twice the given estimate" do
|
321
|
-
card.estimates << build(:estimate, amount: 5)
|
322
|
-
card.efforts << build(:effort, amount: 10)
|
323
|
-
|
324
|
-
card.last_estimate_error.should == 100.0
|
325
|
-
end
|
326
|
-
|
327
|
-
it "is -50 when the actual effort is half of the given estimate" do
|
328
|
-
card.estimates << build(:estimate, amount: 10)
|
329
|
-
card.efforts << build(:effort, amount: 5)
|
330
|
-
|
331
|
-
card.last_estimate_error.should == -50.0
|
332
|
-
end
|
333
|
-
|
334
|
-
it "is rounded with two decimal digits" do
|
335
|
-
card.estimates << build(:estimate, amount: 3)
|
336
|
-
card.efforts << build(:effort, amount: 5)
|
337
|
-
|
338
|
-
card.last_estimate_error.should == 66.67
|
339
|
-
end
|
340
|
-
|
341
|
-
describe "#estimate_errors" do
|
342
|
-
|
343
|
-
it "collects all the estimate errors against the actual effort" do
|
344
|
-
card.estimates << Estimate.new(amount: 5, date: Date.yesterday)
|
345
|
-
card.efforts << Effort.new(amount: 10, date: Date.yesterday, members: [tommaso])
|
346
|
-
|
347
|
-
card.estimates << Estimate.new(amount: 10, date: Date.today)
|
348
|
-
card.efforts << Effort.new(amount: 5, date: Date.today, members: [tommaso])
|
349
|
-
|
350
|
-
card.estimate_errors.should == [200.0, 50.0]
|
351
|
-
end
|
352
|
-
end
|
353
|
-
|
354
|
-
end
|
355
|
-
|
356
|
-
describe "#members" do
|
357
|
-
it "lists all the members which spent some effort on the card" do
|
358
|
-
card.efforts << build(:effort, members: [piero, tommaso])
|
359
|
-
card.efforts << build(:effort, members: [tommaso])
|
360
|
-
card.efforts << build(:effort, members: [tommaso, michele])
|
361
|
-
|
362
|
-
card.members.should == [piero, tommaso, michele]
|
363
|
-
end
|
364
|
-
end
|
365
|
-
|
366
|
-
describe "#working_start_date" do
|
367
|
-
|
368
|
-
it "is the date of the first effort spent on the card" do
|
369
|
-
card.efforts << build(:effort, date: Date.today)
|
370
|
-
card.efforts << build(:effort, date: Date.yesterday)
|
371
|
-
card.efforts << build(:effort, date: Date.tomorrow)
|
372
|
-
|
373
|
-
card.working_start_date.should == Date.yesterday
|
374
|
-
end
|
375
|
-
end
|
376
|
-
|
377
|
-
describe "#first_activity_date" do
|
378
|
-
it "is the date of the first effort or estimate given on the card" do
|
379
|
-
card.estimates << build(:estimate, date: Date.yesterday)
|
380
|
-
card.estimates << build(:estimate, date: Date.yesterday.prev_day)
|
381
|
-
card.estimates << build(:estimate, date: Date.tomorrow)
|
382
|
-
|
383
|
-
card.efforts << build(:effort, date: Date.yesterday)
|
384
|
-
card.efforts << build(:effort, date: Date.today)
|
385
|
-
|
386
|
-
card.first_activity_date.should == Date.yesterday.prev_day
|
387
|
-
end
|
388
|
-
end
|
389
|
-
|
390
|
-
describe "#first_estimate_date" do
|
391
|
-
it "is the date of the first estimate given on the card" do
|
392
|
-
card.estimates << build(:estimate, date: Date.tomorrow)
|
393
|
-
card.estimates << build(:estimate, date: Date.yesterday.prev_day)
|
394
|
-
card.estimates << build(:estimate, date: Date.today)
|
395
|
-
|
396
|
-
card.first_estimate_date.should == Date.yesterday.prev_day
|
397
|
-
end
|
398
|
-
end
|
399
|
-
|
400
|
-
describe "#last_estimate_date" do
|
401
|
-
it "is the date of the last estimate given on the card" do
|
402
|
-
card.estimates << build(:estimate, date: Date.yesterday)
|
403
|
-
card.estimates << build(:estimate, date: Date.tomorrow)
|
404
|
-
card.estimates << build(:estimate, date: Date.today)
|
405
|
-
|
406
|
-
card.last_estimate_date.should == Date.tomorrow
|
407
|
-
end
|
408
|
-
end
|
409
|
-
|
410
|
-
describe "#no_tracking?" do
|
411
|
-
it "is false when there's no effort or estimate tracked on the card" do
|
412
|
-
card.no_tracking?.should be_true
|
413
|
-
|
414
|
-
card.estimates << build(:estimate, date: Date.yesterday)
|
415
|
-
card.no_tracking?.should be_false
|
416
|
-
end
|
417
|
-
end
|
418
|
-
|
419
|
-
describe "#contains_effort?" do
|
420
|
-
it "counts regular efforts" do
|
421
|
-
effort = build(:effort, amount: 1, muted: false)
|
422
|
-
card.efforts << effort
|
423
|
-
|
424
|
-
card.contains_effort?(effort).should be_true
|
425
|
-
end
|
426
|
-
|
427
|
-
it "counts even muted efforts" do
|
428
|
-
muted_effort = build(:effort, amount: 1, muted: true)
|
429
|
-
card.efforts << muted_effort
|
430
|
-
|
431
|
-
card.contains_effort?(muted_effort).should be_true
|
432
|
-
end
|
433
|
-
|
434
|
-
end
|
435
|
-
|
436
|
-
describe "#to_s" do
|
437
|
-
it "describes the card as a string" do
|
438
|
-
card = TrackedCard.new(name: "A Story Name")
|
439
|
-
card.estimates << Estimate.new(amount: 5, date: Date.today)
|
440
|
-
card.efforts << Effort.new(amount: 3, date: Date.today, members: [Member.new(username: "piero"), Member.new(username: "tommaso")])
|
441
|
-
card.efforts << Effort.new(amount: 6, date: Date.today, members: [Member.new(username: "piero"), Member.new(username: "tommaso")])
|
442
|
-
|
443
|
-
card.to_s.should == %Q{[A Story Name]. Total effort: 9.0h. Estimates ["[2012-11-05] estimated 5.0 hours"]. Efforts: ["[2012-11-05] spent 3.0 hours by @piero, @tommaso", "[2012-11-05] spent 6.0 hours by @piero, @tommaso"]}
|
444
|
-
end
|
445
|
-
end
|
446
|
-
|
447
|
-
describe "#status" do
|
448
|
-
it "is done when is done" do
|
449
|
-
done_card = TrackedCard.new(done: true)
|
450
|
-
done_card.status.should == :done
|
451
|
-
|
452
|
-
done_card.efforts << build(:effort)
|
453
|
-
done_card.status.should == :done
|
454
|
-
end
|
455
|
-
|
456
|
-
it "is todo when no effort has been spent on the card" do
|
457
|
-
card = TrackedCard.new
|
458
|
-
card.status.should == :todo
|
459
|
-
|
460
|
-
card.efforts << build(:effort)
|
461
|
-
card.status.should == :in_progress
|
462
|
-
end
|
463
|
-
end
|
464
|
-
|
465
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Tracking::Factory do
|
4
|
-
|
5
|
-
TIME_MEASUREMENTS = {
|
6
|
-
hours: 'h',
|
7
|
-
days: 'd',
|
8
|
-
giorni: 'g',
|
9
|
-
pomodori: 'p'
|
10
|
-
}
|
11
|
-
|
12
|
-
context "unknown tracking format" do
|
13
|
-
it "builds an invalid tracking instance" do
|
14
|
-
Tracking::Factory.build_from(unrecognized_notification).class.should == Tracking::InvalidTracking
|
15
|
-
|
16
|
-
with_message("@trackinguser +30m") { |tracking| tracking.class.should == Tracking::InvalidTracking }
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
TIME_MEASUREMENTS.each_key do |time_measurement|
|
21
|
-
|
22
|
-
context "estimate tracking notification in #{time_measurement}" do
|
23
|
-
it "builds an estimate tracking instance" do
|
24
|
-
Tracking::Factory.build_from(create_estimate(time_measurement)).class.should == Tracking::EstimateTracking
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context "effort tracking notification in #{time_measurement}" do
|
29
|
-
it "builds an effort tracking instance" do
|
30
|
-
Tracking::Factory.build_from(create_effort(time_measurement)).class.should == Tracking::EffortTracking
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
context "card done tracking notification" do
|
37
|
-
it "builds a card done tracking instance" do
|
38
|
-
with_message("@trackinguser DONE") { |tracking| tracking.class.should == Tracking::CardDoneTracking }
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|