puppetlabs_spec_helper 2.6.2 → 4.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.
- checksums.yaml +5 -5
- data/.github/dependabot.yml +15 -0
- data/.rspec +1 -1
- data/.rubocop.yml +114 -463
- data/.rubocop_todo.yml +119 -0
- data/.travis.yml +17 -16
- data/CHANGELOG.md +256 -5
- data/CODEOWNERS +2 -0
- data/Gemfile +32 -12
- data/HISTORY.md +498 -0
- data/README.md +130 -100
- data/Rakefile +37 -7
- data/lib/puppetlabs_spec_helper/module_spec_helper.rb +48 -1
- data/lib/puppetlabs_spec_helper/puppet_spec_helper.rb +32 -16
- data/lib/puppetlabs_spec_helper/puppetlabs_spec/files.rb +5 -3
- data/lib/puppetlabs_spec_helper/puppetlabs_spec/fixtures.rb +14 -10
- data/lib/puppetlabs_spec_helper/puppetlabs_spec/matchers.rb +12 -13
- data/lib/puppetlabs_spec_helper/puppetlabs_spec/puppet_internals.rb +20 -17
- data/lib/puppetlabs_spec_helper/puppetlabs_spec_helper.rb +3 -1
- data/lib/puppetlabs_spec_helper/rake_tasks.rb +252 -525
- data/lib/puppetlabs_spec_helper/tasks/check_symlinks.rb +52 -0
- data/lib/puppetlabs_spec_helper/tasks/fixtures.rb +462 -0
- data/lib/puppetlabs_spec_helper/version.rb +3 -1
- data/puppet_spec_helper.rb +3 -1
- data/puppetlabs_spec_helper.gemspec +26 -21
- data/puppetlabs_spec_helper.rb +3 -1
- metadata +75 -31
data/README.md
CHANGED
@@ -59,7 +59,7 @@ Host github.com
|
|
59
59
|
|
60
60
|
```
|
61
61
|
|
62
|
-
Note: parallel downloads
|
62
|
+
Note: parallel downloads are available for repositories and forge modules.
|
63
63
|
|
64
64
|
### Parallel tests
|
65
65
|
It is also possible to use the `parallel_tests` Gem via the `:parallel_spec` Rake task to run rspec commands in parallel on groups of spec files.
|
@@ -79,8 +79,7 @@ And then to run spec tests in parallel:
|
|
79
79
|
Issues
|
80
80
|
======
|
81
81
|
|
82
|
-
Please file issues against this project at the [Puppet Labs Issue
|
83
|
-
Tracker](https://tickets.puppetlabs.com/browse/MODULES)
|
82
|
+
Please file issues against this project at the [Puppet Labs Issue Tracker](https://tickets.puppetlabs.com/browse/MODULES)
|
84
83
|
|
85
84
|
The Long Version
|
86
85
|
----------------
|
@@ -103,10 +102,10 @@ This project is intended to serve two purposes:
|
|
103
102
|
To Use this Project
|
104
103
|
===================
|
105
104
|
|
106
|
-
The most common usage scenario is that you will check out the '
|
105
|
+
The most common usage scenario is that you will check out the 'main'
|
107
106
|
branch of this project from github, and install it as a rubygem.
|
108
107
|
There should be few or no cases where you would want to have any other
|
109
|
-
branch of this project besides
|
108
|
+
branch of this project besides main/HEAD.
|
110
109
|
|
111
110
|
Running on non-current ruby versions
|
112
111
|
------------------------------------
|
@@ -142,9 +141,6 @@ A number of the Puppet parser features, controlled via configuration during a
|
|
142
141
|
normal puppet run, can be controlled by exporting specific environment
|
143
142
|
variables for the spec run. These are:
|
144
143
|
|
145
|
-
* ``FUTURE_PARSER`` - set to "yes" to enable the [future parser](http://docs.puppetlabs.com/puppet/latest/reference/experiments_future.html),
|
146
|
-
the equivalent of setting [parser=future](http://docs.puppetlabs.com/references/latest/configuration.html#parser)
|
147
|
-
in puppet.conf.
|
148
144
|
* ``STRICT_VARIABLES`` - set to "yes" to enable set to strict variable checking when using Puppet versions between 3.5 and 4.0;
|
149
145
|
set to "no" to disable strict variable checking on Puppet versions 4.0, and later.
|
150
146
|
See [strict_variables](http://docs.puppetlabs.com/references/latest/configuration.html#strictvariables)
|
@@ -153,14 +149,18 @@ variables for the spec run. These are:
|
|
153
149
|
to set the order of unrelated resources when applying a catalog. Leave unset for the default
|
154
150
|
behavior, currently "random". This is equivalent to setting [ordering](http://docs.puppetlabs.com/references/latest/configuration.html#ordering)
|
155
151
|
in puppet.conf.
|
156
|
-
*
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
* ``TRUSTED_NODE_DATA`` - set to "yes" to enable [the $facts hash and trusted node data](
|
161
|
-
|
162
|
-
|
163
|
-
|
152
|
+
* The following options only affect Puppet 3.x:
|
153
|
+
* ``FUTURE_PARSER`` _(Puppet 3.x, starting with 3.2)_ - set to "yes" to enable the [future parser](https://docs.puppet.com/puppet/3/experiments_future.html),
|
154
|
+
the equivalent of setting [parser=future](https://puppet.com/docs/puppet/3.8/configuration.html#parser)
|
155
|
+
in puppet.conf.
|
156
|
+
* ``TRUSTED_NODE_DATA`` _(Puppet 3.x, starting with 3.4)_ - set to "yes" to enable [the $facts hash and trusted node data](https://puppet.com/docs/puppet/3.8/lang_facts_and_builtin_vars.html#trusted-facts),
|
157
|
+
which enabled ``$facts`` and ``$trusted`` hashes. This is equivalent to setting
|
158
|
+
[trusted_node_data=true](https://puppet.com/docs/puppet/3.8/configuration.html#trustednodedata)
|
159
|
+
in puppet.conf.
|
160
|
+
* ``STRINGIFY_FACTS`` _(Puppet 3.x, starting with 3.5)_ - set to "no" to enable [structured facts](http://docs.puppetlabs.com/facter/2.0/fact_overview.html#writing-structured-facts),
|
161
|
+
otherwise leave unset to retain the current default behavior. This is equivalent to setting
|
162
|
+
[stringify_facts=false](https://puppet.com/docs/puppet/3.8/configuration.html#stringifyfacts)
|
163
|
+
in puppet.conf.
|
164
164
|
|
165
165
|
As an example, to run spec tests with the future parser, strict variable checking,
|
166
166
|
and manifest ordering, you would:
|
@@ -191,32 +191,40 @@ file named `.fixtures.yml` in the root of the project. You can specify a alterna
|
|
191
191
|
You can use the `MODULE_WORKING_DIR` environment variable to specify a diffent location when installing module fixtures via the forge. By default the
|
192
192
|
working directory is `<module directory>/spec/fixtures/work-dir`.
|
193
193
|
|
194
|
-
When specifying the repo source of the fixture you have a few options as to which revision of the codebase you wish to use.
|
194
|
+
When specifying the repo source of the fixture you have a few options as to which revision of the codebase you wish to use, and optionally, the puppet versions where the fixture is needed.
|
195
195
|
|
196
|
-
* repo - the url to the repo
|
197
|
-
* scm - options include git or hg. This is an optional step as the helper code will figure out which scm is used.
|
196
|
+
* `repo` - the url to the repo
|
197
|
+
* `scm` - options include git or hg. This is an optional step as the helper code will figure out which scm is used.
|
198
198
|
|
199
199
|
```yaml
|
200
200
|
scm: git
|
201
201
|
scm: hg
|
202
202
|
```
|
203
203
|
|
204
|
-
* target - the directory name to clone the repo into ie. `target: mymodule` defaults to the repo name (Optional)
|
205
|
-
* subdir - directory to be removed from the cloned repo. Its contents will be moved to the root directory (Optional)
|
206
|
-
* ref - used to specify the tag name like version hash
|
204
|
+
* `target` - the directory name to clone the repo into ie. `target: mymodule` defaults to the repo name (Optional)
|
205
|
+
* `subdir` - directory to be removed from the cloned repo. Its contents will be moved to the root directory (Optional)
|
206
|
+
* `ref` - used to specify the tag name (like version) or commit hash to be checked out (Optional). Branch names should use the `branch` option instead.
|
207
207
|
|
208
208
|
```yaml
|
209
209
|
ref: 1.0.0
|
210
210
|
ref: 880fca52c
|
211
211
|
```
|
212
|
-
* branch - used to specify the branch name you want to use ie. `branch: development`
|
213
|
-
* flags - additional flags passed to the module installer (both puppet and scm)
|
212
|
+
* `branch` - used to specify the branch name you want to use ie. `branch: development`
|
213
|
+
* `flags` - additional flags passed to the module installer (both puppet and scm)
|
214
214
|
|
215
215
|
```yaml
|
216
216
|
flags: --verbose
|
217
217
|
```
|
218
|
+
* `puppet_version` - versions of puppet for which the fixture should be installed. Ruby version constraints are supported. Only works when the `semantic_puppet` gem is available (shipped with puppet 4.0 and up, by default).
|
219
|
+
|
220
|
+
```yaml
|
221
|
+
puppet_version: '>= 6.0.0'
|
222
|
+
```
|
223
|
+
|
224
|
+
**Notes:**
|
218
225
|
|
219
|
-
|
226
|
+
* `ref` and `branch` can be used together to get a specific revision on a specific branch
|
227
|
+
* Top level `defaults` option could be used to set global options
|
220
228
|
|
221
229
|
Fixtures Examples
|
222
230
|
-----------------
|
@@ -252,7 +260,7 @@ fixtures:
|
|
252
260
|
target: "spec/fixtures/control_repos"
|
253
261
|
```
|
254
262
|
|
255
|
-
Specify that the git tag `2.4.2` of `stdlib
|
263
|
+
Specify that the git tag `2.4.2` of `stdlib` should be checked out:
|
256
264
|
|
257
265
|
```yaml
|
258
266
|
fixtures:
|
@@ -263,6 +271,16 @@ fixtures:
|
|
263
271
|
ref: "2.6.0"
|
264
272
|
```
|
265
273
|
|
274
|
+
Only install the `yumrepo_core` module when testing against Puppet 6 or greater:
|
275
|
+
|
276
|
+
```yaml
|
277
|
+
fixtures:
|
278
|
+
repositories:
|
279
|
+
yumrepo_core:
|
280
|
+
repo: "git://github.com/puppetlabs/puppetlabs-yumrepo_core"
|
281
|
+
puppet_version: ">= 6.0.0"
|
282
|
+
```
|
283
|
+
|
266
284
|
Move manifests and siblings to root directory when they are inside a `code` directory:
|
267
285
|
|
268
286
|
```yaml
|
@@ -300,6 +318,27 @@ fixtures:
|
|
300
318
|
flags: "--verbose"
|
301
319
|
```
|
302
320
|
|
321
|
+
Use `defaults` to define global parameters:
|
322
|
+
|
323
|
+
```yaml
|
324
|
+
defaults:
|
325
|
+
forge_modules:
|
326
|
+
flags: "--module_repository https://my_repo.com"
|
327
|
+
fixtures:
|
328
|
+
forge_modules:
|
329
|
+
stdlib:
|
330
|
+
repo: "puppetlabs/stdlib"
|
331
|
+
ref: "2.6.0"
|
332
|
+
repositories:
|
333
|
+
firewall:
|
334
|
+
repo: "git://github.com/puppetlabs/puppetlabs-firewall"
|
335
|
+
ref: "2.6.0"
|
336
|
+
```
|
337
|
+
|
338
|
+
Fixture Loading
|
339
|
+
---------------
|
340
|
+
Any module that has a `spec/lib` directory will be available on the ruby `LOAD_PATH` for tests to consume. This allows modules to provide additional helper code to be supplied. The [augeasprovider_core](https://github.com/hercules-team/augeasproviders_core) module has [some examples](https://github.com/hercules-team/augeasproviders_core/tree/master/spec/lib).
|
341
|
+
|
303
342
|
Testing Parser Functions
|
304
343
|
========================
|
305
344
|
|
@@ -345,14 +384,18 @@ remembering to duplicate any existing environment variables:
|
|
345
384
|
env:
|
346
385
|
- FUTURE_PARSER=yes CI_NODE_TOTAL=2 CI_NODE_INDEX=1
|
347
386
|
- FUTURE_PARSER=yes CI_NODE_TOTAL=2 CI_NODE_INDEX=2
|
348
|
-
|
387
|
+
|
349
388
|
#### Running tests tagged with test tiers
|
350
|
-
To run tests tagged with risk levels set the ``TEST_TIERS`` environment variable to a comma-separated list of
|
351
|
-
the appropriate tiers.
|
389
|
+
To run tests tagged with risk levels set the ``TEST_TIERS`` environment variable to a comma-separated list of the appropriate tiers.
|
352
390
|
|
353
|
-
For example: to run tests marked ``tier_high => true`` and ``tier_medium => true`` in the same test run set the
|
391
|
+
For example: to run tests marked ``tier_high => true`` and ``tier_medium => true`` in the same test run set the
|
354
392
|
environment variable``TEST_TIERS=high,medium``
|
355
|
-
|
393
|
+
|
394
|
+
By default ``TEST_TIERS`` only accepts low, medium and high as valid tiers. If you would like to use your own keywords to set the environment variable ``TEST_TIERS_ALLOWED``.
|
395
|
+
|
396
|
+
For example: to use the keywords dev, rnd, staging and production you can set
|
397
|
+
``TEST_TIERS_ALLOWED=dev,rnd,staging,production``. Then you would be able to run tests marked ``tier_dev => true``, ``tier_production => true`` with ``TEST_TIERS=dev,production``
|
398
|
+
|
356
399
|
Note, if the ``TEST_TIERS`` environment variable is set to empty string or nil, all tiers will be executed.
|
357
400
|
|
358
401
|
|
@@ -364,80 +407,20 @@ See the documentation of [RSpec-Puppet](https://github.com/rodjek/rspec-puppet)
|
|
364
407
|
for Puppet manifest coverage reports.
|
365
408
|
|
366
409
|
Starting with Ruby 1.9, the *de facto* standard for Ruby code coverage is
|
367
|
-
[SimpleCov](https://github.com/colszowka/simplecov).
|
368
|
-
You can add it to your module like this:
|
369
|
-
|
370
|
-
```Ruby
|
371
|
-
# First line of spec/spec_helper.rb
|
372
|
-
require 'simplecov'
|
373
|
-
|
374
|
-
SimpleCov.start do
|
375
|
-
add_filter '/spec/'
|
376
|
-
# Exclude bundled Gems in `/.vendor/`
|
377
|
-
add_filter '/.vendor/'
|
378
|
-
end
|
379
|
-
|
380
|
-
require 'puppetlabs_spec_helper/module_spec_helper'
|
381
|
-
# Further content
|
382
|
-
```
|
410
|
+
[SimpleCov](https://github.com/colszowka/simplecov). It is implemented as a Rake task in this gem.
|
383
411
|
|
384
|
-
|
385
|
-
and are written to `/coverage/`, which you should add to `.gitignore`.
|
412
|
+
To run code coverage:
|
386
413
|
|
387
|
-
|
414
|
+
$ rake spec:simplecov
|
388
415
|
|
389
|
-
|
390
|
-
------------------
|
416
|
+
Reports are written to `/coverage/`, which you should add to `.gitignore`.
|
391
417
|
|
392
|
-
|
418
|
+
The reports can be generated every time you invoke RSpec, e.g. via `rake spec`,
|
419
|
+
You can enable it, set the following environment variable:s
|
393
420
|
|
394
|
-
|
395
|
-
# First line of spec/spec_helper.rb
|
396
|
-
require 'codeclimate-test-reporter'
|
421
|
+
``SIMPLECOV=yes``
|
397
422
|
|
398
|
-
|
399
|
-
SimpleCov::Formatter::HTMLFormatter,
|
400
|
-
CodeClimate::TestReporter::Formatter
|
401
|
-
]
|
402
|
-
|
403
|
-
SimpleCov.start do
|
404
|
-
add_filter '/spec/'
|
405
|
-
# Exclude bundled Gems in `/.vendor/`
|
406
|
-
add_filter '/.vendor/'
|
407
|
-
end
|
408
|
-
|
409
|
-
require 'puppetlabs_spec_helper/module_spec_helper'
|
410
|
-
# Further content
|
411
|
-
```
|
412
|
-
|
413
|
-
Remember to add `gem 'codeclimate-test-reporter', require: false` to your `Gemfile`.
|
414
|
-
|
415
|
-
Using Coveralls
|
416
|
-
---------------
|
417
|
-
|
418
|
-
You can also use [Coveralls](https://coveralls.io/) together with SimpleCov:
|
419
|
-
|
420
|
-
```Ruby
|
421
|
-
# First line of spec/spec_helper.rb
|
422
|
-
require 'simplecov'
|
423
|
-
require 'coveralls'
|
424
|
-
|
425
|
-
SimpleCov.formatters = [
|
426
|
-
SimpleCov::Formatter::HTMLFormatter,
|
427
|
-
Coveralls::SimpleCov::Formatter
|
428
|
-
]
|
429
|
-
|
430
|
-
SimpleCov.start do
|
431
|
-
add_filter '/spec/'
|
432
|
-
# Exclude bundled Gems in `/.vendor/`
|
433
|
-
add_filter '/.vendor/'
|
434
|
-
end
|
435
|
-
|
436
|
-
require 'puppetlabs_spec_helper/module_spec_helper'
|
437
|
-
# Further content
|
438
|
-
```
|
439
|
-
|
440
|
-
Remember to add `gem 'coveralls', require: false` to your `Gemfile`.
|
423
|
+
Remember to add the simplecov-console and codecov gems to your `Gemfile`. If you run `spec:simplecov` on Travis-CI or any of the other supported CI services, reports gets automatically uploaded to https://codecov.io/ .
|
441
424
|
|
442
425
|
Some Notes for Windows Users
|
443
426
|
============================
|
@@ -451,7 +434,7 @@ This is related to a registry security setting requiring elevated privileges to
|
|
451
434
|
|
452
435
|
Currently, there are two known approaches to get around this problem.
|
453
436
|
|
454
|
-
- run your windows shell (cmd) as an Administrator
|
437
|
+
- run your windows shell (cmd) as an Administrator
|
455
438
|
or
|
456
439
|
- modify the registry entry settings to allow symbolic links to be created.
|
457
440
|
|
@@ -463,5 +446,52 @@ The following links may give you some insight into why...
|
|
463
446
|
|
464
447
|
[Microsoft TechNet](https://technet.microsoft.com/en-us/library/cc754077.aspx)
|
465
448
|
|
449
|
+
mock_with
|
450
|
+
=========
|
451
|
+
|
452
|
+
There are two major mocking frameworks in modules test suites today: [mocha](https://rubygems.org/gems/mocha) and [rspec-mocks](https://rubygems.org/gems/rspec-mocks). We recommend that you choose rspec-mocks explicitly by specifying `mock_with`, either in your `spec_helper.rb` like so:
|
453
|
+
|
454
|
+
```
|
455
|
+
RSpec.configure do |c|
|
456
|
+
c.mock_with :rspec
|
457
|
+
end
|
458
|
+
require 'puppetlabs_spec_helper/module_spec_helper'
|
459
|
+
```
|
460
|
+
|
461
|
+
or by using Puppet Development Kit's [`mock_with` option in `.sync.yml`](https://github.com/puppetlabs/pdk-templates#specspec_helperrb) and `pdk update`.
|
462
|
+
|
463
|
+
You can also continue to use mocha by explicitly specifying `:mocha`, following the [mocha documentation](http://gofreerange.com/mocha/docs/).
|
464
|
+
|
465
|
+
Migration
|
466
|
+
---------
|
467
|
+
|
468
|
+
To migrate from mocha to rspec-mocks, in many simple cases the following two kinds of changes are all you need:
|
469
|
+
|
470
|
+
Translate all stubs:
|
471
|
+
```
|
472
|
+
context.stubs(:some_method).with(arguments).returns('value')
|
473
|
+
```
|
474
|
+
to this:
|
475
|
+
```
|
476
|
+
allow(context).to receive(:some_method).with(arguments).and_return('value')
|
477
|
+
```
|
478
|
+
|
479
|
+
Translate all expectations:
|
480
|
+
```
|
481
|
+
context.expects(:some_method).with(arguments).returns('value')
|
482
|
+
```
|
483
|
+
to this:
|
484
|
+
```
|
485
|
+
expect(context).to receive(:some_method).with(arguments).and_return('value')
|
486
|
+
```
|
487
|
+
|
488
|
+
Rationale
|
489
|
+
---------
|
490
|
+
|
491
|
+
* As a part of the RSpec project, rspec-mocks integration is better.
|
492
|
+
* mocha is extending base ruby objects with its `stubs`, and `expects` methods, polluting the global namespace, with a potential for subtle and gnarly errors.
|
493
|
+
* Currently both rspec-mocks and mocha get loaded, leading to test suites that use both.
|
494
|
+
* puppetlabs_spec_helper loads and configures mocha unconditionally, causing friction when a different mocking framework is wanted.
|
495
|
+
* mocha is an additional dependency to carry.
|
466
496
|
|
467
497
|
EOF
|
data/Rakefile
CHANGED
@@ -1,15 +1,45 @@
|
|
1
|
-
#
|
2
|
-
require "bundler/gem_tasks"
|
3
|
-
require "rspec/core/rake_task"
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
|
-
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
|
6
|
+
def gem_present(name)
|
7
|
+
!Bundler.rubygems.find_name(name).empty?
|
8
|
+
end
|
6
9
|
|
7
10
|
RSpec::Core::RakeTask.new(:spec) do |spec|
|
8
11
|
spec.pattern = FileList['spec/**/*_spec.rb'].exclude('spec/fixtures/**/*_spec.rb')
|
9
12
|
end
|
10
13
|
|
11
|
-
require 'rubocop/rake_task'
|
12
|
-
RuboCop::RakeTask.new
|
13
|
-
|
14
14
|
require 'yard'
|
15
15
|
YARD::Rake::YardocTask.new
|
16
|
+
|
17
|
+
default_tasks = [:spec]
|
18
|
+
|
19
|
+
if gem_present 'rubocop'
|
20
|
+
require 'rubocop/rake_task'
|
21
|
+
RuboCop::RakeTask.new
|
22
|
+
default_tasks.unshift(:rubocop)
|
23
|
+
end
|
24
|
+
|
25
|
+
task default: default_tasks
|
26
|
+
|
27
|
+
#### CHANGELOG ####
|
28
|
+
begin
|
29
|
+
require 'github_changelog_generator/task'
|
30
|
+
GitHubChangelogGenerator::RakeTask.new :changelog do |config|
|
31
|
+
require 'puppetlabs_spec_helper/version'
|
32
|
+
config.since_tag = 'v2.8.0'
|
33
|
+
config.future_release = "v#{PuppetlabsSpecHelper::VERSION}"
|
34
|
+
config.header = "# Changelog\n\n" \
|
35
|
+
"All significant changes to this repo will be summarized in this file.\n"
|
36
|
+
# config.include_labels = %w[enhancement bug]
|
37
|
+
config.user = 'puppetlabs'
|
38
|
+
config.project = 'puppetlabs_spec_helper'
|
39
|
+
end
|
40
|
+
rescue LoadError
|
41
|
+
desc 'Install github_changelog_generator to get access to automatic changelog generation'
|
42
|
+
task :changelog do
|
43
|
+
raise 'Install github_changelog_generator to get access to automatic changelog generation'
|
44
|
+
end
|
45
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rspec-puppet'
|
2
4
|
require 'puppetlabs_spec_helper/puppet_spec_helper'
|
3
5
|
require 'puppetlabs_spec_helper/puppetlabs_spec/puppet_internals'
|
@@ -18,6 +20,46 @@ env_module_path = ENV['MODULEPATH']
|
|
18
20
|
module_path = File.join(fixture_path, 'modules')
|
19
21
|
|
20
22
|
module_path = [module_path, env_module_path].join(File::PATH_SEPARATOR) if env_module_path
|
23
|
+
if ENV['SIMPLECOV'] == 'yes'
|
24
|
+
begin
|
25
|
+
require 'simplecov'
|
26
|
+
require 'simplecov-console'
|
27
|
+
require 'codecov'
|
28
|
+
|
29
|
+
SimpleCov.formatters = [
|
30
|
+
SimpleCov::Formatter::HTMLFormatter,
|
31
|
+
SimpleCov::Formatter::Console,
|
32
|
+
SimpleCov::Formatter::Codecov,
|
33
|
+
]
|
34
|
+
SimpleCov.start do
|
35
|
+
track_files 'lib/**/*.rb'
|
36
|
+
add_filter '/spec'
|
37
|
+
|
38
|
+
# do not track vendored files
|
39
|
+
add_filter '/vendor'
|
40
|
+
add_filter '/.vendor'
|
41
|
+
|
42
|
+
# do not track gitignored files
|
43
|
+
# this adds about 4 seconds to the coverage check
|
44
|
+
# this could definitely be optimized
|
45
|
+
add_filter do |f|
|
46
|
+
# system returns true if exit status is 0, which with git-check-ignore means file is ignored
|
47
|
+
system("git check-ignore --quiet #{f.filename}")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
rescue LoadError
|
51
|
+
raise 'Add the simplecov, simplecov-console, codecov gems to Gemfile to enable this task'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Add all spec lib dirs to LOAD_PATH
|
56
|
+
components = module_path.split(File::PATH_SEPARATOR).collect do |dir|
|
57
|
+
next unless Dir.exist? dir
|
58
|
+
Dir.entries(dir).reject { |f| f =~ %r{^\.} }.collect { |f| File.join(dir, f, 'spec', 'lib') }
|
59
|
+
end
|
60
|
+
components.flatten.each do |d|
|
61
|
+
$LOAD_PATH << d if FileTest.directory?(d) && !$LOAD_PATH.include?(d)
|
62
|
+
end
|
21
63
|
|
22
64
|
RSpec.configure do |c|
|
23
65
|
c.environmentpath = spec_path if Puppet.version.to_f >= 4.0
|
@@ -26,7 +68,12 @@ RSpec.configure do |c|
|
|
26
68
|
c.parser = 'future' if ENV['FUTURE_PARSER'] == 'yes'
|
27
69
|
|
28
70
|
c.before :each do
|
29
|
-
|
71
|
+
if c.mock_framework.framework_name == :rspec
|
72
|
+
allow(Puppet.features).to receive(:root?).and_return(true)
|
73
|
+
else
|
74
|
+
Puppet.features.stubs(:root?).returns(true)
|
75
|
+
end
|
76
|
+
|
30
77
|
# stringify_facts and trusted_node_data were removed in puppet4
|
31
78
|
if Puppet.version.to_f < 4.0
|
32
79
|
Puppet.settings[:stringify_facts] = false if ENV['STRINGIFY_FACTS'] == 'no'
|
@@ -1,14 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'puppetlabs_spec_helper/puppetlabs_spec_helper'
|
2
4
|
|
3
5
|
# Don't want puppet getting the command line arguments for rake or autotest
|
4
6
|
ARGV.clear
|
5
7
|
|
6
|
-
# This is needed because we're using mocha with rspec instead of Test::Unit or MiniTest
|
7
|
-
ENV['MOCHA_OPTIONS']='skip_integration'
|
8
|
-
|
9
8
|
require 'puppet'
|
10
9
|
require 'rspec/expectations'
|
11
|
-
|
10
|
+
|
11
|
+
# Detect whether the module is overriding the choice of mocking framework
|
12
|
+
# @mock_framework is used since more than seven years, and we need to avoid
|
13
|
+
# `mock_framework`'s autoloading to distinguish between the default, and
|
14
|
+
# the module's choice.
|
15
|
+
# See also below in RSpec.configure
|
16
|
+
if RSpec.configuration.instance_variable_get(:@mock_framework).nil?
|
17
|
+
# This is needed because we're using mocha with rspec instead of Test::Unit or MiniTest
|
18
|
+
ENV['MOCHA_OPTIONS'] = 'skip_integration'
|
19
|
+
|
20
|
+
# Current versions of RSpec already load this for us, but who knows what's used out there?
|
21
|
+
require 'mocha/api'
|
22
|
+
end
|
12
23
|
|
13
24
|
require 'pathname'
|
14
25
|
require 'tmpdir'
|
@@ -36,7 +47,7 @@ require 'puppetlabs_spec_helper/puppetlabs_spec/files'
|
|
36
47
|
# to compatibility mode for older versions of puppet.
|
37
48
|
begin
|
38
49
|
require 'puppet/test/test_helper'
|
39
|
-
rescue LoadError
|
50
|
+
rescue LoadError
|
40
51
|
end
|
41
52
|
|
42
53
|
# This is just a utility class to allow us to isolate the various version-specific
|
@@ -49,7 +60,7 @@ module Puppet
|
|
49
60
|
# Puppet's Settings singleton object, and other fun implementation details
|
50
61
|
# that code external to puppet should really never know about.
|
51
62
|
def self.initialize_via_fallback_compatibility(config)
|
52
|
-
|
63
|
+
warn('Warning: you appear to be using an older version of puppet; spec_helper will use fallback compatibility mode.')
|
53
64
|
config.before :all do
|
54
65
|
# nothing to do for now
|
55
66
|
end
|
@@ -70,11 +81,11 @@ module Puppet
|
|
70
81
|
|
71
82
|
# Set the confdir and vardir to gibberish so that tests
|
72
83
|
# have to be correctly mocked.
|
73
|
-
Puppet[:confdir] =
|
74
|
-
Puppet[:vardir] =
|
84
|
+
Puppet[:confdir] = '/dev/null'
|
85
|
+
Puppet[:vardir] = '/dev/null'
|
75
86
|
|
76
87
|
# Avoid opening ports to the outside world
|
77
|
-
Puppet.settings[:bindaddress] =
|
88
|
+
Puppet.settings[:bindaddress] = '127.0.0.1'
|
78
89
|
end
|
79
90
|
|
80
91
|
config.after :each do
|
@@ -82,7 +93,7 @@ module Puppet
|
|
82
93
|
|
83
94
|
Puppet::Node::Environment.clear
|
84
95
|
Puppet::Util::Storage.clear
|
85
|
-
Puppet::Util::ExecutionStub.reset if Puppet::Util.constants.include?
|
96
|
+
Puppet::Util::ExecutionStub.reset if Puppet::Util.constants.include? 'ExecutionStub'
|
86
97
|
|
87
98
|
PuppetlabsSpec::Files.cleanup
|
88
99
|
end
|
@@ -91,7 +102,7 @@ module Puppet
|
|
91
102
|
end
|
92
103
|
|
93
104
|
# JJM Hack to make the stdlib tests run in Puppet 2.6 (See puppet commit cf183534)
|
94
|
-
|
105
|
+
unless Puppet.constants.include? 'Test'
|
95
106
|
module Puppet::Test
|
96
107
|
class LogCollector
|
97
108
|
def initialize(logs)
|
@@ -104,7 +115,7 @@ if not Puppet.constants.include? "Test" then
|
|
104
115
|
end
|
105
116
|
end
|
106
117
|
Puppet::Util::Log.newdesttype :log_collector do
|
107
|
-
match
|
118
|
+
match 'Puppet::Test::LogCollector'
|
108
119
|
|
109
120
|
def initialize(messages)
|
110
121
|
@messages = messages
|
@@ -118,11 +129,17 @@ end
|
|
118
129
|
|
119
130
|
# And here is where we do the main rspec configuration / setup.
|
120
131
|
RSpec.configure do |config|
|
121
|
-
#
|
122
|
-
|
132
|
+
# Detect whether the module is overriding the choice of mocking framework
|
133
|
+
# @mock_framework is used since more than seven years, and we need to avoid
|
134
|
+
# `mock_framework`'s autoloading to distinguish between the default, and
|
135
|
+
# the module's choice.
|
136
|
+
if config.instance_variable_get(:@mock_framework).nil?
|
137
|
+
RSpec.warn_deprecation('puppetlabs_spec_helper: defaults `mock_with` to `:mocha`. See https://github.com/puppetlabs/puppetlabs_spec_helper#mock_with to choose a sensible value for you')
|
138
|
+
config.mock_with :mocha
|
139
|
+
end
|
123
140
|
|
124
141
|
# determine whether we can use the new API or not, and call the appropriate initializer method.
|
125
|
-
if
|
142
|
+
if defined?(Puppet::Test::TestHelper)
|
126
143
|
# This case is handled by rspec-puppet since v1.0.0 (via 41257b33cb1f9ade4426b044f70be511b0c89112)
|
127
144
|
else
|
128
145
|
Puppet::PuppetSpecInitializer.initialize_via_fallback_compatibility(config)
|
@@ -158,5 +175,4 @@ RSpec.configure do |config|
|
|
158
175
|
Puppet::Util::Log.close_all
|
159
176
|
Puppet::Util::Log.level = @log_level
|
160
177
|
end
|
161
|
-
|
162
178
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fileutils'
|
2
4
|
require 'tempfile'
|
3
5
|
require 'pathname'
|
@@ -18,11 +20,11 @@ module PuppetlabsSpec::Files
|
|
18
20
|
|
19
21
|
def self.cleanup
|
20
22
|
$global_tempfiles ||= []
|
21
|
-
while path = $global_tempfiles.pop
|
22
|
-
|
23
|
+
while path = $global_tempfiles.pop
|
24
|
+
raise "Not deleting tmpfile #{path} outside regular tmpdir" unless in_tmp(path)
|
23
25
|
|
24
26
|
begin
|
25
|
-
FileUtils.rm_r path, :
|
27
|
+
FileUtils.rm_r path, secure: true
|
26
28
|
rescue Errno::ENOENT
|
27
29
|
# nothing to do
|
28
30
|
end
|
@@ -1,8 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This module provides some helper methods to assist with fixtures. It's
|
2
4
|
# methods are designed to help when you have a conforming fixture layout so we
|
3
5
|
# get project consistency.
|
4
6
|
module PuppetlabsSpec::Fixtures
|
5
|
-
|
6
7
|
# Returns the joined path of the global FIXTURE_DIR plus any path given to it
|
7
8
|
def fixtures(*rest)
|
8
9
|
File.join(PuppetlabsSpec::FIXTURE_DIR, *rest)
|
@@ -13,21 +14,23 @@ module PuppetlabsSpec::Fixtures
|
|
13
14
|
# <project>/spec/fixture/unit/facter/foo
|
14
15
|
def my_fixture_dir
|
15
16
|
callers = caller
|
16
|
-
while line = callers.shift
|
17
|
+
while line = callers.shift
|
17
18
|
next unless found = line.match(%r{/spec/(.*)_spec\.rb:})
|
19
|
+
|
18
20
|
return fixtures(found[1])
|
19
21
|
end
|
20
|
-
|
22
|
+
raise "sorry, I couldn't work out your path from the caller stack!"
|
21
23
|
end
|
22
24
|
|
23
25
|
# Given a name, returns the full path of a file from your relative fixture
|
24
26
|
# dir as returned by my_fixture_dir.
|
25
27
|
def my_fixture(name)
|
26
28
|
file = File.join(my_fixture_dir, name)
|
27
|
-
unless File.readable? file
|
28
|
-
|
29
|
+
unless File.readable? file
|
30
|
+
raise "fixture '#{name}' for #{my_fixture_dir} is not readable"
|
29
31
|
end
|
30
|
-
|
32
|
+
|
33
|
+
file
|
31
34
|
end
|
32
35
|
|
33
36
|
# Return the contents of the file using read when given a name. Uses
|
@@ -38,12 +41,13 @@ module PuppetlabsSpec::Fixtures
|
|
38
41
|
|
39
42
|
# Provides a block mechanism for iterating across the files in your fixture
|
40
43
|
# area.
|
41
|
-
def my_fixtures(glob = '*', flags = 0)
|
44
|
+
def my_fixtures(glob = '*', flags = 0, &block)
|
42
45
|
files = Dir.glob(File.join(my_fixture_dir, glob), flags)
|
43
|
-
|
44
|
-
|
46
|
+
if files.empty?
|
47
|
+
raise "fixture '#{glob}' for #{my_fixture_dir} had no files!"
|
45
48
|
end
|
46
|
-
|
49
|
+
|
50
|
+
block_given? && files.each(&block)
|
47
51
|
files
|
48
52
|
end
|
49
53
|
end
|