trollolo 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +4 -3
- data/lib/burndown_chart.rb +10 -6
- data/lib/burndown_data.rb +34 -16
- data/lib/card.rb +18 -0
- data/lib/checklist.rb +9 -0
- data/lib/cli.rb +36 -114
- data/lib/column.rb +5 -1
- data/lib/scrum_board.rb +40 -0
- data/lib/trello_wrapper.rb +5 -0
- data/lib/trollolo.rb +1 -0
- data/lib/version.rb +1 -1
- data/spec/data/attachment-data +1 -0
- data/spec/data/board.json +2 -1
- data/spec/data/burndown-data.yaml +6 -0
- data/spec/data/burndown_dir/burndown-data-02.yaml +13 -1
- data/spec/data/create_burndown_helper/burndown-08.png +0 -0
- data/spec/data/create_burndown_helper/burndown-23.png +0 -0
- data/spec/data/create_burndown_helper/burndown-31.png +0 -0
- data/spec/data/create_burndown_helper/burndown-35.png +0 -0
- data/spec/data/full-board.json +166 -22
- data/spec/unit/backup_spec.rb +5 -0
- data/spec/unit/burndown_chart_spec.rb +176 -85
- data/spec/unit/burndown_data_spec.rb +77 -45
- data/spec/unit/card_spec.rb +75 -0
- data/spec/unit/cli_spec.rb +71 -10
- data/spec/unit/support/update_webmock_data +22 -4
- data/spec/unit/trello_wrapper_spec.rb +30 -0
- data/trollolo.gemspec +2 -2
- data/yes_ship_it.conf +2 -2
- metadata +18 -19
- data/man/trollolo.1 +0 -128
- data/man/trollolo.1.html +0 -219
@@ -3,7 +3,6 @@ require_relative 'spec_helper'
|
|
3
3
|
include GivenFilesystemSpecHelpers
|
4
4
|
|
5
5
|
describe BurndownChart do
|
6
|
-
|
7
6
|
before(:each) do
|
8
7
|
@settings = dummy_settings
|
9
8
|
@burndown_data = BurndownData.new(@settings)
|
@@ -58,94 +57,172 @@ describe BurndownChart do
|
|
58
57
|
"tasks_extra" =>
|
59
58
|
{
|
60
59
|
"done" => 2
|
60
|
+
},
|
61
|
+
"story_points_unplanned" =>
|
62
|
+
{
|
63
|
+
"total" => 3,
|
64
|
+
"open" => 1
|
65
|
+
},
|
66
|
+
"tasks_unplanned" =>
|
67
|
+
{
|
68
|
+
"total" => 2,
|
69
|
+
"open" => 1
|
61
70
|
}
|
62
71
|
}
|
63
72
|
]
|
64
73
|
end
|
65
74
|
|
66
|
-
it "
|
67
|
-
@
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
75
|
+
it "returns sprint number" do
|
76
|
+
expect(@chart.sprint).to eq 1
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "#add_data" do
|
80
|
+
it "creates first data entry" do
|
81
|
+
@burndown_data.story_points.open = 16
|
82
|
+
@burndown_data.story_points.done = 7
|
83
|
+
@burndown_data.tasks.open = 10
|
84
|
+
@burndown_data.tasks.done = 11
|
85
|
+
@burndown_data.date_time = DateTime.parse("2014-05-30")
|
72
86
|
|
73
|
-
|
87
|
+
@chart.add_data(@burndown_data)
|
74
88
|
|
75
|
-
|
76
|
-
|
89
|
+
expect( @chart.data["days"].first["story_points"] ).to eq(
|
90
|
+
{
|
91
|
+
"total" => 23,
|
92
|
+
"open" => 16
|
93
|
+
} )
|
94
|
+
expect( @chart.data["days"].first["tasks"] ).to eq(
|
95
|
+
{
|
96
|
+
"total" => 21,
|
97
|
+
"open" => 10
|
98
|
+
} )
|
99
|
+
end
|
100
|
+
|
101
|
+
it "doesn't overwrite first data entry" do
|
102
|
+
@burndown_data.story_points.open = 16
|
103
|
+
@burndown_data.story_points.done = 7
|
104
|
+
@burndown_data.tasks.open = 10
|
105
|
+
@burndown_data.tasks.done = 11
|
106
|
+
@burndown_data.date_time = DateTime.parse("2014-05-30")
|
107
|
+
|
108
|
+
@chart.add_data(@burndown_data)
|
109
|
+
|
110
|
+
@burndown_data.story_points.open = 15
|
111
|
+
@burndown_data.story_points.done = 8
|
112
|
+
@burndown_data.tasks.open = 9
|
113
|
+
@burndown_data.tasks.done = 12
|
114
|
+
@burndown_data.date_time = DateTime.parse("2014-05-30")
|
115
|
+
|
116
|
+
@chart.add_data(@burndown_data)
|
117
|
+
|
118
|
+
expect( @chart.data["days"].first["story_points"] ).to eq(
|
119
|
+
{
|
120
|
+
"total" => 23,
|
121
|
+
"open" => 16
|
122
|
+
} )
|
123
|
+
expect( @chart.data["days"].first["tasks"] ).to eq(
|
124
|
+
{
|
125
|
+
"total" => 21,
|
126
|
+
"open" => 10
|
127
|
+
} )
|
128
|
+
end
|
129
|
+
|
130
|
+
it "does overwrite data entries after first one" do
|
131
|
+
@burndown_data.story_points.open = 16
|
132
|
+
@burndown_data.story_points.done = 7
|
133
|
+
@burndown_data.tasks.open = 10
|
134
|
+
@burndown_data.tasks.done = 11
|
135
|
+
@burndown_data.date_time = DateTime.parse("2014-05-30")
|
136
|
+
|
137
|
+
@chart.add_data(@burndown_data)
|
138
|
+
|
139
|
+
@burndown_data.story_points.open = 16
|
140
|
+
@burndown_data.story_points.done = 7
|
141
|
+
@burndown_data.tasks.open = 10
|
142
|
+
@burndown_data.tasks.done = 11
|
143
|
+
@burndown_data.date_time = DateTime.parse("2014-05-31")
|
144
|
+
|
145
|
+
@chart.add_data(@burndown_data)
|
146
|
+
|
147
|
+
@burndown_data.story_points.open = 15
|
148
|
+
@burndown_data.story_points.done = 8
|
149
|
+
@burndown_data.tasks.open = 9
|
150
|
+
@burndown_data.tasks.done = 12
|
151
|
+
@burndown_data.date_time = DateTime.parse("2014-05-31")
|
152
|
+
|
153
|
+
@chart.add_data(@burndown_data)
|
154
|
+
|
155
|
+
expect( @chart.data["days"][1]["story_points"] ).to eq(
|
156
|
+
{
|
157
|
+
"total" => 23,
|
158
|
+
"open" => 15
|
159
|
+
} )
|
160
|
+
expect( @chart.data["days"][1]["tasks"] ).to eq(
|
161
|
+
{
|
162
|
+
"total" => 21,
|
163
|
+
"open" => 9
|
164
|
+
} )
|
165
|
+
end
|
166
|
+
|
167
|
+
it "adds data" do
|
168
|
+
@chart.data["days"] = @raw_data
|
169
|
+
|
170
|
+
@burndown_data.story_points.open = 16
|
171
|
+
@burndown_data.story_points.done = 7
|
172
|
+
@burndown_data.tasks.open = 10
|
173
|
+
@burndown_data.tasks.done = 11
|
174
|
+
@burndown_data.extra_story_points.open = 2
|
175
|
+
@burndown_data.extra_story_points.done = 3
|
176
|
+
@burndown_data.extra_tasks.open = 5
|
177
|
+
@burndown_data.extra_tasks.done = 2
|
178
|
+
@burndown_data.date_time = DateTime.parse("2014-05-30")
|
179
|
+
|
180
|
+
@chart.add_data(@burndown_data)
|
181
|
+
|
182
|
+
expect( @chart.data["days"].count ).to eq 3
|
183
|
+
expect( @chart.data["days"].last["date"] ).to eq ( "2014-05-30" )
|
184
|
+
expect( @chart.data["days"].last["story_points"] ).to eq ( {
|
77
185
|
"total" => 23,
|
78
186
|
"open" => 16
|
79
187
|
} )
|
80
|
-
|
81
|
-
{
|
188
|
+
expect( @chart.data["days"].last["tasks"] ).to eq ( {
|
82
189
|
"total" => 21,
|
83
190
|
"open" => 10
|
84
191
|
} )
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
@chart.data["days"] = @raw_data
|
93
|
-
|
94
|
-
@burndown_data.story_points.open = 16
|
95
|
-
@burndown_data.story_points.done = 7
|
96
|
-
@burndown_data.tasks.open = 10
|
97
|
-
@burndown_data.tasks.done = 11
|
98
|
-
@burndown_data.extra_story_points.open = 2
|
99
|
-
@burndown_data.extra_story_points.done = 3
|
100
|
-
@burndown_data.extra_tasks.open = 5
|
101
|
-
@burndown_data.extra_tasks.done = 2
|
102
|
-
@burndown_data.date_time = DateTime.parse("2014-05-30")
|
103
|
-
|
104
|
-
@chart.add_data(@burndown_data)
|
105
|
-
|
106
|
-
expect( @chart.data["days"].count ).to eq 3
|
107
|
-
expect( @chart.data["days"].last["date"] ).to eq ( "2014-05-30" )
|
108
|
-
expect( @chart.data["days"].last["story_points"] ).to eq ( {
|
109
|
-
"total" => 23,
|
110
|
-
"open" => 16
|
111
|
-
} )
|
112
|
-
expect( @chart.data["days"].last["tasks"] ).to eq ( {
|
113
|
-
"total" => 21,
|
114
|
-
"open" => 10
|
115
|
-
} )
|
116
|
-
expect( @chart.data["days"].last["story_points_extra"] ).to eq ( {
|
117
|
-
"done" => 3
|
118
|
-
} )
|
119
|
-
expect( @chart.data["days"].last["tasks_extra"] ).to eq ( {
|
120
|
-
"done" => 2
|
121
|
-
} )
|
122
|
-
end
|
192
|
+
expect( @chart.data["days"].last["story_points_extra"] ).to eq ( {
|
193
|
+
"done" => 3
|
194
|
+
} )
|
195
|
+
expect( @chart.data["days"].last["tasks_extra"] ).to eq ( {
|
196
|
+
"done" => 2
|
197
|
+
} )
|
198
|
+
end
|
123
199
|
|
124
|
-
|
125
|
-
|
200
|
+
it "replaces data of same day" do
|
201
|
+
@chart.data["days"] = @raw_data
|
126
202
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
203
|
+
@burndown_data.story_points.open = 16
|
204
|
+
@burndown_data.story_points.done = 7
|
205
|
+
@burndown_data.tasks.open = 10
|
206
|
+
@burndown_data.tasks.done = 11
|
207
|
+
@burndown_data.date_time = DateTime.parse("2014-05-30")
|
132
208
|
|
133
|
-
|
209
|
+
@chart.add_data(@burndown_data)
|
134
210
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
211
|
+
expect( @chart.data["days"].count ).to eq 3
|
212
|
+
expect( @chart.data["days"].last["story_points"] ).to eq ( {
|
213
|
+
"total" => 23,
|
214
|
+
"open" => 16
|
215
|
+
} )
|
140
216
|
|
141
|
-
|
142
|
-
|
217
|
+
@burndown_data.story_points.done = 8
|
218
|
+
@chart.add_data(@burndown_data)
|
143
219
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
220
|
+
expect( @chart.data["days"].count ).to eq 3
|
221
|
+
expect( @chart.data["days"].last["story_points"] ).to eq ( {
|
222
|
+
"total" => 24,
|
223
|
+
"open" => 16
|
224
|
+
} )
|
225
|
+
end
|
149
226
|
end
|
150
227
|
|
151
228
|
describe "#read_data" do
|
@@ -235,7 +312,6 @@ EOT
|
|
235
312
|
expect(File.read(write_path)).to eq expected_file_content
|
236
313
|
end
|
237
314
|
end
|
238
|
-
|
239
315
|
end
|
240
316
|
|
241
317
|
describe "commands" do
|
@@ -264,14 +340,36 @@ EOT
|
|
264
340
|
|
265
341
|
describe "load_last_sprint" do
|
266
342
|
let(:path) { given_directory_from_data("burndown_dir") }
|
267
|
-
|
343
|
+
|
344
|
+
it "loads the burndown from the 2nd sprint into data" do
|
268
345
|
@chart.load_last_sprint(path)
|
269
|
-
expect(@chart.data).to eq(
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
346
|
+
expect(@chart.data).to eq(
|
347
|
+
{ "meta" =>
|
348
|
+
{ "board_id" => "53186e8391ef8671265eba9d",
|
349
|
+
"sprint" => 2,
|
350
|
+
"total_days" => 9,
|
351
|
+
"weekend_lines" => [3.5, 7.5]
|
352
|
+
},
|
353
|
+
"days" => [
|
354
|
+
{ "date" => "2015-08-28",
|
355
|
+
"updated_at" => "2015-08-28T11:04:52+02:00",
|
356
|
+
"story_points" =>
|
357
|
+
{ "total"=>24.0,
|
358
|
+
"open"=>24.0
|
359
|
+
},
|
360
|
+
"tasks" =>
|
361
|
+
{ "total" => 43,
|
362
|
+
"open" => 28
|
363
|
+
},
|
364
|
+
"story_points_extra" =>
|
365
|
+
{ "done"=>2.0
|
366
|
+
},
|
367
|
+
"tasks_extra" =>
|
368
|
+
{ "done" => 5
|
369
|
+
}
|
370
|
+
}
|
371
|
+
]
|
372
|
+
})
|
275
373
|
end
|
276
374
|
|
277
375
|
it "returns the path of the last sprint" do
|
@@ -334,7 +432,6 @@ EOT
|
|
334
432
|
end
|
335
433
|
|
336
434
|
describe "reads meta data from the board" do
|
337
|
-
|
338
435
|
use_given_filesystem
|
339
436
|
|
340
437
|
it "merges meta data from board if present" do
|
@@ -354,26 +451,21 @@ EOT
|
|
354
451
|
end
|
355
452
|
|
356
453
|
describe '.plot' do
|
357
|
-
|
358
454
|
it 'sends joined parsed options to python script' do
|
359
455
|
allow(described_class).to receive(:process_options).and_return(%w{ --test 1 --no-blah })
|
360
456
|
allow(described_class).to receive(:plot_helper).and_return('mescript')
|
361
457
|
expect(described_class).to receive(:system).with('python mescript 42 --test 1 --no-blah')
|
362
458
|
described_class.plot(42, {foo: 1, bar: 2})
|
363
459
|
end
|
364
|
-
|
365
460
|
end
|
366
461
|
|
367
462
|
describe '.plot_helper' do
|
368
|
-
|
369
463
|
it 'expands path to burndown generator' do
|
370
464
|
expect(described_class.plot_helper).to include('scripts/create_burndown.py')
|
371
465
|
end
|
372
|
-
|
373
466
|
end
|
374
467
|
|
375
468
|
describe '.process_options' do
|
376
|
-
|
377
469
|
it 'builds an array of switches for burndown chart based on input hash' do
|
378
470
|
test_hash = { 'no-tasks' => true }
|
379
471
|
expect(described_class.send(:process_options, test_hash)).to eq %w{ --no-tasks }
|
@@ -391,6 +483,5 @@ EOT
|
|
391
483
|
}
|
392
484
|
expect(described_class.send(:process_options, test_hash)).to eq ['--no-tasks', '--with-fast-lane', '--output fanagoro', '--verbose']
|
393
485
|
end
|
394
|
-
|
395
486
|
end
|
396
487
|
end
|
@@ -3,7 +3,6 @@ require_relative 'spec_helper'
|
|
3
3
|
include GivenFilesystemSpecHelpers
|
4
4
|
|
5
5
|
describe BurndownData do
|
6
|
-
|
7
6
|
before(:each) do
|
8
7
|
@burndown = BurndownData.new(dummy_settings)
|
9
8
|
@burndown.board_id = "53186e8391ef8671265eba9d"
|
@@ -15,7 +14,7 @@ describe BurndownData do
|
|
15
14
|
r = described_class.new
|
16
15
|
r.open = 7
|
17
16
|
r.done = 4
|
18
|
-
|
17
|
+
|
19
18
|
expect(r.total).to eq 11
|
20
19
|
end
|
21
20
|
end
|
@@ -25,7 +24,7 @@ describe BurndownData do
|
|
25
24
|
@burndown.story_points.open = 13
|
26
25
|
expect(@burndown.story_points.open).to eq 13
|
27
26
|
end
|
28
|
-
|
27
|
+
|
29
28
|
it "sets open tasks" do
|
30
29
|
@burndown.tasks.open = 42
|
31
30
|
expect(@burndown.tasks.open).to eq 42
|
@@ -33,53 +32,76 @@ describe BurndownData do
|
|
33
32
|
end
|
34
33
|
|
35
34
|
describe "#fetch" do
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
35
|
+
context "with meta data on sprint card" do
|
36
|
+
before do
|
37
|
+
@burndown.fetch
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns story points" do
|
41
|
+
expect( @burndown.story_points.total ).to eq 16
|
42
|
+
expect( @burndown.story_points.open ).to eq 13
|
43
|
+
expect( @burndown.story_points.done ).to eq 3
|
44
|
+
end
|
45
|
+
|
46
|
+
it "returns extra story points" do
|
47
|
+
expect( @burndown.extra_story_points.total ).to eq 8
|
48
|
+
expect( @burndown.extra_story_points.open ).to eq 8
|
49
|
+
expect( @burndown.extra_story_points.done ).to eq 0
|
50
|
+
end
|
51
|
+
|
52
|
+
it "returns unplanned story points" do
|
53
|
+
expect( @burndown.unplanned_story_points.total ).to eq 3
|
54
|
+
expect( @burndown.unplanned_story_points.open ).to eq 1
|
55
|
+
expect( @burndown.unplanned_story_points.done ).to eq 2
|
56
|
+
end
|
57
|
+
|
58
|
+
it "returns tasks" do
|
59
|
+
expect( @burndown.tasks.total ).to eq 13
|
60
|
+
expect( @burndown.tasks.open ).to eq 9
|
61
|
+
expect( @burndown.tasks.done ).to eq 4
|
62
|
+
end
|
63
|
+
|
64
|
+
it "returns extra tasks" do
|
65
|
+
expect( @burndown.extra_tasks.total ).to eq 1
|
66
|
+
expect( @burndown.extra_tasks.open ).to eq 1
|
67
|
+
expect( @burndown.extra_tasks.done ).to eq 0
|
68
|
+
end
|
69
|
+
|
70
|
+
it "returns unplanned tasks" do
|
71
|
+
expect( @burndown.unplanned_tasks.total ).to eq 2
|
72
|
+
expect( @burndown.unplanned_tasks.open ).to eq 1
|
73
|
+
expect( @burndown.unplanned_tasks.done ).to eq 1
|
74
|
+
end
|
75
|
+
|
76
|
+
it "returns meta data" do
|
77
|
+
expect( @burndown.meta ).to eq({
|
78
|
+
"sprint" => 10,
|
79
|
+
"total_days" => 18,
|
80
|
+
"weekend_lines" => [1.5, 6.5, 11.5, 16.5]
|
81
|
+
})
|
82
|
+
end
|
83
|
+
|
84
|
+
it "saves date and time" do
|
85
|
+
expected_date_time = DateTime.parse("2015-01-12T13:57:16+01:00")
|
86
|
+
allow(DateTime).to receive(:now).and_return(expected_date_time)
|
87
|
+
@burndown.fetch
|
88
|
+
expect(@burndown.date_time).to eq(expected_date_time)
|
89
|
+
end
|
63
90
|
end
|
64
91
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
})
|
71
|
-
end
|
92
|
+
context "without meta data on sprint card" do
|
93
|
+
before do
|
94
|
+
allow(Card).to receive(:parse_yaml_from_description).and_return(nil)
|
95
|
+
@burndown.fetch
|
96
|
+
end
|
72
97
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
@burndown.fetch
|
77
|
-
expect(@burndown.date_time).to eq(expected_date_time)
|
98
|
+
it "does not fail" do
|
99
|
+
expect(@burndown.meta).to be(nil)
|
100
|
+
end
|
78
101
|
end
|
79
102
|
end
|
80
103
|
|
81
104
|
describe '#to_hash' do
|
82
|
-
|
83
105
|
it 'converts to hash' do
|
84
106
|
@burndown.story_points.open = 1
|
85
107
|
@burndown.story_points.done = 2
|
@@ -89,6 +111,10 @@ describe BurndownData do
|
|
89
111
|
@burndown.extra_story_points.done = 6
|
90
112
|
@burndown.extra_tasks.open = 7
|
91
113
|
@burndown.extra_tasks.done = 8
|
114
|
+
@burndown.unplanned_story_points.open = 1
|
115
|
+
@burndown.unplanned_story_points.done = 2
|
116
|
+
@burndown.unplanned_tasks.open = 1
|
117
|
+
@burndown.unplanned_tasks.done = 1
|
92
118
|
@burndown.date_time = DateTime.parse('20150115')
|
93
119
|
|
94
120
|
expected_hash = {
|
@@ -107,12 +133,18 @@ describe BurndownData do
|
|
107
133
|
},
|
108
134
|
'tasks_extra' => {
|
109
135
|
'done' => 8
|
136
|
+
},
|
137
|
+
'unplanned_story_points' => {
|
138
|
+
'total' => 3,
|
139
|
+
'open' => 1
|
140
|
+
},
|
141
|
+
'unplanned_tasks' => {
|
142
|
+
'total' => 2,
|
143
|
+
'open' => 1
|
110
144
|
}
|
111
145
|
}
|
112
146
|
|
113
147
|
expect(@burndown.to_hash).to eq(expected_hash)
|
114
148
|
end
|
115
|
-
|
116
149
|
end
|
117
|
-
|
118
150
|
end
|
data/spec/unit/card_spec.rb
CHANGED
@@ -76,4 +76,79 @@ EOT
|
|
76
76
|
expect(meta["weekend_lines"]).to eq([1.5, 6.5])
|
77
77
|
end
|
78
78
|
end
|
79
|
+
|
80
|
+
describe "gets raw JSON" do
|
81
|
+
it "for cards" do
|
82
|
+
@settings = dummy_settings
|
83
|
+
full_board_mock
|
84
|
+
|
85
|
+
trello = TrelloWrapper.new(@settings)
|
86
|
+
board = trello.board("53186e8391ef8671265eba9d")
|
87
|
+
|
88
|
+
expected_json = <<EOT
|
89
|
+
{
|
90
|
+
"id": "5319bf244cc53afd5afd991f",
|
91
|
+
"checkItemStates": [
|
92
|
+
|
93
|
+
],
|
94
|
+
"closed": false,
|
95
|
+
"dateLastActivity": "2014-03-07T12:52:07.236Z",
|
96
|
+
"desc": "",
|
97
|
+
"descData": null,
|
98
|
+
"idBoard": "53186e8391ef8671265eba9d",
|
99
|
+
"idList": "53186e8391ef8671265eba9e",
|
100
|
+
"idMembersVoted": [
|
101
|
+
|
102
|
+
],
|
103
|
+
"idShort": 3,
|
104
|
+
"idAttachmentCover": null,
|
105
|
+
"manualCoverAttachment": false,
|
106
|
+
"idLabels": [
|
107
|
+
"5463b41e74d650d56700f16a"
|
108
|
+
],
|
109
|
+
"name": "Sprint 3",
|
110
|
+
"pos": 65535,
|
111
|
+
"shortLink": "GRsvY3vZ",
|
112
|
+
"badges": {
|
113
|
+
"votes": 0,
|
114
|
+
"viewingMemberVoted": false,
|
115
|
+
"subscribed": false,
|
116
|
+
"fogbugz": "",
|
117
|
+
"checkItems": 0,
|
118
|
+
"checkItemsChecked": 0,
|
119
|
+
"comments": 0,
|
120
|
+
"attachments": 0,
|
121
|
+
"description": false,
|
122
|
+
"due": null
|
123
|
+
},
|
124
|
+
"due": null,
|
125
|
+
"email": "trello@example.com",
|
126
|
+
"idChecklists": [
|
127
|
+
|
128
|
+
],
|
129
|
+
"idMembers": [
|
130
|
+
|
131
|
+
],
|
132
|
+
"labels": [
|
133
|
+
{
|
134
|
+
"id": "5463b41e74d650d56700f16a",
|
135
|
+
"idBoard": "53186e8391ef8671265eba9d",
|
136
|
+
"name": "Sticky",
|
137
|
+
"color": "blue",
|
138
|
+
"uses": 8
|
139
|
+
}
|
140
|
+
],
|
141
|
+
"shortUrl": "https://trello.com/c/GRsvY3vZ",
|
142
|
+
"subscribed": false,
|
143
|
+
"url": "https://trello.com/c/GRsvY3vZ/3-sprint-3",
|
144
|
+
"checklists": [
|
145
|
+
|
146
|
+
]
|
147
|
+
}
|
148
|
+
EOT
|
149
|
+
|
150
|
+
json = board.cards.first.as_json
|
151
|
+
expect(json).to eq(expected_json.chomp)
|
152
|
+
end
|
153
|
+
end
|
79
154
|
end
|
data/spec/unit/cli_spec.rb
CHANGED
@@ -3,22 +3,13 @@ require_relative 'spec_helper'
|
|
3
3
|
include GivenFilesystemSpecHelpers
|
4
4
|
|
5
5
|
describe Cli do
|
6
|
-
|
7
6
|
use_given_filesystem
|
8
7
|
|
9
8
|
before(:each) do
|
10
9
|
Cli.settings = dummy_settings
|
11
10
|
@cli = Cli.new
|
12
|
-
|
13
|
-
allow(STDOUT).to receive(:puts)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "fetches burndown data" do
|
17
|
-
expect_any_instance_of(BurndownData).to receive(:fetch)
|
18
|
-
|
19
|
-
@cli.fetch_burndown_data
|
20
11
|
end
|
21
|
-
|
12
|
+
|
22
13
|
it "fetches burndown data from board-list" do
|
23
14
|
full_board_mock
|
24
15
|
dir = given_directory
|
@@ -35,4 +26,74 @@ describe Cli do
|
|
35
26
|
@cli.backup
|
36
27
|
end
|
37
28
|
|
29
|
+
it "gets lists" do
|
30
|
+
full_board_mock
|
31
|
+
@cli.options = {"board-id" => "53186e8391ef8671265eba9d"}
|
32
|
+
expected_output = <<EOT
|
33
|
+
Sprint Backlog
|
34
|
+
Doing
|
35
|
+
Done Sprint 10
|
36
|
+
Done Sprint 9
|
37
|
+
Done Sprint 8
|
38
|
+
Legend
|
39
|
+
EOT
|
40
|
+
expect {
|
41
|
+
@cli.get_lists
|
42
|
+
}.to output(expected_output).to_stdout
|
43
|
+
end
|
44
|
+
|
45
|
+
it "gets cards" do
|
46
|
+
full_board_mock
|
47
|
+
@cli.options = {"board-id" => "53186e8391ef8671265eba9d"}
|
48
|
+
expected_output = <<EOT
|
49
|
+
Sprint 3
|
50
|
+
(3) P1: Fill Backlog column
|
51
|
+
(5) P4: Read data from Trollolo
|
52
|
+
(3) P5: Save read data as reference data
|
53
|
+
Waterline
|
54
|
+
(8) P6: Celebrate testing board
|
55
|
+
(2) P2: Fill Doing column
|
56
|
+
(1) Fix emergency
|
57
|
+
Burndown chart
|
58
|
+
Sprint 10
|
59
|
+
(3) P3: Fill Done columns
|
60
|
+
(2) Some unplanned work
|
61
|
+
Burndown chart
|
62
|
+
Sprint 9
|
63
|
+
(2) P1: Explain purpose
|
64
|
+
(2) P2: Create Scrum columns
|
65
|
+
Burndown chart
|
66
|
+
Sprint 8
|
67
|
+
(1) P1: Create Trello Testing Board
|
68
|
+
(5) P2: Add fancy background
|
69
|
+
(1) P4: Add legend
|
70
|
+
Purpose
|
71
|
+
Background image
|
72
|
+
EOT
|
73
|
+
expect {
|
74
|
+
@cli.get_cards
|
75
|
+
}.to output(expected_output).to_stdout
|
76
|
+
end
|
77
|
+
|
78
|
+
it "gets checklists" do
|
79
|
+
full_board_mock
|
80
|
+
@cli.options = {"board-id" => "53186e8391ef8671265eba9d"}
|
81
|
+
expected_output = <<EOT
|
82
|
+
Tasks
|
83
|
+
Tasks
|
84
|
+
Tasks
|
85
|
+
Tasks
|
86
|
+
Tasks
|
87
|
+
Feedback
|
88
|
+
Tasks
|
89
|
+
Tasks
|
90
|
+
Tasks
|
91
|
+
Tasks
|
92
|
+
Tasks
|
93
|
+
Tasks
|
94
|
+
EOT
|
95
|
+
expect {
|
96
|
+
@cli.get_checklists
|
97
|
+
}.to output(expected_output).to_stdout
|
98
|
+
end
|
38
99
|
end
|