onceover 3.9.0 → 3.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +14 -4
- data/Gemfile +4 -0
- data/README.md +5 -3
- data/features/run.feature +12 -6
- data/features/step_definitions/common.rb +6 -0
- data/lib/onceover/testconfig.rb +5 -0
- data/onceover.gemspec +1 -2
- data/spec/fixtures/controlrepos/function_mocking/Puppetfile +0 -13
- data/spec/fixtures/controlrepos/function_mocking/site/profile/functions/fail_puppet.pp +5 -0
- data/spec/fixtures/controlrepos/function_mocking/site/profile/lib/puppet/functions/profile/fail_ruby.rb +9 -0
- data/spec/fixtures/controlrepos/function_mocking/site/profile/manifests/base.pp +10 -0
- data/spec/fixtures/controlrepos/function_mocking/site/role/manifests/{test_functions.pp → test_data_return.pp} +6 -6
- data/spec/fixtures/controlrepos/function_mocking/site/role/manifests/test_new_functions.pp +12 -0
- data/spec/fixtures/controlrepos/function_mocking/spec/onceover.yaml +12 -6
- data/templates/spec_helper.rb.erb +14 -1
- data/templates/test_spec.rb.erb +26 -17
- metadata +7 -19
- data/spec/fixtures/controlrepos/function_mocking/Gemfile +0 -3
- data/spec/fixtures/controlrepos/function_mocking/manifests/site.pp +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c14126b8e9eacece852e8c46c72f444cc44c1922
|
4
|
+
data.tar.gz: a378a1096ca8d649bd63b25e81cc5d782d4fe618
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 379f509f4a9f6a249cc40a771b01979d6416f33fc862e2fa046a8a8b8d788592d6120c853fbdd4aaca50269dd10077c1e596f887a951f116e9fb04b0d331c3df
|
7
|
+
data.tar.gz: 5e62b583ce26d0092e49d9374eaa98b940a5e281686538e4f93cae43a135cdf5d834b52a9c838da771b1a9089c340dc9ad935b9f931f21a8a8643d8547b916b4
|
data/.travis.yml
CHANGED
@@ -8,7 +8,17 @@ cache:
|
|
8
8
|
script: bundle exec rake full_tests
|
9
9
|
bundler_args: --path vendor/bundle
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
matrix:
|
12
|
+
include:
|
13
|
+
# 2016.x -> 2017.2
|
14
|
+
- rvm: 2.1.9
|
15
|
+
env: PUPPET_VERSION="~>4.0"
|
16
|
+
|
17
|
+
# 2017.3 -> 2018.1
|
18
|
+
- rvm: 2.4.4
|
19
|
+
env: PUPPET_VERSION="~>5.0"
|
20
|
+
|
21
|
+
# 2019.0 -> now
|
22
|
+
- rvm: 2.5.1
|
23
|
+
env: PUPPET_VERSION="~>6.0"
|
24
|
+
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -108,8 +108,8 @@ Why an array of hashes? Well, that is so that we can refer to the same node or n
|
|
108
108
|
In the example below we have referred to `centos6a` and `centos7b` in all of our tests as they are in `all_nodes`, `non_windows_servers` and `centos_severs`. However we have *left the more specific references to last*. This is because entries in the test_matrix will override entries above them if applicable. Meaning that we are still only testing each class on the two Centos servers once (Because the gem does de-duplication before running the tests), but also making sure we run `roles::frontend_webserver` twice before checking for idempotency.
|
109
109
|
|
110
110
|
**functions** In this section we can add functions that we want to mock when running spec tests. Each function takes the following arguments:
|
111
|
-
|
112
|
-
|
111
|
+
|
112
|
+
- **returns** *Optional: A value to return*
|
113
113
|
|
114
114
|
**before and after conditions** We can set `before` and `after` blocks before each spec test. These are usually used when the functions to stub are conditional: stub functionx if the OS is windows, stub functiony if the fact java_installed is true. The facts are available through the `node_facts` hash and the trusted facts as `trusted_facts`.
|
115
115
|
|
@@ -196,8 +196,9 @@ test_matrix:
|
|
196
196
|
|
197
197
|
functions:
|
198
198
|
query_resources:
|
199
|
-
type: rvalue
|
200
199
|
returns: []
|
200
|
+
profile::custom_function:
|
201
|
+
returns: ["one", "two"]
|
201
202
|
|
202
203
|
opts:
|
203
204
|
:facts_dirs:
|
@@ -621,3 +622,4 @@ Cheers to all of those who helped out:
|
|
621
622
|
- @tabakhase
|
622
623
|
- @binford2k
|
623
624
|
- @raphink
|
625
|
+
- @tequeter
|
data/features/run.feature
CHANGED
@@ -37,11 +37,6 @@ Feature: Run rspec and acceptance test suites
|
|
37
37
|
And I run onceover command "run spec --force"
|
38
38
|
Then I should see message pattern "Overwriting local modifications"
|
39
39
|
|
40
|
-
Scenario: Run advanced spec tests
|
41
|
-
Given control repo "puppet_controlrepo"
|
42
|
-
When I run onceover command "run spec"
|
43
|
-
Then I should not see any errors
|
44
|
-
|
45
40
|
Scenario: Check that control_branch functionality works
|
46
41
|
Given initialized control repo "control_branch"
|
47
42
|
When I run onceover command "run spec"
|
@@ -49,5 +44,16 @@ Feature: Run rspec and acceptance test suites
|
|
49
44
|
|
50
45
|
Scenario: Mocking functions should work and return the correct data types
|
51
46
|
Given control repo "function_mocking"
|
52
|
-
When I run onceover command "run spec"
|
47
|
+
When I run onceover command "run spec" with class "role::test_data_return"
|
53
48
|
Then I should not see any errors
|
49
|
+
|
50
|
+
Scenario: Mocking functions that use the new :: pathing
|
51
|
+
Given control repo "function_mocking"
|
52
|
+
When I run onceover command "run spec" with class "role::test_new_functions"
|
53
|
+
Then I should not see any errors
|
54
|
+
|
55
|
+
# This test is a full test using my controlrepo. It should remain at the end because it takes ages
|
56
|
+
Scenario: Run advanced spec tests
|
57
|
+
Given control repo "puppet_controlrepo"
|
58
|
+
When I run onceover command "run spec"
|
59
|
+
Then I should not see any errors
|
@@ -31,6 +31,12 @@ When(/^I run onceover command "([^"]*)"$/) do |command|
|
|
31
31
|
@cmd.run
|
32
32
|
end
|
33
33
|
|
34
|
+
When(/^I run onceover command "([^"]*)" with class "([^"]*)"$/) do |command, cls|
|
35
|
+
@cmd.command = "#{command} --classes #{cls}"
|
36
|
+
puts @cmd
|
37
|
+
@cmd.run
|
38
|
+
end
|
39
|
+
|
34
40
|
Then(/^I see help for commands: "([^"]*)"$/) do |commands|
|
35
41
|
# Get chunk of output between COMMANDS and OPTION, there should be help section
|
36
42
|
commands_help = @cmd.output[/COMMANDS(.*)OPTIONS/m, 1]
|
data/lib/onceover/testconfig.rb
CHANGED
@@ -71,6 +71,11 @@ class Onceover
|
|
71
71
|
@skip_r10k = opts[:skip_r10k] ? true : false
|
72
72
|
@force = opts[:force] || false
|
73
73
|
|
74
|
+
# Validate the mock_functions
|
75
|
+
if @mock_functions && @mock_functions.any? { |name, details| details.has_key? 'type' }
|
76
|
+
logger.warn "The 'type' key for mocked functions is deprecated and will be ignored, please remove it."
|
77
|
+
end
|
78
|
+
|
74
79
|
# Loop over all of the items in the test matrix and add those as test
|
75
80
|
# objects to the list of tests
|
76
81
|
config['test_matrix'].each do |test_hash|
|
data/onceover.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "onceover"
|
7
|
-
s.version = "3.
|
7
|
+
s.version = "3.10.0"
|
8
8
|
s.authors = ["Dylan Ratcliffe"]
|
9
9
|
s.email = ["dylan.ratcliffe@puppet.com"]
|
10
10
|
s.homepage = "https://github.com/dylanratcliffe/onceover"
|
@@ -23,7 +23,6 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_runtime_dependency 'rspec-puppet', ">= 2.4.0"
|
24
24
|
s.add_runtime_dependency 'parallel_tests', ">= 2.0.0"
|
25
25
|
s.add_runtime_dependency 'puppetlabs_spec_helper', ">= 0.4.0"
|
26
|
-
s.add_runtime_dependency 'rspec-puppet-utils', '>= 2.0.0'
|
27
26
|
s.add_runtime_dependency 'rspec', '>= 3.0.0'
|
28
27
|
s.add_runtime_dependency 'r10k', '>=2.1.0'
|
29
28
|
s.add_runtime_dependency 'puppet', '>=3.4.0'
|
@@ -2,16 +2,3 @@ forge "http://forge.puppetlabs.com"
|
|
2
2
|
#
|
3
3
|
# I want to download some modules to check if r10k feature in Onceover works correctly.
|
4
4
|
#
|
5
|
-
|
6
|
-
# Versions should be updated to be the latest at the time you start
|
7
|
-
mod "puppetlabs/stdlib", '4.11.0'
|
8
|
-
|
9
|
-
# Modules from Git
|
10
|
-
# Examples: https://github.com/puppetlabs/r10k/blob/master/doc/puppetfile.mkd#examples
|
11
|
-
mod 'apache',
|
12
|
-
:git => 'https://github.com/puppetlabs/puppetlabs-apache',
|
13
|
-
:commit => '83401079053dca11d61945bd9beef9ecf7576cbf'
|
14
|
-
|
15
|
-
#mod 'apache',
|
16
|
-
# :git => 'https://github.com/puppetlabs/puppetlabs-apache',
|
17
|
-
# :branch => 'docs_experiment'
|
@@ -1,19 +1,19 @@
|
|
1
1
|
# == Class: role::test_functions
|
2
2
|
#
|
3
|
-
class role::
|
4
|
-
unless
|
3
|
+
class role::test_data_return {
|
4
|
+
unless return_string() =~ String {
|
5
5
|
fail('string() did not return a string')
|
6
6
|
}
|
7
|
-
unless
|
7
|
+
unless return_number('foo','bar') =~ Numeric {
|
8
8
|
fail('string() did not return a string')
|
9
9
|
}
|
10
|
-
unless
|
10
|
+
unless return_boolean('foo') =~ Boolean {
|
11
11
|
fail('string() did not return a string')
|
12
12
|
}
|
13
|
-
unless
|
13
|
+
unless return_array('foo') =~ Array {
|
14
14
|
fail('string() did not return a string')
|
15
15
|
}
|
16
|
-
unless
|
16
|
+
unless return_hash('foo') =~ Hash {
|
17
17
|
fail('string() did not return a string')
|
18
18
|
}
|
19
19
|
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# Class: role::test_new_functions
|
2
|
+
#
|
3
|
+
#
|
4
|
+
class role::test_new_functions {
|
5
|
+
|
6
|
+
# This function should fail unless it is mocked
|
7
|
+
profile::fail_puppet('Puppet language function still failed!')
|
8
|
+
|
9
|
+
# So should this
|
10
|
+
profile::fail_ruby('Ruby function failed!')
|
11
|
+
|
12
|
+
}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# Classes to be tested
|
2
2
|
classes:
|
3
|
-
- role
|
3
|
+
- /role::/
|
4
4
|
|
5
5
|
# Nodes to tests classes on, this refers to a 'factset' or 'nodeset'
|
6
6
|
# depending on whether you are running 'spec' or 'acceptance' tests
|
@@ -22,25 +22,31 @@ test_matrix:
|
|
22
22
|
tests: 'spec'
|
23
23
|
|
24
24
|
functions:
|
25
|
-
|
25
|
+
return_string:
|
26
26
|
type: rvalue
|
27
27
|
returns: string
|
28
|
-
|
28
|
+
return_number:
|
29
29
|
type: rvalue
|
30
30
|
returns: 400
|
31
|
-
|
31
|
+
return_boolean:
|
32
32
|
type: rvalue
|
33
33
|
returns: true
|
34
|
-
|
34
|
+
return_array:
|
35
35
|
type: rvalue
|
36
36
|
returns:
|
37
37
|
- 1
|
38
38
|
- 2
|
39
39
|
- 3
|
40
|
-
|
40
|
+
return_hash:
|
41
41
|
type: rvalue
|
42
42
|
returns:
|
43
43
|
foo: bar
|
44
|
+
profile::fail_puppet:
|
45
|
+
type: rvalue
|
46
|
+
returns: null
|
47
|
+
profile::fail_ruby:
|
48
|
+
type: rvalue
|
49
|
+
returns: null
|
44
50
|
|
45
51
|
opts:
|
46
52
|
:debug: true
|
@@ -1,5 +1,18 @@
|
|
1
|
+
# Yes it's strange that we have to call `RSpec.configure` more than once. The
|
2
|
+
# reason we are doing this is to silence the incredibly annoying warning:
|
3
|
+
#
|
4
|
+
# puppetlabs_spec_helper: defaults `mock_with` to `:mocha`
|
5
|
+
#
|
6
|
+
# In order to do this we have configure the
|
7
|
+
# mocking, THEN require puppetlabs_spec_helper.
|
8
|
+
#
|
9
|
+
# Yes, I know. Someone buy me a 🍺 for fixing this.
|
10
|
+
#
|
11
|
+
RSpec.configure do |c|
|
12
|
+
c.mock_with :mocha
|
13
|
+
end
|
14
|
+
|
1
15
|
require 'puppetlabs_spec_helper/module_spec_helper'
|
2
|
-
require 'rspec-puppet-utils'
|
3
16
|
require 'rspec_junit_formatter'
|
4
17
|
|
5
18
|
RSpec.configure do |c|
|
data/templates/test_spec.rb.erb
CHANGED
@@ -3,19 +3,6 @@ require 'spec_helper'
|
|
3
3
|
<% test.classes.each do |cls| -%>
|
4
4
|
describe "<%= cls.name %>" do
|
5
5
|
|
6
|
-
<% if @mock_functions -%>
|
7
|
-
<% @mock_functions.each do |function,params| -%>
|
8
|
-
<% if params['type'] == 'statement' -%>
|
9
|
-
MockFunction.new('<%= function %>', {:type => :statement})
|
10
|
-
<% else -%>
|
11
|
-
let!(:<%= function %>) { MockFunction.new('<%= function %>') { |f|
|
12
|
-
f.stubbed.returns(<%= params['returns'].inspect %>)
|
13
|
-
}
|
14
|
-
}
|
15
|
-
<% end -%>
|
16
|
-
|
17
|
-
<% end -%>
|
18
|
-
<% end -%>
|
19
6
|
<% test.nodes.each do |node| -%>
|
20
7
|
context "using fact set <%= node.name %>" do
|
21
8
|
node_facts = <%= node.fact_set %>
|
@@ -31,6 +18,17 @@ let!(:<%= function %>) { MockFunction.new('<%= function %>') { |f|
|
|
31
18
|
<% end -%>
|
32
19
|
end
|
33
20
|
<% end -%>
|
21
|
+
|
22
|
+
<% if @mock_functions -%>
|
23
|
+
# Create a from_json function so that we can parse the output of json for mocked functions
|
24
|
+
before :each do
|
25
|
+
Puppet::Parser::Functions.newfunction(:from_json, :type => :rvalue) { |args|
|
26
|
+
require 'json'
|
27
|
+
JSON.parse(args[0])
|
28
|
+
}
|
29
|
+
end
|
30
|
+
<% end -%>
|
31
|
+
|
34
32
|
<% if @after_conditions -%>
|
35
33
|
after :each do
|
36
34
|
<% @after_conditions.each do |function| -%>
|
@@ -38,15 +36,26 @@ let!(:<%= function %>) { MockFunction.new('<%= function %>') { |f|
|
|
38
36
|
<% end -%>
|
39
37
|
end
|
40
38
|
<% end -%>
|
41
|
-
<% if pre_condition -%>
|
42
39
|
let(:pre_condition) {
|
43
40
|
pp = <%= '<<' %>-END
|
44
41
|
$onceover_class = '<%= cls.name %>'
|
45
|
-
$onceover_node
|
46
|
-
|
42
|
+
$onceover_node = '<%= node.name %>'
|
43
|
+
|
44
|
+
# Begin user-specified pre_condition
|
45
|
+
<%= (pre_condition || "").chomp %>
|
46
|
+
# End user-specified pre_condition
|
47
|
+
|
48
|
+
<% if @mock_functions -%>
|
49
|
+
<% require 'json' -%>
|
50
|
+
# Mocking functions
|
51
|
+
<% @mock_functions.each do |function,params| -%>
|
52
|
+
function <%= function %> (*$args) { from_json('<%= params['returns'].to_json %>') }
|
53
|
+
<% end -%>
|
54
|
+
<% end -%>
|
55
|
+
|
47
56
|
END
|
48
57
|
}
|
49
|
-
|
58
|
+
|
50
59
|
it { should compile }
|
51
60
|
end
|
52
61
|
<% end -%>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: onceover
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dylan Ratcliffe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -80,20 +80,6 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.4.0
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: rspec-puppet-utils
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: 2.0.0
|
90
|
-
type: :runtime
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: 2.0.0
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: rspec
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -405,12 +391,14 @@ files:
|
|
405
391
|
- spec/fixtures/controlrepos/control_branch/Puppetfile
|
406
392
|
- spec/fixtures/controlrepos/control_branch/environment.conf
|
407
393
|
- spec/fixtures/controlrepos/function_mocking/.gitignore
|
408
|
-
- spec/fixtures/controlrepos/function_mocking/Gemfile
|
409
394
|
- spec/fixtures/controlrepos/function_mocking/Puppetfile
|
410
395
|
- spec/fixtures/controlrepos/function_mocking/Rakefile
|
411
396
|
- spec/fixtures/controlrepos/function_mocking/environment.conf
|
412
|
-
- spec/fixtures/controlrepos/function_mocking/
|
413
|
-
- spec/fixtures/controlrepos/function_mocking/site/
|
397
|
+
- spec/fixtures/controlrepos/function_mocking/site/profile/functions/fail_puppet.pp
|
398
|
+
- spec/fixtures/controlrepos/function_mocking/site/profile/lib/puppet/functions/profile/fail_ruby.rb
|
399
|
+
- spec/fixtures/controlrepos/function_mocking/site/profile/manifests/base.pp
|
400
|
+
- spec/fixtures/controlrepos/function_mocking/site/role/manifests/test_data_return.pp
|
401
|
+
- spec/fixtures/controlrepos/function_mocking/site/role/manifests/test_new_functions.pp
|
414
402
|
- spec/fixtures/controlrepos/function_mocking/spec/onceover.yaml
|
415
403
|
- spec/fixtures/controlrepos/minimal/environment.conf
|
416
404
|
- spec/onceover/controlrepo_spec.rb
|
@@ -1,32 +0,0 @@
|
|
1
|
-
## site.pp ##
|
2
|
-
|
3
|
-
# This file (/etc/puppetlabs/puppet/manifests/site.pp) is the main entry point
|
4
|
-
# used when an agent connects to a master and asks for an updated configuration.
|
5
|
-
#
|
6
|
-
# Global objects like filebuckets and resource defaults should go in this file,
|
7
|
-
# as should the default node definition. (The default node can be omitted
|
8
|
-
# if you use the console and don't define any other nodes in site.pp. See
|
9
|
-
# http://docs.puppetlabs.com/guides/language_guide.html#nodes for more on
|
10
|
-
# node definitions.)
|
11
|
-
|
12
|
-
## Active Configurations ##
|
13
|
-
|
14
|
-
# Disable filebucket by default for all File resources:
|
15
|
-
#https://docs.puppet.com/pe/2015.3/release_notes.html#filebucket-resource-no-longer-created-by-default
|
16
|
-
File { backup => false }
|
17
|
-
|
18
|
-
# DEFAULT NODE
|
19
|
-
# Node definitions in this file are merged with node data from the console. See
|
20
|
-
# http://docs.puppetlabs.com/guides/language_guide.html#nodes for more on
|
21
|
-
# node definitions.
|
22
|
-
|
23
|
-
# The default node definition matches any node lacking a more specific node
|
24
|
-
# definition. If there are no other nodes in this file, classes declared here
|
25
|
-
# will be included in every node's catalog, *in addition* to any classes
|
26
|
-
# specified in the console for that node.
|
27
|
-
|
28
|
-
node default {
|
29
|
-
# This is where you can declare classes for all nodes.
|
30
|
-
# Example:
|
31
|
-
# class { 'my_class': }
|
32
|
-
}
|