trollolo 0.0.5 → 0.0.6

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.
@@ -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 "creates first data entry" do
67
- @burndown_data.story_points.open = 16
68
- @burndown_data.story_points.done = 7
69
- @burndown_data.tasks.open = 10
70
- @burndown_data.tasks.done = 11
71
- @burndown_data.date_time = DateTime.parse("2014-05-30")
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
- @chart.add_data(@burndown_data)
87
+ @chart.add_data(@burndown_data)
74
88
 
75
- expect( @chart.data["days"].first["story_points"] ).to eq(
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
- expect( @chart.data["days"].first["tasks"] ).to eq(
81
- {
188
+ expect( @chart.data["days"].last["tasks"] ).to eq ( {
82
189
  "total" => 21,
83
190
  "open" => 10
84
191
  } )
85
- end
86
-
87
- it "returns sprint number" do
88
- expect(@chart.sprint).to eq 1
89
- end
90
-
91
- it "adds data" do
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
- it "replaces data of same day" do
125
- @chart.data["days"] = @raw_data
200
+ it "replaces data of same day" do
201
+ @chart.data["days"] = @raw_data
126
202
 
127
- @burndown_data.story_points.open = 16
128
- @burndown_data.story_points.done = 7
129
- @burndown_data.tasks.open = 10
130
- @burndown_data.tasks.done = 11
131
- @burndown_data.date_time = DateTime.parse("2014-05-30")
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
- @chart.add_data(@burndown_data)
209
+ @chart.add_data(@burndown_data)
134
210
 
135
- expect( @chart.data["days"].count ).to eq 3
136
- expect( @chart.data["days"].last["story_points"] ).to eq ( {
137
- "total" => 23,
138
- "open" => 16
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
- @burndown_data.story_points.done = 8
142
- @chart.add_data(@burndown_data)
217
+ @burndown_data.story_points.done = 8
218
+ @chart.add_data(@burndown_data)
143
219
 
144
- expect( @chart.data["days"].count ).to eq 3
145
- expect( @chart.data["days"].last["story_points"] ).to eq ( {
146
- "total" => 24,
147
- "open" => 16
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
- it "loads the burndown form the 2nd sprint into data" do
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({"meta"=>
270
- {"board_id"=>"53186e8391ef8671265eba9d",
271
- "sprint"=>2,
272
- "total_days"=>9,
273
- "weekend_lines"=>[3.5, 7.5]},
274
- "days"=>[]})
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
- before do
38
- @burndown.fetch
39
- end
40
-
41
- it "returns story points" do
42
- expect( @burndown.story_points.total ).to eq 16
43
- expect( @burndown.story_points.open ).to eq 13
44
- expect( @burndown.story_points.done ).to eq 3
45
- end
46
-
47
- it "returns extra story points" do
48
- expect( @burndown.extra_story_points.total ).to eq 8
49
- expect( @burndown.extra_story_points.open ).to eq 8
50
- expect( @burndown.extra_story_points.done ).to eq 0
51
- end
52
-
53
- it "returns tasks" do
54
- expect( @burndown.tasks.total ).to eq 13
55
- expect( @burndown.tasks.open ).to eq 9
56
- expect( @burndown.tasks.done ).to eq 4
57
- end
58
-
59
- it "returns extra tasks" do
60
- expect( @burndown.extra_tasks.total ).to eq 1
61
- expect( @burndown.extra_tasks.open ).to eq 1
62
- expect( @burndown.extra_tasks.done ).to eq 0
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
- it "returns meta data" do
66
- expect( @burndown.meta ).to eq({
67
- "sprint" => 10,
68
- "total_days" => 18,
69
- "weekend_lines" => [1.5, 6.5, 11.5, 16.5]
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
- it "saves date and time" do
74
- expected_date_time = DateTime.parse("2015-01-12T13:57:16+01:00")
75
- allow(DateTime).to receive(:now).and_return(expected_date_time)
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
@@ -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
@@ -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