trollolo 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -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