spex 0.4.0 → 0.5.0
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/README.md +66 -0
- data/Rakefile +1 -2
- data/VERSION +1 -1
- data/bin/spex +1 -1
- data/examples/chgrp.rb +5 -0
- data/examples/chmod.rb +5 -0
- data/examples/chown.rb +5 -0
- data/examples/puppet.rb +9 -0
- data/examples/touch.rb +5 -0
- data/examples/writing.rb +5 -0
- data/lib/spex.rb +4 -4
- data/lib/spex/assertion.rb +57 -13
- data/lib/spex/assertions/changed_group_assertion.rb +61 -0
- data/lib/spex/assertions/changed_mode_assertion.rb +48 -0
- data/lib/spex/assertions/changed_owner_assertion.rb +73 -0
- data/lib/spex/assertions/created_assertion.rb +26 -0
- data/lib/spex/assertions/file_assertion.rb +1 -10
- data/lib/spex/assertions/modified_assertion.rb +56 -0
- data/lib/spex/assertions/removed_assertion.rb +27 -0
- data/lib/spex/cli.rb +65 -36
- data/lib/spex/execution.rb +37 -0
- data/lib/spex/runner.rb +73 -51
- data/lib/spex/scenario.rb +22 -12
- data/lib/spex/script.rb +13 -18
- data/test/helper.rb +7 -0
- data/test/test_assertion.rb +58 -0
- data/test/test_script.rb +54 -0
- metadata +29 -42
- data/README.markdown +0 -116
- data/examples/chgrp/run.sh +0 -3
- data/examples/chgrp/scenarios.rb +0 -5
- data/examples/chmod/run.sh +0 -3
- data/examples/chmod/scenarios.rb +0 -5
- data/examples/chown/run.sh +0 -3
- data/examples/chown/scenarios.rb +0 -5
- data/examples/puppet/manifest.pp +0 -3
- data/examples/puppet/run.sh +0 -3
- data/examples/puppet/scenarios.rb +0 -5
- data/examples/touch/run.sh +0 -3
- data/examples/touch/scenarios.rb +0 -5
- data/lib/spex/assertions/chgrps_file_assertion.rb +0 -81
- data/lib/spex/assertions/chmods_file_assertion.rb +0 -56
- data/lib/spex/assertions/chowns_file_assertion.rb +0 -81
- data/lib/spex/assertions/creates_file_assertion.rb +0 -31
- data/lib/spex/assertions/removes_file_assertion.rb +0 -31
- data/lib/spex/script/builder.rb +0 -15
- data/test/test_stringup.rb +0 -7
data/lib/spex/script.rb
CHANGED
@@ -1,34 +1,32 @@
|
|
1
1
|
module Spex
|
2
2
|
class Script
|
3
|
+
include Enumerable
|
3
4
|
|
4
5
|
attr_accessor :command
|
5
6
|
|
6
7
|
def self.evaluate_file(path)
|
7
|
-
evaluate(File.read(path), path)
|
8
|
+
evaluate(File.read(path), path, 1)
|
8
9
|
end
|
9
10
|
|
10
|
-
def self.evaluate(
|
11
|
+
def self.evaluate(*args, &block)
|
11
12
|
script = new
|
12
|
-
Builder.new(script
|
13
|
+
builder = Builder.new(script, &block)
|
14
|
+
unless block_given?
|
15
|
+
builder.instance_eval(*args)
|
16
|
+
end
|
13
17
|
script
|
14
18
|
end
|
15
19
|
|
16
20
|
def <<(scenario)
|
17
|
-
scenarios
|
21
|
+
scenarios << scenario
|
18
22
|
end
|
19
23
|
|
20
24
|
def scenarios
|
21
|
-
@scenarios ||=
|
25
|
+
@scenarios ||= []
|
22
26
|
end
|
23
27
|
|
24
|
-
def
|
25
|
-
scenarios
|
26
|
-
end
|
27
|
-
|
28
|
-
def validate!
|
29
|
-
unless @command
|
30
|
-
abort "ERROR: The command was not set.\n\nExample:\n\n command 'cat %s'"
|
31
|
-
end
|
28
|
+
def each(&block)
|
29
|
+
scenarios.each(&block)
|
32
30
|
end
|
33
31
|
|
34
32
|
class Builder
|
@@ -38,13 +36,10 @@ module Spex
|
|
38
36
|
instance_eval(&block) if block_given?
|
39
37
|
end
|
40
38
|
|
41
|
-
def scenario(name,
|
42
|
-
scenario = ::Spex::Scenario.new(name,
|
39
|
+
def scenario(name, &block)
|
40
|
+
scenario = ::Spex::Scenario.new(name, &block)
|
43
41
|
@script << scenario
|
44
42
|
end
|
45
|
-
def command(line)
|
46
|
-
@script.command = line
|
47
|
-
end
|
48
43
|
|
49
44
|
end
|
50
45
|
|
data/test/helper.rb
CHANGED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestAssertion < Test::Unit::TestCase
|
4
|
+
context "Assertion" do
|
5
|
+
setup do
|
6
|
+
@klass = Class.new(Spex::Assertion)
|
7
|
+
end
|
8
|
+
|
9
|
+
context "instances" do
|
10
|
+
should "raise an exception if instantiated with an unknown option" do
|
11
|
+
assert_raises Spex::Assertion::UnknownOptionError do
|
12
|
+
@klass.new('/tmp/foo', :unknown => 'option')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "classes" do
|
18
|
+
context "after being registered" do
|
19
|
+
setup do
|
20
|
+
@klass.as :something, "Something being added"
|
21
|
+
end
|
22
|
+
|
23
|
+
should "be added to the list of assertions" do
|
24
|
+
assert_equal @klass, Spex::Assertion[:something]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "setting an option" do
|
29
|
+
setup do
|
30
|
+
@klass.option :to, 'A desc'
|
31
|
+
end
|
32
|
+
|
33
|
+
should "add one to the mapping" do
|
34
|
+
assert_kind_of Hash, @klass.options
|
35
|
+
assert_equal 1, @klass.options.size
|
36
|
+
end
|
37
|
+
|
38
|
+
context "and the option" do
|
39
|
+
setup do
|
40
|
+
@option = @klass.options[:to]
|
41
|
+
end
|
42
|
+
|
43
|
+
should "be of the correct class" do
|
44
|
+
assert_kind_of Spex::Assertion::Option, @option
|
45
|
+
end
|
46
|
+
|
47
|
+
should "have a name" do
|
48
|
+
assert_equal :to, @option.name
|
49
|
+
end
|
50
|
+
|
51
|
+
should "have a description if given" do
|
52
|
+
assert_equal 'A desc', @option.description
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/test/test_script.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestScript < Test::Unit::TestCase
|
4
|
+
context "evaluating" do
|
5
|
+
context "an empty scenario definition" do
|
6
|
+
setup do
|
7
|
+
script { scenario("name") { } }
|
8
|
+
end
|
9
|
+
|
10
|
+
should "create an empty scenario" do
|
11
|
+
assert_equal 1, @script.scenarios.size
|
12
|
+
assert_equal "name", @script.scenarios.first.name
|
13
|
+
end
|
14
|
+
end
|
15
|
+
context "a scenario definition with an executing definition" do
|
16
|
+
setup do
|
17
|
+
script { scenario("name") { executing('foo') { } } }
|
18
|
+
end
|
19
|
+
|
20
|
+
should "create an scenario" do
|
21
|
+
assert_equal 1, @script.scenarios.size
|
22
|
+
assert_equal "name", @script.scenarios.first.name
|
23
|
+
end
|
24
|
+
|
25
|
+
should "create an execution instance" do
|
26
|
+
assert_equal 1, @script.scenarios.first.executions.size
|
27
|
+
assert_equal 'foo', @script.scenarios.first.executions.first.command
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "a scenario and execution definition with an assertion" do
|
32
|
+
setup do
|
33
|
+
script do
|
34
|
+
scenario("name") do
|
35
|
+
executing('foo') do
|
36
|
+
assert '/tmp/foo', :created => true
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
should "create an assertion instance" do
|
43
|
+
execution = @script.scenarios.first.executions.first
|
44
|
+
assert_equal 1, execution.assertions.size
|
45
|
+
assertion = execution.assertions.first
|
46
|
+
assert_kind_of Spex::Assertion, assertion
|
47
|
+
assert_equal '/tmp/foo', assertion.target
|
48
|
+
assert assertion.active?
|
49
|
+
assert_equal({}, assertion.options)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 5
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.5.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Bruce Williams
|
@@ -14,11 +14,11 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-04-
|
17
|
+
date: 2010-04-13 00:00:00 -07:00
|
18
18
|
default_executable: spex
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
21
|
+
name: colored
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
@@ -29,18 +29,6 @@ dependencies:
|
|
29
29
|
version: "0"
|
30
30
|
type: :runtime
|
31
31
|
version_requirements: *id001
|
32
|
-
- !ruby/object:Gem::Dependency
|
33
|
-
name: shoulda
|
34
|
-
prerelease: false
|
35
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
36
|
-
requirements:
|
37
|
-
- - ">="
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
segments:
|
40
|
-
- 0
|
41
|
-
version: "0"
|
42
|
-
type: :runtime
|
43
|
-
version_requirements: *id002
|
44
32
|
description: An easy-to-use test harness that runs assertions before and after and executable is run
|
45
33
|
email: bruce@codefluency.com
|
46
34
|
executables:
|
@@ -49,41 +37,38 @@ extensions: []
|
|
49
37
|
|
50
38
|
extra_rdoc_files:
|
51
39
|
- LICENSE
|
52
|
-
- README.
|
40
|
+
- README.md
|
53
41
|
files:
|
54
42
|
- .document
|
55
43
|
- .gitignore
|
56
44
|
- LICENSE
|
57
|
-
- README.
|
45
|
+
- README.md
|
58
46
|
- Rakefile
|
59
47
|
- VERSION
|
60
48
|
- bin/spex
|
61
|
-
- examples/chgrp
|
62
|
-
- examples/
|
63
|
-
- examples/
|
64
|
-
- examples/
|
65
|
-
- examples/
|
66
|
-
- examples/
|
67
|
-
- examples/puppet/manifest.pp
|
68
|
-
- examples/puppet/run.sh
|
69
|
-
- examples/puppet/scenarios.rb
|
70
|
-
- examples/touch/run.sh
|
71
|
-
- examples/touch/scenarios.rb
|
49
|
+
- examples/chgrp.rb
|
50
|
+
- examples/chmod.rb
|
51
|
+
- examples/chown.rb
|
52
|
+
- examples/puppet.rb
|
53
|
+
- examples/touch.rb
|
54
|
+
- examples/writing.rb
|
72
55
|
- lib/spex.rb
|
73
56
|
- lib/spex/assertion.rb
|
74
|
-
- lib/spex/assertions/
|
75
|
-
- lib/spex/assertions/
|
76
|
-
- lib/spex/assertions/
|
77
|
-
- lib/spex/assertions/
|
57
|
+
- lib/spex/assertions/changed_group_assertion.rb
|
58
|
+
- lib/spex/assertions/changed_mode_assertion.rb
|
59
|
+
- lib/spex/assertions/changed_owner_assertion.rb
|
60
|
+
- lib/spex/assertions/created_assertion.rb
|
78
61
|
- lib/spex/assertions/file_assertion.rb
|
79
|
-
- lib/spex/assertions/
|
62
|
+
- lib/spex/assertions/modified_assertion.rb
|
63
|
+
- lib/spex/assertions/removed_assertion.rb
|
80
64
|
- lib/spex/cli.rb
|
65
|
+
- lib/spex/execution.rb
|
81
66
|
- lib/spex/runner.rb
|
82
67
|
- lib/spex/scenario.rb
|
83
68
|
- lib/spex/script.rb
|
84
|
-
- lib/spex/script/builder.rb
|
85
69
|
- test/helper.rb
|
86
|
-
- test/
|
70
|
+
- test/test_assertion.rb
|
71
|
+
- test/test_script.rb
|
87
72
|
has_rdoc: true
|
88
73
|
homepage: http://github.com/bruce/spex
|
89
74
|
licenses: []
|
@@ -116,9 +101,11 @@ specification_version: 3
|
|
116
101
|
summary: A test harness for executables
|
117
102
|
test_files:
|
118
103
|
- test/helper.rb
|
119
|
-
- test/
|
120
|
-
-
|
121
|
-
- examples/
|
122
|
-
- examples/
|
123
|
-
- examples/
|
124
|
-
- examples/
|
104
|
+
- test/test_assertion.rb
|
105
|
+
- test/test_script.rb
|
106
|
+
- examples/chgrp.rb
|
107
|
+
- examples/chmod.rb
|
108
|
+
- examples/chown.rb
|
109
|
+
- examples/puppet.rb
|
110
|
+
- examples/touch.rb
|
111
|
+
- examples/writing.rb
|
data/README.markdown
DELETED
@@ -1,116 +0,0 @@
|
|
1
|
-
Spex
|
2
|
-
========
|
3
|
-
|
4
|
-
A quick and dirty test harness for testing assertions before and after
|
5
|
-
an executable is run.
|
6
|
-
|
7
|
-
Synopsis
|
8
|
-
--------
|
9
|
-
|
10
|
-
Spex is a simple language used to define scenarios that model
|
11
|
-
the correct behavior of an executable.
|
12
|
-
|
13
|
-
The description file consists of exactly one `command` line and any
|
14
|
-
number of `scenario` definitions; for example, the following file can
|
15
|
-
be used to verify running `touch /tmp/foo` will create a new file:
|
16
|
-
|
17
|
-
command 'touch /tmp/foo'
|
18
|
-
|
19
|
-
scenario :new, "Creates a file" do
|
20
|
-
assert_creates_file '/tmp/foo'
|
21
|
-
end
|
22
|
-
|
23
|
-
If this was in `scenarios.rb`, you could run this with spex:
|
24
|
-
|
25
|
-
$ spex execute scenarios.rb --scenario new
|
26
|
-
|
27
|
-
If you had named the scenario `default`, the `--scenario` option
|
28
|
-
wouldn't have been necessary, ie:
|
29
|
-
|
30
|
-
scenario :default "Creates a file" do
|
31
|
-
assert_creates_file '/tmp/foo'
|
32
|
-
end
|
33
|
-
|
34
|
-
$ spex execute scenarios.rb
|
35
|
-
|
36
|
-
You'll notice that this should pass the first time and fail on
|
37
|
-
subsequent invocations -- because the `assert_creates` fails in the
|
38
|
-
event a file exists *before* the command is run.
|
39
|
-
|
40
|
-
If you want to see what command and scenarios are defined in a file,
|
41
|
-
use `spex info`, eg:
|
42
|
-
|
43
|
-
$ spex info scenarios.rb
|
44
|
-
|
45
|
-
Commands with arguments
|
46
|
-
-----------------------
|
47
|
-
|
48
|
-
Let's say you had an executable that reads in a configuration file and
|
49
|
-
has some type of side-effect. You'd like to test running the
|
50
|
-
executable against multiple configuration files checking a scenario,
|
51
|
-
without having to edit the spex file every time, changing the path
|
52
|
-
to the configuration file.
|
53
|
-
|
54
|
-
Luckily the command can be provided in `sprintf` style. Assuming our
|
55
|
-
executable is named `myexec` and you pass the configuration file to it
|
56
|
-
via `-c`, the following would work:
|
57
|
-
|
58
|
-
command 'myexec -c %s'
|
59
|
-
|
60
|
-
Now, you just pass more options to `spex execute`:
|
61
|
-
|
62
|
-
$ spex execute scenarios.rb /path/to/my/configuration.conf
|
63
|
-
|
64
|
-
.. and it's just as if you ran:
|
65
|
-
|
66
|
-
$ myexec -c /path/to/my/configuration.conf
|
67
|
-
|
68
|
-
Usage help
|
69
|
-
----------
|
70
|
-
|
71
|
-
See the commandline help documentation:
|
72
|
-
|
73
|
-
$ spex
|
74
|
-
|
75
|
-
For more information on specific commands, you'll want to use `help`,
|
76
|
-
eg:
|
77
|
-
|
78
|
-
$ spex help execute
|
79
|
-
|
80
|
-
Examples
|
81
|
-
--------
|
82
|
-
|
83
|
-
See the `examples/` directory.
|
84
|
-
|
85
|
-
Assertions
|
86
|
-
----------
|
87
|
-
|
88
|
-
The list of assertions is very short at this point.
|
89
|
-
|
90
|
-
To add an assertion, create a class that inherits from
|
91
|
-
`Spex::Assertion` and implements all the neccessary methods. See
|
92
|
-
`Spex::Assertion` and the currently defined assertions for
|
93
|
-
examples.
|
94
|
-
|
95
|
-
Note: If you put your assertions in `~/.spex/assertions/*.rb`,
|
96
|
-
they'll automatically be loaded. If you create any interesting
|
97
|
-
assertions, make sure you let me know!
|
98
|
-
|
99
|
-
### assert_creates_file
|
100
|
-
|
101
|
-
Checks to see if a file was created.
|
102
|
-
|
103
|
-
You can pass `:file => true` or `:directory => true` to ensure the
|
104
|
-
file is a regular file or directory.
|
105
|
-
|
106
|
-
### assert_removes_file
|
107
|
-
|
108
|
-
Checks to see if a file was removed.
|
109
|
-
|
110
|
-
You can pass `:file => true` or `:directory => true` to ensure the
|
111
|
-
file was a regular file or directory before being removed.
|
112
|
-
|
113
|
-
Copyright
|
114
|
-
---------
|
115
|
-
|
116
|
-
Copyright (c) 2010 Bruce Williams. See LICENSE for details.
|
data/examples/chgrp/run.sh
DELETED
data/examples/chgrp/scenarios.rb
DELETED
data/examples/chmod/run.sh
DELETED