methodical 0.0.1

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.
@@ -0,0 +1,387 @@
1
+ require File.expand_path("../test_helper", File.dirname(__FILE__))
2
+ require 'methodical/walkthrough'
3
+ require 'methodical/disposition'
4
+ require 'methodical/simple_action_item'
5
+
6
+ class ActionItemTest < Test::Unit::TestCase
7
+ def create_disposition(status)
8
+ Methodical::Disposition.new([status, "", nil])
9
+ end
10
+
11
+ def create_step(status)
12
+ step = Methodical::SimpleActionItem.new("#{status} step") {
13
+ [status, "", nil]
14
+ }
15
+
16
+ # Making #dup return self simplifies setting expectations
17
+ def step.clone
18
+ self
19
+ end
20
+ step
21
+ end
22
+
23
+ def create_succeeding_step
24
+ create_step(:succeeded)
25
+ end
26
+
27
+ def create_failing_step
28
+ create_step(:failed)
29
+ end
30
+
31
+ def create_bad_step
32
+ create_step(:bad)
33
+ end
34
+
35
+ def create_skipped_step
36
+ create_step(:skipped)
37
+ end
38
+
39
+ def create_sufficient_step
40
+ create_step(:sufficient)
41
+ end
42
+
43
+ def create_aborting_step
44
+ create_step(:abort)
45
+ end
46
+
47
+ def create_finishing_step
48
+ create_step(:finish)
49
+ end
50
+
51
+ context "given a checklist" do
52
+ specify "gets its title from the checklist" do
53
+ checklist = stub_everything("Checklist", :title => "TITLE", :map => [])
54
+ it = Methodical::Walkthrough.new(checklist)
55
+ assert_equal "TITLE", it.title
56
+ end
57
+
58
+ specify "starts in the :not_started state" do
59
+ it = Methodical::Walkthrough.new([])
60
+ assert !it.started?
61
+ end
62
+ end
63
+
64
+ context "given some steps" do
65
+ specify "sets step walkthroughs to self" do
66
+ step1 = create_succeeding_step
67
+ step2 = create_succeeding_step
68
+ it = Methodical::Walkthrough.new([step1, step2])
69
+ assert_same it, it[0].walkthrough
70
+ assert_same it, it[1].walkthrough
71
+ end
72
+
73
+ end
74
+
75
+ context "#perform!" do
76
+ specify "updates status callback before and after each step" do
77
+ step1 = create_skipped_step
78
+ step2 = create_succeeding_step
79
+ step3 = create_aborting_step
80
+ step4 = create_succeeding_step
81
+
82
+ sensor = stub("Sensor")
83
+ baton = stub("Baton")
84
+
85
+ it = Methodical::Walkthrough.new([
86
+ step1, step2, step3, step4
87
+ ])
88
+
89
+ sensor.expects(:update).with(it, 0, step1, baton).in_sequence
90
+ step1.expects(:call).returns(create_disposition(:skipped)).in_sequence
91
+ sensor.expects(:update).with(it, 0, step1, baton).in_sequence
92
+
93
+ sensor.expects(:update).with(it, 1, step2, baton).in_sequence
94
+ step2.expects(:call).returns(create_disposition(:succeeded)).in_sequence
95
+ sensor.expects(:update).with(it, 1, step2, baton).in_sequence
96
+
97
+ sensor.expects(:update).with(it, 2, step3, baton).in_sequence
98
+ step3.expects(:call).returns(create_disposition(:abort)).in_sequence
99
+ sensor.expects(:update).with(it, 2, step3, baton).in_sequence
100
+
101
+ sensor.expects(:update).with(it, 3, step4, baton).in_sequence
102
+ step4.expects(:call).never
103
+ sensor.expects(:update).with(it, 3, step4, baton).in_sequence
104
+
105
+ it.perform!(baton) do |*args|
106
+ sensor.update(*args)
107
+ end
108
+ end
109
+
110
+ specify "saves baton" do
111
+ baton = stub("Baton")
112
+
113
+ it = Methodical::Walkthrough.new([])
114
+ it.perform!(baton)
115
+ assert_same baton, it.baton
116
+ end
117
+ end
118
+
119
+ context "#basic_report" do
120
+ specify "includes a list of synopses" do
121
+ it = Methodical::Walkthrough.new([
122
+ stub(:clone => stub_everything(:synopsis => "SYNOPSIS1")),
123
+ stub(:clone => stub_everything(:synopsis => "SYNOPSIS2")),
124
+ stub(:clone => stub_everything(:synopsis => "SYNOPSIS3")),
125
+ ])
126
+ assert_equal "SYNOPSIS1\nSYNOPSIS2\nSYNOPSIS3\n", it.basic_report
127
+ end
128
+ end
129
+
130
+ context "with no steps" do
131
+ specify "ends in the :succeeded state" do
132
+ it = Methodical::Walkthrough.new([])
133
+ it.perform!
134
+ assert it.succeeded?
135
+ end
136
+ end
137
+
138
+ context "with succeeding steps" do
139
+ specify "ends in the :succeeded state" do
140
+ it = Methodical::Walkthrough.new([create_succeeding_step])
141
+ it.perform!
142
+ assert it.succeeded?
143
+ end
144
+
145
+ specify "considers the last step decisive" do
146
+ it = Methodical::Walkthrough.new([create_succeeding_step])
147
+ it.perform!
148
+ assert_equal 0, it.decisive_index
149
+ end
150
+ end
151
+
152
+ context "interrupted in the middle" do
153
+ specify "is in the :in_progress state" do
154
+ step = create_succeeding_step
155
+ step.stubs(:call).raises(SignalException.new("INT"))
156
+ it = Methodical::Walkthrough.new([step])
157
+ begin
158
+ it.perform!
159
+ rescue SignalException
160
+ end
161
+ assert_equal :in_progress, it.status
162
+ assert it.in_progress?
163
+ assert !it.succeeded?
164
+ assert !it.failed?
165
+ assert !it.finished?
166
+ end
167
+ end
168
+
169
+ context "with a failing step" do
170
+ specify "ends in the :failed state" do
171
+ it = Methodical::Walkthrough.new([create_failing_step])
172
+ it.perform!
173
+ assert_equal :failed, it.status
174
+ end
175
+
176
+ specify "considers the last step decisive" do
177
+ it = Methodical::Walkthrough.new([create_failing_step])
178
+ it.perform!
179
+ assert_equal 0, it.decisive_index
180
+ end
181
+ end
182
+
183
+ context "with a bad step" do
184
+ specify "ends in the :failed state" do
185
+ it = Methodical::Walkthrough.new([create_bad_step])
186
+ it.perform!
187
+ assert_equal :failed, it.status
188
+ end
189
+
190
+ specify "considers the last step decisive" do
191
+ it = Methodical::Walkthrough.new([create_failing_step])
192
+ it.perform!
193
+ assert_equal 0, it.decisive_index
194
+ end
195
+ end
196
+
197
+ context "with steps that fail, then succeed" do
198
+ specify "ends in the :failed state" do
199
+ it = Methodical::Walkthrough.new([
200
+ create_failing_step,
201
+ create_succeeding_step
202
+ ])
203
+ it.perform!
204
+ assert_equal :failed, it.status
205
+ end
206
+
207
+ specify "has one failed step" do
208
+ it = Methodical::Walkthrough.new([
209
+ fail_step = create_failing_step,
210
+ create_succeeding_step
211
+ ])
212
+ it.perform!
213
+ assert_equal [fail_step], it.failed_steps
214
+ end
215
+
216
+ # specify "does not set the ignore bit on the second step" do
217
+ # it = Methodical::Walkthrough.new([
218
+ # create_failing_step,
219
+ # step2 = stub_everything(:call => create_disposition(:succeeded))
220
+ # ])
221
+ # step2.expects(:ignored=).never
222
+ # it.perform!
223
+ # end
224
+
225
+ specify "considers the first step to be the decisive step" do
226
+ it = Methodical::Walkthrough.new([
227
+ create_failing_step,
228
+ create_succeeding_step
229
+ ])
230
+ it.perform!
231
+ assert_equal 0, it.decisive_index
232
+ end
233
+
234
+ end
235
+
236
+ context "with steps that succeed, then fail" do
237
+ specify "ends in the :failed state" do
238
+ it = Methodical::Walkthrough.new([
239
+ create_succeeding_step,
240
+ create_failing_step,
241
+ ])
242
+ it.perform!
243
+ assert_equal :failed, it.status
244
+ end
245
+
246
+ specify "considers the last step to be the decisive step" do
247
+ it = Methodical::Walkthrough.new([
248
+ create_succeeding_step,
249
+ create_failing_step,
250
+ ])
251
+ it.perform!
252
+ assert_equal 1, it.decisive_index
253
+ end
254
+ end
255
+
256
+ context "with a skipped step" do
257
+ specify "ends in the :succeeded state" do
258
+ it = Methodical::Walkthrough.new([
259
+ create_skipped_step
260
+ ])
261
+ it.perform!
262
+ assert_equal :succeeded, it.status
263
+ end
264
+
265
+ end
266
+
267
+ context "with an aborting step preceding a succeding step" do
268
+ specify "ends in the :failed state" do
269
+ it = Methodical::Walkthrough.new([
270
+ create_aborting_step,
271
+ create_succeeding_step
272
+ ])
273
+ it.perform!
274
+ assert_equal :failed, it.status
275
+ end
276
+
277
+ specify "does not execute second step" do
278
+ it = Methodical::Walkthrough.new([
279
+ create_aborting_step,
280
+ step2 = stub_everything("Succeeding Step")
281
+ ])
282
+ step2.expects(:call).never
283
+ it.perform!
284
+ end
285
+
286
+ specify "updates status of skipped step" do
287
+ it = Methodical::Walkthrough.new([
288
+ create_aborting_step,
289
+ step2 = stub_everything("Succeeding Step")
290
+ ])
291
+ step2.expects(:update!).
292
+ with(:skipped, "Run aborted by prior step", nil)
293
+ it.perform!
294
+ end
295
+
296
+ specify "considers the aborted step the decisive step" do
297
+ it = Methodical::Walkthrough.new([
298
+ create_aborting_step,
299
+ create_succeeding_step
300
+ ])
301
+ it.perform!
302
+ assert_equal 0, it.decisive_index
303
+ end
304
+ end
305
+
306
+ context "with a finishing step preceding a succeding step" do
307
+ specify "ends in the :succeeded state" do
308
+ it = Methodical::Walkthrough.new([
309
+ create_finishing_step,
310
+ create_succeeding_step
311
+ ])
312
+ it.perform!
313
+ assert_equal :succeeded, it.status
314
+ end
315
+
316
+ specify "does not execute second step" do
317
+ it = Methodical::Walkthrough.new([
318
+ create_finishing_step,
319
+ step2 = stub_everything("Succeeding Step")
320
+ ])
321
+ step2.expects(:call).never
322
+ it.perform!
323
+ end
324
+
325
+ specify "updates status of skipped step" do
326
+ it = Methodical::Walkthrough.new([
327
+ create_finishing_step,
328
+ step2 = stub_everything("Succeeding Step")
329
+ ])
330
+ step2.expects(:update!).
331
+ with(:skipped, "Satisfied by prior step", nil)
332
+ it.perform!
333
+ end
334
+
335
+ specify "considers the finishing step the decisive step" do
336
+ it = Methodical::Walkthrough.new([
337
+ create_finishing_step,
338
+ create_succeeding_step
339
+ ])
340
+ it.perform!
341
+ assert_equal 0, it.decisive_index
342
+ end
343
+ end
344
+
345
+ context "with a sufficient step preceding a failing step" do
346
+ specify "ends in the :succeeded state" do
347
+ it = Methodical::Walkthrough.new([
348
+ create_sufficient_step,
349
+ create_failing_step
350
+ ])
351
+ it.perform!
352
+ assert_equal :succeeded, it.status
353
+ end
354
+
355
+ specify "executes second step" do
356
+ it = Methodical::Walkthrough.new([
357
+ create_sufficient_step,
358
+ step2 = stub_everything("Failing Step")
359
+ ])
360
+ step2.expects(:execute!).
361
+ returns(create_disposition(:failed))
362
+ it.perform!
363
+ end
364
+
365
+ specify "sets ignore bit on second step" do
366
+ it = Methodical::Walkthrough.new([
367
+ create_sufficient_step,
368
+ step2 = stub_everything("Failing Step",
369
+ :execute! => create_disposition(:failed))
370
+ ])
371
+ step2.expects(:ignored=).with(true)
372
+ it.perform!
373
+ end
374
+
375
+ specify "considers the sufficient step the decisive step" do
376
+ it = Methodical::Walkthrough.new([
377
+ create_sufficient_step,
378
+ create_succeeding_step
379
+ ])
380
+ it.perform!
381
+ assert_equal 0, it.decisive_index
382
+ end
383
+
384
+
385
+ end
386
+
387
+ end
@@ -0,0 +1,2 @@
1
+ require File.expand_path('../spec/spec_helper', File.dirname(__FILE__))
2
+ require 'spec/test/unit'
metadata ADDED
@@ -0,0 +1,147 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: methodical
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Avdi Grimm
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-08-31 00:00:00 -04:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: extlib
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ - 9
30
+ - 14
31
+ version: 0.9.14
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: arrayfields
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 4
43
+ - 7
44
+ version: "4.7"
45
+ type: :runtime
46
+ version_requirements: *id002
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ prerelease: false
50
+ requirement: &id003 !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ segments:
55
+ - 1
56
+ - 2
57
+ - 9
58
+ version: 1.2.9
59
+ type: :development
60
+ version_requirements: *id003
61
+ - !ruby/object:Gem::Dependency
62
+ name: mocha
63
+ prerelease: false
64
+ requirement: &id004 !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ segments:
69
+ - 0
70
+ - 9
71
+ - 8
72
+ version: 0.9.8
73
+ type: :development
74
+ version_requirements: *id004
75
+ description: Sorry, no description yet
76
+ email: avdi@avdi.org
77
+ executables: []
78
+
79
+ extensions: []
80
+
81
+ extra_rdoc_files:
82
+ - LICENSE
83
+ - README.rdoc
84
+ files:
85
+ - .document
86
+ - .gitignore
87
+ - LICENSE
88
+ - README.rdoc
89
+ - Rakefile
90
+ - VERSION
91
+ - lib/methodical.rb
92
+ - lib/methodical/action_item.rb
93
+ - lib/methodical/checklist.rb
94
+ - lib/methodical/disposition.rb
95
+ - lib/methodical/dsl.rb
96
+ - lib/methodical/executable.rb
97
+ - lib/methodical/modifier.rb
98
+ - lib/methodical/simple_action_item.rb
99
+ - lib/methodical/walkthrough.rb
100
+ - spec/spec.opts
101
+ - spec/spec_helper.rb
102
+ - test/methodical/checklist_test.rb
103
+ - test/methodical/disposition_test.rb
104
+ - test/methodical/dsl_test.rb
105
+ - test/methodical/modifier_test.rb
106
+ - test/methodical/simple_action_item_test.rb
107
+ - test/methodical/walkthrough_test.rb
108
+ - test/test_helper.rb
109
+ has_rdoc: true
110
+ homepage: http://github.com/avdi/methodical
111
+ licenses: []
112
+
113
+ post_install_message:
114
+ rdoc_options:
115
+ - --charset=UTF-8
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ segments:
123
+ - 0
124
+ version: "0"
125
+ required_rubygems_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ segments:
130
+ - 0
131
+ version: "0"
132
+ requirements: []
133
+
134
+ rubyforge_project:
135
+ rubygems_version: 1.3.6
136
+ signing_key:
137
+ specification_version: 3
138
+ summary: Automation framework for sequential operations
139
+ test_files:
140
+ - spec/spec_helper.rb
141
+ - test/methodical/dsl_test.rb
142
+ - test/methodical/simple_action_item_test.rb
143
+ - test/methodical/disposition_test.rb
144
+ - test/methodical/modifier_test.rb
145
+ - test/methodical/checklist_test.rb
146
+ - test/methodical/walkthrough_test.rb
147
+ - test/test_helper.rb