producer-core 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/features/tests/negated_test.feature +44 -0
- data/lib/producer/core/condition.rb +1 -1
- data/lib/producer/core/condition/dsl.rb +3 -0
- data/lib/producer/core/test.rb +10 -1
- data/lib/producer/core/tests/has_env.rb +1 -1
- data/lib/producer/core/tests/has_file.rb +1 -1
- data/lib/producer/core/version.rb +1 -1
- data/spec/producer/core/actions/echo_spec.rb +1 -5
- data/spec/producer/core/actions/shell_command_spec.rb +1 -3
- data/spec/producer/core/cli_spec.rb +7 -7
- data/spec/producer/core/condition/dsl_spec.rb +22 -12
- data/spec/producer/core/condition_spec.rb +6 -4
- data/spec/producer/core/env_spec.rb +4 -4
- data/spec/producer/core/interpreter_spec.rb +6 -8
- data/spec/producer/core/recipe/dsl_spec.rb +11 -11
- data/spec/producer/core/recipe_spec.rb +2 -2
- data/spec/producer/core/remote/environment_spec.rb +4 -2
- data/spec/producer/core/remote/fs_spec.rb +9 -13
- data/spec/producer/core/remote_spec.rb +6 -6
- data/spec/producer/core/task/dsl_spec.rb +19 -15
- data/spec/producer/core/task_spec.rb +9 -9
- data/spec/producer/core/test_spec.rb +58 -5
- data/spec/producer/core/tests/has_env_spec.rb +6 -6
- data/spec/producer/core/tests/has_file_spec.rb +4 -4
- data/spec/support/net_ssh_story_helpers.rb +1 -1
- data/spec/support/tests_helpers.rb +2 -2
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2806c20d86e7d0aa08f72a3005b5ee5456cad346
|
4
|
+
data.tar.gz: 4c75c67cd9815e30849302aeb9021dcbaf4721a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4cddfc09e41207a5d9f01a9e04bac5c7ec7f841e89ce1e225d073923e5555460461b92f93b2978508c1003d8bdd24c92f9f106e947226190ca165ef78ae10b75
|
7
|
+
data.tar.gz: 3bace5c3bbba48e3727e380f96d5f4a31f11fd29e9a319a7c09b2e284c400c2b105352bca4b3ae4ebfcabb5159faba99b9d88fa4e47153dfd4ff747b92b70d92
|
@@ -0,0 +1,44 @@
|
|
1
|
+
@sshd
|
2
|
+
Feature: negated test prefix (no_)
|
3
|
+
|
4
|
+
Scenario: prefixed test fails when non-prefixed test is successful
|
5
|
+
Given a recipe with:
|
6
|
+
"""
|
7
|
+
target 'some_host.test'
|
8
|
+
|
9
|
+
task :successful_test do
|
10
|
+
condition { has_env :shell }
|
11
|
+
|
12
|
+
echo 'successful_test'
|
13
|
+
end
|
14
|
+
|
15
|
+
task :negated_test do
|
16
|
+
condition { no_has_env :shell }
|
17
|
+
|
18
|
+
echo 'negated_test'
|
19
|
+
end
|
20
|
+
"""
|
21
|
+
When I successfully execute the recipe
|
22
|
+
Then the output must contain "successful_test"
|
23
|
+
And the output must not contain "negated_test"
|
24
|
+
|
25
|
+
Scenario: prefixed test fails when non-prefixed test is failing
|
26
|
+
Given a recipe with:
|
27
|
+
"""
|
28
|
+
target 'some_host.test'
|
29
|
+
|
30
|
+
task :failing_test do
|
31
|
+
condition { has_env :inexistent_var }
|
32
|
+
|
33
|
+
echo 'failing_test'
|
34
|
+
end
|
35
|
+
|
36
|
+
task :negated_test do
|
37
|
+
condition { no_has_env :inexistent_var }
|
38
|
+
|
39
|
+
echo 'negated_test'
|
40
|
+
end
|
41
|
+
"""
|
42
|
+
When I successfully execute the recipe
|
43
|
+
Then the output must not contain "failing_test"
|
44
|
+
And the output must contain "negated_test"
|
data/lib/producer/core/test.rb
CHANGED
@@ -3,9 +3,18 @@ module Producer
|
|
3
3
|
class Test
|
4
4
|
attr_reader :env, :arguments
|
5
5
|
|
6
|
-
def initialize(env, *arguments)
|
6
|
+
def initialize(env, *arguments, negated: false)
|
7
7
|
@env = env
|
8
8
|
@arguments = arguments
|
9
|
+
@negated = negated
|
10
|
+
end
|
11
|
+
|
12
|
+
def negated?
|
13
|
+
@negated
|
14
|
+
end
|
15
|
+
|
16
|
+
def pass?
|
17
|
+
verify ^ negated?
|
9
18
|
end
|
10
19
|
end
|
11
20
|
end
|
@@ -2,15 +2,11 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Producer::Core
|
4
4
|
describe Actions::Echo do
|
5
|
-
let(:env) {
|
5
|
+
let(:env) { double 'env' }
|
6
6
|
let(:text) { 'hello' }
|
7
7
|
subject(:echo) { Actions::Echo.new(env, text) }
|
8
8
|
|
9
9
|
describe '#apply' do
|
10
|
-
before do
|
11
|
-
env.output = StringIO.new
|
12
|
-
end
|
13
|
-
|
14
10
|
it 'outputs the string given as argument through env.output' do
|
15
11
|
expect(env).to receive(:output).with(text)
|
16
12
|
echo.apply
|
@@ -8,9 +8,7 @@ module Producer::Core
|
|
8
8
|
subject(:sh) { Actions::ShellCommand.new(env, command) }
|
9
9
|
|
10
10
|
describe '#apply' do
|
11
|
-
before
|
12
|
-
env.output = StringIO.new
|
13
|
-
end
|
11
|
+
before { env.output = StringIO.new }
|
14
12
|
|
15
13
|
it 'delegates the call to env.remote.execute method' do
|
16
14
|
expect(env.remote).to receive(:execute).with(command)
|
@@ -5,7 +5,7 @@ module Producer::Core
|
|
5
5
|
include ExitHelpers
|
6
6
|
include FixturesHelpers
|
7
7
|
|
8
|
-
let(:recipe_file) { fixture_path_for
|
8
|
+
let(:recipe_file) { fixture_path_for 'recipes/empty.rb' }
|
9
9
|
let(:arguments) { [recipe_file] }
|
10
10
|
subject(:cli) { CLI.new(arguments) }
|
11
11
|
|
@@ -23,13 +23,13 @@ module Producer::Core
|
|
23
23
|
|
24
24
|
describe '#run!' do
|
25
25
|
it 'checks the arguments' do
|
26
|
-
expect(cli).to receive
|
26
|
+
expect(cli).to receive :check_arguments!
|
27
27
|
cli.run!
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'processes the tasks with the interpreter' do
|
31
31
|
allow(cli.recipe).to receive(:tasks) { [:some_task] }
|
32
|
-
expect(cli.interpreter).to receive(:process).with
|
32
|
+
expect(cli.interpreter).to receive(:process).with [:some_task]
|
33
33
|
cli.run!
|
34
34
|
end
|
35
35
|
end
|
@@ -61,12 +61,12 @@ module Producer::Core
|
|
61
61
|
|
62
62
|
describe '#env' do
|
63
63
|
it 'builds an environment with the current recipe' do
|
64
|
-
expect(Env).to receive
|
64
|
+
expect(Env).to receive :new
|
65
65
|
cli.env
|
66
66
|
end
|
67
67
|
|
68
68
|
it 'returns the env' do
|
69
|
-
env = double
|
69
|
+
env = double 'env'
|
70
70
|
allow(Env).to receive(:new) { env }
|
71
71
|
expect(cli.env).to be env
|
72
72
|
end
|
@@ -88,12 +88,12 @@ module Producer::Core
|
|
88
88
|
|
89
89
|
describe '#interpreter' do
|
90
90
|
it 'builds a interpreter' do
|
91
|
-
expect(Interpreter).to receive
|
91
|
+
expect(Interpreter).to receive :new
|
92
92
|
cli.interpreter
|
93
93
|
end
|
94
94
|
|
95
95
|
it 'returns the interpreter' do
|
96
|
-
interpreter = double
|
96
|
+
interpreter = double 'interpreter'
|
97
97
|
allow(Interpreter).to receive(:new) { interpreter }
|
98
98
|
expect(cli.interpreter).to be interpreter
|
99
99
|
end
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
module Producer::Core
|
4
4
|
describe Condition::DSL do
|
5
5
|
let(:block) { proc { :some_condition_code } }
|
6
|
-
let(:env) { double
|
6
|
+
let(:env) { double 'env' }
|
7
7
|
subject(:dsl) { Condition::DSL.new(env, &block) }
|
8
8
|
|
9
9
|
%w[has_env has_file].each do |test|
|
@@ -22,7 +22,7 @@ module Producer::Core
|
|
22
22
|
it 'evaluates the DSL sandbox code' do
|
23
23
|
dsl = double('dsl').as_null_object
|
24
24
|
allow(Condition::DSL).to receive(:new) { dsl }
|
25
|
-
expect(dsl).to receive
|
25
|
+
expect(dsl).to receive :evaluate
|
26
26
|
Condition::DSL.evaluate(env, &block)
|
27
27
|
end
|
28
28
|
|
@@ -33,22 +33,24 @@ module Producer::Core
|
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'returns the condition' do
|
36
|
-
condition = double
|
36
|
+
condition = double 'task'
|
37
37
|
allow(Condition).to receive(:new) { condition }
|
38
38
|
expect(Condition::DSL.evaluate(env, &block)).to be condition
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
42
|
describe '.define_test' do
|
43
|
-
let(:some_test_class) { double
|
43
|
+
let(:some_test_class) { double 'SomeTest class' }
|
44
44
|
|
45
|
-
before
|
46
|
-
Condition::DSL.define_test(:some_test, some_test_class)
|
47
|
-
end
|
45
|
+
before { Condition::DSL.define_test(:some_test, some_test_class) }
|
48
46
|
|
49
47
|
it 'defines a new test keyword' do
|
50
48
|
expect(dsl).to respond_to :some_test
|
51
49
|
end
|
50
|
+
|
51
|
+
it 'defines the negated test' do
|
52
|
+
expect(dsl).to respond_to :no_some_test
|
53
|
+
end
|
52
54
|
end
|
53
55
|
|
54
56
|
describe '#initialize' do
|
@@ -78,12 +80,10 @@ module Producer::Core
|
|
78
80
|
end
|
79
81
|
|
80
82
|
context 'when a defined test keyword is called' do
|
81
|
-
let(:some_test_class) { double
|
83
|
+
let(:some_test_class) { double 'SomeTest class' }
|
82
84
|
let(:block) { proc { some_test :some, :args } }
|
83
85
|
|
84
|
-
before
|
85
|
-
Condition::DSL.define_test(:some_test, some_test_class)
|
86
|
-
end
|
86
|
+
before { Condition::DSL.define_test(:some_test, some_test_class) }
|
87
87
|
|
88
88
|
it 'builds a new test with the env and given arguments' do
|
89
89
|
expect(some_test_class).to receive(:new).with(env, :some, :args)
|
@@ -91,11 +91,21 @@ module Producer::Core
|
|
91
91
|
end
|
92
92
|
|
93
93
|
it 'registers the new test' do
|
94
|
-
some_test = double
|
94
|
+
some_test = double 'SomeTest instance'
|
95
95
|
allow(some_test_class).to receive(:new) { some_test }
|
96
96
|
dsl.evaluate
|
97
97
|
expect(dsl.tests).to include(some_test)
|
98
98
|
end
|
99
|
+
|
100
|
+
context 'when keyword is prefixed with "no_"' do
|
101
|
+
let(:block) { proc { no_some_test :some, :args } }
|
102
|
+
|
103
|
+
it 'builds a negated test' do
|
104
|
+
expect(some_test_class)
|
105
|
+
.to receive(:new).with(env, :some, :args, negated: true)
|
106
|
+
dsl.evaluate
|
107
|
+
end
|
108
|
+
end
|
99
109
|
end
|
100
110
|
end
|
101
111
|
end
|
@@ -8,19 +8,19 @@ module Producer::Core
|
|
8
8
|
subject(:condition) { Condition.new(tests) }
|
9
9
|
|
10
10
|
describe '.evaluate' do
|
11
|
-
let(:env) { double
|
11
|
+
let(:env) { double 'env' }
|
12
12
|
let(:block) { proc { :some_condition_code } }
|
13
13
|
|
14
14
|
it 'delegates to DSL.evaluate' do
|
15
15
|
expect(Condition::DSL)
|
16
16
|
.to receive(:evaluate).with(env) do |&b|
|
17
|
-
expect(b
|
17
|
+
expect(b).to be block
|
18
18
|
end
|
19
19
|
Condition.evaluate(env, &block)
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'returns the evaluated condition' do
|
23
|
-
condition = double
|
23
|
+
condition = double 'condition'
|
24
24
|
allow(Condition::DSL).to receive(:evaluate) { condition }
|
25
25
|
expect(Condition.evaluate(env, &block)).to be condition
|
26
26
|
end
|
@@ -84,8 +84,10 @@ module Producer::Core
|
|
84
84
|
end
|
85
85
|
|
86
86
|
describe '#!' do
|
87
|
-
|
87
|
+
[true, false].each do |b|
|
88
88
|
context "when #met? return #{b}" do
|
89
|
+
before { allow(condition).to receive(:met?) { b } }
|
90
|
+
|
89
91
|
it 'returns the negated #met?' do
|
90
92
|
expect(condition.!).to be !condition.met?
|
91
93
|
end
|
@@ -9,7 +9,7 @@ module Producer::Core
|
|
9
9
|
expect(env.instance_eval { @output }).to eq $stdout
|
10
10
|
end
|
11
11
|
|
12
|
-
it 'assigns
|
12
|
+
it 'assigns no default target' do
|
13
13
|
expect(env.target).not_to be
|
14
14
|
end
|
15
15
|
end
|
@@ -25,11 +25,11 @@ module Producer::Core
|
|
25
25
|
end
|
26
26
|
|
27
27
|
describe '#target' do
|
28
|
-
let(:target) {
|
28
|
+
let(:target) { double 'target' }
|
29
29
|
|
30
30
|
it 'returns the defined target' do
|
31
31
|
env.target = target
|
32
|
-
expect(env.target).to
|
32
|
+
expect(env.target).to be target
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -41,7 +41,7 @@ module Producer::Core
|
|
41
41
|
end
|
42
42
|
|
43
43
|
it 'returns the remote' do
|
44
|
-
remote = double
|
44
|
+
remote = double 'remote'
|
45
45
|
allow(Remote).to receive(:new) { remote }
|
46
46
|
expect(env.remote).to eq remote
|
47
47
|
end
|
@@ -12,24 +12,22 @@ module Producer::Core
|
|
12
12
|
end
|
13
13
|
|
14
14
|
describe '#process_task' do
|
15
|
-
let(:action) { double
|
15
|
+
let(:action) { double 'action' }
|
16
16
|
let(:task) { double('task', actions: [action]).as_null_object }
|
17
17
|
|
18
18
|
context 'when task condition is met' do
|
19
19
|
it 'applies the actions' do
|
20
|
-
expect(action).to receive
|
21
|
-
interpreter.process_task
|
20
|
+
expect(action).to receive :apply
|
21
|
+
interpreter.process_task task
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
context 'when task condition is not met' do
|
26
|
-
before
|
27
|
-
allow(task).to receive(:condition_met?) { false }
|
28
|
-
end
|
26
|
+
before { allow(task).to receive(:condition_met?) { false } }
|
29
27
|
|
30
28
|
it 'does not apply the actions' do
|
31
|
-
expect(action).not_to receive
|
32
|
-
interpreter.process_task
|
29
|
+
expect(action).not_to receive :apply
|
30
|
+
interpreter.process_task task
|
33
31
|
end
|
34
32
|
end
|
35
33
|
end
|
@@ -4,14 +4,14 @@ module Producer::Core
|
|
4
4
|
describe Recipe::DSL do
|
5
5
|
include FixturesHelpers
|
6
6
|
|
7
|
-
let(:code) { proc { } }
|
7
|
+
let(:code) { proc { :some_recipe_code } }
|
8
8
|
let(:env) { double('env').as_null_object }
|
9
9
|
subject(:dsl) { Recipe::DSL.new(&code) }
|
10
10
|
|
11
11
|
describe '.evaluate' do
|
12
12
|
let(:code) { 'nil' }
|
13
13
|
|
14
|
-
it 'builds a new DSL sandbox with given code' do
|
14
|
+
it 'builds a new DSL sandbox with given code as string' do
|
15
15
|
expect(Recipe::DSL).to receive(:new).with(code).and_call_original
|
16
16
|
Recipe::DSL.evaluate(code, env)
|
17
17
|
end
|
@@ -24,7 +24,7 @@ module Producer::Core
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'builds a recipe with evaluated tasks' do
|
27
|
-
dsl = Recipe::DSL.new
|
27
|
+
dsl = Recipe::DSL.new { task(:some_task) { } }
|
28
28
|
allow(Recipe::DSL).to receive(:new) { dsl }
|
29
29
|
expect(Recipe).to receive(:new).with(dsl.tasks)
|
30
30
|
Recipe::DSL.evaluate(code, env)
|
@@ -62,7 +62,7 @@ module Producer::Core
|
|
62
62
|
let(:code) { proc { task(:some_task) { } } }
|
63
63
|
|
64
64
|
it 'returns registered tasks' do
|
65
|
-
dsl.evaluate
|
65
|
+
dsl.evaluate env
|
66
66
|
expect(dsl.tasks[0].name).to eq :some_task
|
67
67
|
end
|
68
68
|
end
|
@@ -70,11 +70,11 @@ module Producer::Core
|
|
70
70
|
describe '#evaluate' do
|
71
71
|
it 'evaluates its code' do
|
72
72
|
dsl = Recipe::DSL.new { throw :recipe_code }
|
73
|
-
expect { dsl.evaluate
|
73
|
+
expect { dsl.evaluate env }.to throw_symbol :recipe_code
|
74
74
|
end
|
75
75
|
|
76
76
|
it 'returns itself' do
|
77
|
-
expect(dsl.evaluate
|
77
|
+
expect(dsl.evaluate env).to eq dsl
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
@@ -85,8 +85,8 @@ module Producer::Core
|
|
85
85
|
let(:code) { proc { env.some_message } }
|
86
86
|
|
87
87
|
it 'returns the current environment' do
|
88
|
-
expect(env).to receive
|
89
|
-
dsl.evaluate
|
88
|
+
expect(env).to receive :some_message
|
89
|
+
dsl.evaluate env
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
@@ -96,7 +96,7 @@ module Producer::Core
|
|
96
96
|
subject(:dsl) { Recipe::DSL.new(code) }
|
97
97
|
|
98
98
|
it 'sources the recipe given as argument' do
|
99
|
-
expect { dsl.evaluate
|
99
|
+
expect { dsl.evaluate env }.to throw_symbol :recipe_code
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
@@ -114,8 +114,8 @@ module Producer::Core
|
|
114
114
|
|
115
115
|
it 'builds a new evaluated task' do
|
116
116
|
expect(Task)
|
117
|
-
.to receive(:evaluate).with(:some_task, env) do |&
|
118
|
-
expect(
|
117
|
+
.to receive(:evaluate).with(:some_task, env) do |&b|
|
118
|
+
expect(b.call).to eq :some_value
|
119
119
|
end
|
120
120
|
dsl
|
121
121
|
end
|
@@ -7,7 +7,7 @@ module Producer::Core
|
|
7
7
|
subject(:recipe) { Recipe.new }
|
8
8
|
|
9
9
|
describe '.evaluate_from_file' do
|
10
|
-
let(:env) { double
|
10
|
+
let(:env) { double 'env' }
|
11
11
|
let(:filepath) { fixture_path_for 'recipes/empty.rb' }
|
12
12
|
|
13
13
|
it 'delegates to DSL.evaluate with the recipe file content' do
|
@@ -17,7 +17,7 @@ module Producer::Core
|
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'returns the evaluated recipe' do
|
20
|
-
recipe = double
|
20
|
+
recipe = double 'recipe'
|
21
21
|
allow(Recipe::DSL).to receive(:evaluate) { recipe }
|
22
22
|
expect(Recipe.evaluate_from_file(filepath, env)).to be recipe
|
23
23
|
end
|
@@ -3,7 +3,9 @@ require 'spec_helper'
|
|
3
3
|
module Producer::Core
|
4
4
|
describe Remote::Environment do
|
5
5
|
let(:variables) { { 'FOO' => 'bar', 'BAZ' => 'qux' } }
|
6
|
-
|
6
|
+
let(:string) { "FOO=bar\nBAZ=qux" }
|
7
|
+
let(:argument) { variables }
|
8
|
+
subject(:environment) { Remote::Environment.new(argument) }
|
7
9
|
|
8
10
|
describe '#initialize' do
|
9
11
|
context 'when a hash is given' do
|
@@ -13,7 +15,7 @@ module Producer::Core
|
|
13
15
|
end
|
14
16
|
|
15
17
|
context 'when a string is given' do
|
16
|
-
|
18
|
+
let(:argument) { string }
|
17
19
|
|
18
20
|
it 'assigns the key/value pairs' do
|
19
21
|
expect(environment.instance_eval { @variables }).to eq variables
|
@@ -15,12 +15,12 @@ module Producer::Core
|
|
15
15
|
before { sftp_story }
|
16
16
|
|
17
17
|
it 'builds a new SFTP session' do
|
18
|
-
expect(remote.session.sftp).to receive
|
18
|
+
expect(remote.session.sftp).to receive :connect
|
19
19
|
fs.sftp
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'returns the new SFTP session' do
|
23
|
-
session = double
|
23
|
+
session = double 'session'
|
24
24
|
allow(remote.session.sftp).to receive(:connect) { session }
|
25
25
|
expect(fs.sftp).to be session
|
26
26
|
end
|
@@ -35,7 +35,7 @@ module Producer::Core
|
|
35
35
|
# part of net-ssh story helpers, which are more close to integration tests.
|
36
36
|
describe '#has_file?', :ssh do
|
37
37
|
let(:file_path) { "some_file_path" }
|
38
|
-
let(:stat) { double
|
38
|
+
let(:stat) { double 'stat' }
|
39
39
|
|
40
40
|
before do
|
41
41
|
sftp_story
|
@@ -44,35 +44,31 @@ module Producer::Core
|
|
44
44
|
|
45
45
|
context 'when path given as argument exists' do
|
46
46
|
context 'when path is a file' do
|
47
|
-
before
|
48
|
-
allow(stat).to receive(:file?) { true }
|
49
|
-
end
|
47
|
+
before { allow(stat).to receive(:file?) { true } }
|
50
48
|
|
51
49
|
it 'returns true' do
|
52
|
-
expect(fs.has_file?
|
50
|
+
expect(fs.has_file? file_path).to be true
|
53
51
|
end
|
54
52
|
end
|
55
53
|
|
56
54
|
context 'when path is not a file' do
|
57
|
-
before
|
58
|
-
allow(stat).to receive(:file?) { false }
|
59
|
-
end
|
55
|
+
before { allow(stat).to receive(:file?) { false } }
|
60
56
|
|
61
57
|
it 'returns false' do
|
62
|
-
expect(fs.has_file?
|
58
|
+
expect(fs.has_file? file_path).to be false
|
63
59
|
end
|
64
60
|
end
|
65
61
|
end
|
66
62
|
|
67
63
|
context 'when querying the path raises a Net::SFTP::StatusException' do
|
68
64
|
before do
|
69
|
-
response = double
|
65
|
+
response = double 'response', code: '42', message: 'some message'
|
70
66
|
ex = Net::SFTP::StatusException.new(response)
|
71
67
|
allow(stat).to receive(:file?).and_raise(ex)
|
72
68
|
end
|
73
69
|
|
74
70
|
it 'returns false' do
|
75
|
-
expect(fs.has_file?
|
71
|
+
expect(fs.has_file? file_path).to be false
|
76
72
|
end
|
77
73
|
end
|
78
74
|
end
|
@@ -7,7 +7,7 @@ module Producer::Core
|
|
7
7
|
|
8
8
|
describe '#hostname' do
|
9
9
|
it 'returns the assignated hostname' do
|
10
|
-
expect(remote.hostname).to
|
10
|
+
expect(remote.hostname).to eq hostname
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -69,12 +69,12 @@ module Producer::Core
|
|
69
69
|
|
70
70
|
describe '#fs' do
|
71
71
|
it 'builds a new FS' do
|
72
|
-
expect(Remote::FS).to receive
|
72
|
+
expect(Remote::FS).to receive :new
|
73
73
|
remote.fs
|
74
74
|
end
|
75
75
|
|
76
76
|
it 'returns the new FS instance' do
|
77
|
-
fs = double
|
77
|
+
fs = double 'fs'
|
78
78
|
allow(Remote::FS).to receive(:new) { fs }
|
79
79
|
expect(remote.fs).to be fs
|
80
80
|
end
|
@@ -103,7 +103,7 @@ module Producer::Core
|
|
103
103
|
ch.sends_exec command
|
104
104
|
ch.gets_data arguments
|
105
105
|
end
|
106
|
-
expect(remote.execute
|
106
|
+
expect(remote.execute command).to eq arguments
|
107
107
|
end
|
108
108
|
|
109
109
|
it 'raises an exception when the exit status code is not 0' do
|
@@ -112,7 +112,7 @@ module Producer::Core
|
|
112
112
|
ch.gets_data arguments
|
113
113
|
ch.gets_exit_status 1
|
114
114
|
end
|
115
|
-
expect { remote.execute
|
115
|
+
expect { remote.execute command }
|
116
116
|
.to raise_error(RemoteCommandExecutionError)
|
117
117
|
end
|
118
118
|
end
|
@@ -134,7 +134,7 @@ module Producer::Core
|
|
134
134
|
end
|
135
135
|
|
136
136
|
it 'returns the environment' do
|
137
|
-
environment = double
|
137
|
+
environment = double 'environment'
|
138
138
|
allow(Remote::Environment).to receive(:new) { environment }
|
139
139
|
expect(remote.environment).to be environment
|
140
140
|
end
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
module Producer::Core
|
4
4
|
describe Task::DSL do
|
5
5
|
let(:block) { proc { } }
|
6
|
-
let(:env) { double
|
6
|
+
let(:env) { double 'env' }
|
7
7
|
subject(:dsl) { Task::DSL.new(&block) }
|
8
8
|
|
9
9
|
%w[echo sh].each do |action|
|
@@ -16,7 +16,11 @@ module Producer::Core
|
|
16
16
|
let(:name) { :some_task }
|
17
17
|
|
18
18
|
it 'builds a new DSL sandbox with given code' do
|
19
|
-
|
19
|
+
dsl = double('dsl').as_null_object
|
20
|
+
expect(Task::DSL).to receive(:new).with(no_args) do |&b|
|
21
|
+
expect(b).to be block
|
22
|
+
dsl
|
23
|
+
end
|
20
24
|
Task::DSL.evaluate(name, env, &block)
|
21
25
|
end
|
22
26
|
|
@@ -38,7 +42,7 @@ module Producer::Core
|
|
38
42
|
end
|
39
43
|
|
40
44
|
it 'returns the task' do
|
41
|
-
task = double
|
45
|
+
task = double 'task'
|
42
46
|
allow(Task).to receive(:new) { task }
|
43
47
|
expect(Task::DSL.evaluate(name, env, &block)).to be task
|
44
48
|
end
|
@@ -57,7 +61,7 @@ module Producer::Core
|
|
57
61
|
end
|
58
62
|
|
59
63
|
it 'assigns true as the condition' do
|
60
|
-
expect(dsl.instance_eval { @condition }).to
|
64
|
+
expect(dsl.instance_eval { @condition }).to be true
|
61
65
|
end
|
62
66
|
end
|
63
67
|
|
@@ -68,11 +72,20 @@ module Producer::Core
|
|
68
72
|
end
|
69
73
|
end
|
70
74
|
|
75
|
+
describe '#condition' do
|
76
|
+
context 'without block' do
|
77
|
+
it 'returns the assigned condition' do
|
78
|
+
dsl.instance_eval { @condition = :some_condition }
|
79
|
+
expect(dsl.condition).to be :some_condition
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
71
84
|
describe '#evaluate' do
|
72
85
|
let(:block) { proc { throw :task_code } }
|
73
86
|
|
74
87
|
it 'evaluates its code' do
|
75
|
-
expect { dsl.evaluate
|
88
|
+
expect { dsl.evaluate env }
|
76
89
|
.to throw_symbol :task_code
|
77
90
|
end
|
78
91
|
|
@@ -82,7 +95,7 @@ module Producer::Core
|
|
82
95
|
|
83
96
|
before do
|
84
97
|
Task::DSL.define_action(:some_action, some_action_class)
|
85
|
-
dsl.evaluate
|
98
|
+
dsl.evaluate env
|
86
99
|
end
|
87
100
|
|
88
101
|
it 'registers the action' do
|
@@ -118,14 +131,5 @@ module Producer::Core
|
|
118
131
|
end
|
119
132
|
end
|
120
133
|
end
|
121
|
-
|
122
|
-
describe '#condition' do
|
123
|
-
context 'without block' do
|
124
|
-
it 'returns the assigned condition' do
|
125
|
-
dsl.instance_eval { @condition = :some_condition }
|
126
|
-
expect(dsl.condition).to be :some_condition
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
134
|
end
|
131
135
|
end
|
@@ -3,24 +3,24 @@ require 'spec_helper'
|
|
3
3
|
module Producer::Core
|
4
4
|
describe Task do
|
5
5
|
let(:name) { :some_task }
|
6
|
-
let(:action) { double
|
7
|
-
let(:condition) { double
|
6
|
+
let(:action) { double 'action' }
|
7
|
+
let(:condition) { double 'condition' }
|
8
8
|
subject(:task) { Task.new(name, [action], condition) }
|
9
9
|
|
10
10
|
describe '.evaluate' do
|
11
|
-
let(:env) { double
|
12
|
-
let(:block) { proc { :
|
11
|
+
let(:env) { double 'env' }
|
12
|
+
let(:block) { proc { :some_task_code } }
|
13
13
|
|
14
14
|
it 'delegates to DSL.evaluate' do
|
15
15
|
expect(Task::DSL)
|
16
16
|
.to receive(:evaluate).with(name, env) do |&b|
|
17
|
-
expect(b
|
17
|
+
expect(b).to be block
|
18
18
|
end
|
19
19
|
Task.evaluate(name, env, &block)
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'returns the evaluated task' do
|
23
|
-
task = double
|
23
|
+
task = double 'task'
|
24
24
|
allow(Task::DSL).to receive(:evaluate) { task }
|
25
25
|
expect(Task.evaluate(name, env, &block)).to be task
|
26
26
|
end
|
@@ -40,14 +40,14 @@ module Producer::Core
|
|
40
40
|
end
|
41
41
|
|
42
42
|
context 'when only the name is given as argument' do
|
43
|
-
subject(:task)
|
43
|
+
subject(:task) { Task.new(name) }
|
44
44
|
|
45
45
|
it 'assigns no action' do
|
46
46
|
expect(task.actions).to be_empty
|
47
47
|
end
|
48
48
|
|
49
|
-
it 'assigns a
|
50
|
-
expect(task.condition).to
|
49
|
+
it 'assigns a true condition' do
|
50
|
+
expect(task.condition).to be true
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
@@ -4,26 +4,79 @@ module Producer::Core
|
|
4
4
|
describe Test do
|
5
5
|
let(:env) { double 'env' }
|
6
6
|
let(:arguments) { [:some, :arguments] }
|
7
|
-
subject(:
|
7
|
+
subject(:test) { Test.new(env, *arguments) }
|
8
8
|
|
9
9
|
describe '#initialize' do
|
10
10
|
it 'assigns the env' do
|
11
|
-
expect(
|
11
|
+
expect(test.instance_eval { @env }).to be env
|
12
12
|
end
|
13
|
+
|
13
14
|
it 'assigns the arguments' do
|
14
|
-
expect(
|
15
|
+
expect(test.instance_eval { @arguments }).to eq arguments
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'assigns negated as false by default' do
|
19
|
+
expect(test.instance_eval { @negated }).to be false
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when negated option is true' do
|
23
|
+
subject(:test) { Test.new(env, *arguments, negated: true) }
|
24
|
+
|
25
|
+
it 'assigns negated as true' do
|
26
|
+
expect(test.instance_eval { @negated }).to be true
|
27
|
+
end
|
15
28
|
end
|
16
29
|
end
|
17
30
|
|
18
31
|
describe '#env' do
|
19
32
|
it 'returns the assigned env' do
|
20
|
-
expect(
|
33
|
+
expect(test.env).to be env
|
21
34
|
end
|
22
35
|
end
|
23
36
|
|
24
37
|
describe '#arguments' do
|
25
38
|
it 'returns the assigned arguments' do
|
26
|
-
expect(
|
39
|
+
expect(test.arguments).to eq arguments
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#negated?' do
|
44
|
+
it 'returns false' do
|
45
|
+
expect(test.negated?).to be false
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'when test is negated' do
|
49
|
+
subject(:test) { Test.new(env, *arguments, negated: true) }
|
50
|
+
|
51
|
+
it 'returns true' do
|
52
|
+
expect(test.negated?).to be true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#pass?' do
|
58
|
+
it 'returns true when #verify is true' do
|
59
|
+
allow(test).to receive(:verify) { true }
|
60
|
+
expect(test.pass?).to be true
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'returns false when #verify is false' do
|
64
|
+
allow(test).to receive(:verify) { false }
|
65
|
+
expect(test.pass?).to be false
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'when test is negated' do
|
69
|
+
subject(:test) { Test.new(env, *arguments, negated: true) }
|
70
|
+
|
71
|
+
it 'returns false when #verify is true' do
|
72
|
+
allow(test).to receive(:verify) { true }
|
73
|
+
expect(test.pass?).to be false
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'returns true when #verify is false' do
|
77
|
+
allow(test).to receive(:verify) { false }
|
78
|
+
expect(test.pass?).to be true
|
79
|
+
end
|
27
80
|
end
|
28
81
|
end
|
29
82
|
end
|
@@ -10,8 +10,8 @@ module Producer::Core
|
|
10
10
|
expect(has_env).to be_a Test
|
11
11
|
end
|
12
12
|
|
13
|
-
describe '#
|
14
|
-
let(:environment) { double
|
13
|
+
describe '#verify' do
|
14
|
+
let(:environment) { double 'environment' }
|
15
15
|
|
16
16
|
before do
|
17
17
|
allow(env.remote).to receive(:environment) { environment }
|
@@ -19,22 +19,22 @@ module Producer::Core
|
|
19
19
|
|
20
20
|
it 'stringifies the queried variable name' do
|
21
21
|
expect(environment).to receive(:has_key?).with(kind_of(String))
|
22
|
-
has_env.
|
22
|
+
has_env.verify
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'upcases the queried variable name' do
|
26
26
|
expect(environment).to receive(:has_key?).with('SOME_VARIABLE_NAME')
|
27
|
-
has_env.
|
27
|
+
has_env.verify
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'returns true when remote environment var is defined' do
|
31
31
|
allow(environment).to receive(:has_key?) { true }
|
32
|
-
expect(has_env.
|
32
|
+
expect(has_env.verify).to be true
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'returns false when remote environment var is not defined' do
|
36
36
|
allow(environment).to receive(:has_key?) { false }
|
37
|
-
expect(has_env.
|
37
|
+
expect(has_env.verify).to be false
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
@@ -10,18 +10,18 @@ module Producer::Core
|
|
10
10
|
expect(has_file).to be_a Test
|
11
11
|
end
|
12
12
|
|
13
|
-
describe '#
|
13
|
+
describe '#verify', :ssh do
|
14
14
|
before { sftp_story }
|
15
15
|
|
16
16
|
it 'delegates the call on remote FS' do
|
17
17
|
expect(env.remote.fs).to receive(:has_file?).with(filepath)
|
18
|
-
has_file.
|
18
|
+
has_file.verify
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'returns the file existence' do
|
22
|
-
existence = double
|
22
|
+
existence = double 'existence'
|
23
23
|
allow(env.remote.fs).to receive(:has_file?) { existence }
|
24
|
-
expect(has_file.
|
24
|
+
expect(has_file.verify).to be existence
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
@@ -36,7 +36,7 @@ module NetSSHStoryHelpers
|
|
36
36
|
def sftp_story
|
37
37
|
story do |session|
|
38
38
|
ch = session.opens_channel
|
39
|
-
ch.sends_subsystem
|
39
|
+
ch.sends_subsystem 'sftp'
|
40
40
|
ch.sends_packet(
|
41
41
|
Net::SFTP::Constants::PacketTypes::FXP_INIT, :long,
|
42
42
|
Net::SFTP::Session::HIGHEST_PROTOCOL_VERSION_SUPPORTED
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: producer-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thibault Jouan
|
@@ -127,6 +127,7 @@ files:
|
|
127
127
|
- features/tasks/evaluation.feature
|
128
128
|
- features/tests/has_env.feature
|
129
129
|
- features/tests/has_file.feature
|
130
|
+
- features/tests/negated_test.feature
|
130
131
|
- lib/producer/core.rb
|
131
132
|
- lib/producer/core/action.rb
|
132
133
|
- lib/producer/core/actions/echo.rb
|
@@ -196,7 +197,7 @@ rubyforge_project:
|
|
196
197
|
rubygems_version: 2.4.5
|
197
198
|
signing_key:
|
198
199
|
specification_version: 4
|
199
|
-
summary: producer-core-0.1.
|
200
|
+
summary: producer-core-0.1.5
|
200
201
|
test_files:
|
201
202
|
- features/actions/echo.feature
|
202
203
|
- features/actions/sh.feature
|
@@ -217,6 +218,7 @@ test_files:
|
|
217
218
|
- features/tasks/evaluation.feature
|
218
219
|
- features/tests/has_env.feature
|
219
220
|
- features/tests/has_file.feature
|
221
|
+
- features/tests/negated_test.feature
|
220
222
|
- spec/fixtures/recipes/empty.rb
|
221
223
|
- spec/fixtures/recipes/throw.rb
|
222
224
|
- spec/producer/core/action_spec.rb
|