-
Notifications
You must be signed in to change notification settings - Fork 5
(SIMP-3430) Create Centralized spec_helper.rb #2
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
--- | ||
language: ruby | ||
cache: bundler | ||
sudo: false | ||
before_install: | ||
- rm Gemfile.lock || true | ||
bundler_args: "--without development --path .vendor" | ||
notifications: | ||
email: false | ||
rvm: | ||
- 2.4.5 | ||
env: | ||
- SIMP_SKIP_NON_SIMPOS_TESTS=1 | ||
script: | ||
- bundle exec rake spec | ||
before_deploy: | ||
- bundle exec rake clobber | ||
- "export GEM_VERSION=`ruby -r ./lib/simp/spec_helpers/version.rb -e 'puts Simp::SpecHelpers::VERSION'`" | ||
- '[[ $TRAVIS_TAG =~ ^${GEM_VERSION}$ ]]' | ||
deploy: | ||
- provider: rubygems | ||
gemspec: simp-spec-helpers.gemspec | ||
gem: simp-spec-helpers | ||
api_key: | ||
secure: "need key" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for the reminder--I'll update this with a Travis variable in a later PR. |
||
on: | ||
tags: true | ||
rvm: 2.4.5 | ||
condition: "($SKIP_PUBLISH != true)" | ||
- provider: releases | ||
api_key: | ||
secure: "need key" | ||
on: | ||
tags: true | ||
rvm: 2.4.5 | ||
condition: "($SKIP_PUBLISH != true)" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
# | ||
# SIMP_GEM_SERVERS | a space/comma delimited list of rubygem servers | ||
# PUPPET_VERSION | specifies the version of the puppet gem to load | ||
# FACTER_GEM_VERSION | specifies the version of the facter to load | ||
puppetversion = ENV.fetch('PUPPET_VERSION', '~> 5.5') | ||
gem_sources = ENV.key?('SIMP_GEM_SERVERS') ? ENV['SIMP_GEM_SERVERS'].split(/[, ]+/) : ['https://rubygems.org'] | ||
|
||
gem_sources.each { |gem_source| source gem_source } | ||
|
||
gemspec | ||
|
||
gem 'puppet', puppetversion, :require => false | ||
gem 'bundler' | ||
gem 'rake' | ||
|
||
if facterversion = ENV['FACTER_GEM_VERSION'] | ||
gem 'facter', facterversion, :require => false | ||
end | ||
|
||
group :test do | ||
gem 'rspec' | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
gem 'puppetlabs_spec_helper' | ||
gem 'rubocop' | ||
gem 'rubocop-rspec' | ||
|
||
end | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
PATH | ||
remote: . | ||
specs: | ||
simp-spec-helpers (0.0.2) | ||
|
||
GEM | ||
remote: https://rubygems.org/ | ||
specs: | ||
diff-lcs (1.3) | ||
facter (2.5.7) | ||
fast_gettext (1.1.2) | ||
hiera (3.6.0) | ||
locale (2.1.2) | ||
mocha (1.11.2) | ||
multi_json (1.14.1) | ||
pathspec (0.2.1) | ||
puppet (5.5.18) | ||
facter (> 2.0.1, < 4) | ||
fast_gettext (~> 1.1.2) | ||
hiera (>= 3.2.1, < 4) | ||
locale (~> 2.1) | ||
multi_json (~> 1.10) | ||
puppet-lint (2.4.2) | ||
puppet-syntax (2.6.1) | ||
puppet (>= 5) | ||
rake | ||
puppetlabs_spec_helper (2.14.1) | ||
mocha (~> 1.0) | ||
pathspec (~> 0.2.1) | ||
puppet-lint (~> 2.0) | ||
puppet-syntax (~> 2.0) | ||
rspec-puppet (~> 2.0) | ||
rake (13.0.1) | ||
rspec (3.9.0) | ||
rspec-core (~> 3.9.0) | ||
rspec-expectations (~> 3.9.0) | ||
rspec-mocks (~> 3.9.0) | ||
rspec-core (3.9.1) | ||
rspec-support (~> 3.9.1) | ||
rspec-expectations (3.9.0) | ||
diff-lcs (>= 1.2.0, < 2.0) | ||
rspec-support (~> 3.9.0) | ||
rspec-mocks (3.9.1) | ||
diff-lcs (>= 1.2.0, < 2.0) | ||
rspec-support (~> 3.9.0) | ||
rspec-puppet (2.7.8) | ||
rspec | ||
rspec-support (3.9.2) | ||
|
||
PLATFORMS | ||
ruby | ||
|
||
DEPENDENCIES | ||
puppet (~> 5.5) | ||
puppetlabs_spec_helper | ||
rspec | ||
simp-spec-helpers! | ||
|
||
BUNDLED WITH | ||
1.17.3 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,180 @@ | ||
# rubygem-simp-spec-helpers | ||
|
||
rspec-puppet helper methods for SIMP module testing | ||
|
||
[![License](http://img.shields.io/:license-apache-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0.html) | ||
[![Build Status](https://travis-ci.org/simp/rubygem-simp-spec-helpers.svg?branch=master)](https://travis-ci.org/simp/rubygem-simp-spec-helpers) | ||
[![Gem](https://img.shields.io/gem/v/simp-spec-helpers.svg)](https://rubygems.org/gems/simp-spec-helpers) | ||
[![Gem_Downloads](https://img.shields.io/gem/dt/simp-spec-helpers.svg)](https://rubygems.org/gems/simp-spec-helpers) | ||
|
||
#### Table of Contents | ||
|
||
<!-- vim-markdown-toc GFM --> | ||
|
||
* [Overview](#overview) | ||
* [This gem is part of SIMP](#this-gem-is-part-of-simp) | ||
* [Features](#features) | ||
* [Setup](#setup) | ||
* [Gemfile](#gemfile) | ||
* [Fixtures](#fixtures) | ||
* [Usage](#usage) | ||
* [In a Unit Test](#in-a-unit-test) | ||
* [Environment Variables](#environment-variables) | ||
* [Reference](#reference) | ||
* [Limitations](#limitations) | ||
* [Some versions of bundler fail on FIPS-enabled Systems](#some-versions-of-bundler-fail-on-fips-enabled-systems) | ||
* [Development](#development) | ||
* [License](#license) | ||
* [History](#history) | ||
|
||
<!-- vim-markdown-toc --> | ||
|
||
## Overview | ||
|
||
The `simp-spec-helpers` gem provides common rspec tasks to support the SIMP unit testing process. | ||
|
||
### This gem is part of SIMP | ||
|
||
This gem is part of (the build tooling for) the [System Integrity Management Platform](https://github.com/NationalSecurityAgency/SIMP), a compliance-management framework built on [Puppet](https://puppetlabs.com/). | ||
|
||
|
||
### Features | ||
|
||
* Customizable RPM packaging based on a Puppet module's [`metadata.json`][metadata.json] | ||
* RPM signing | ||
* Rubygem packaging | ||
|
||
## Setup | ||
|
||
### .fixtures.yml | ||
|
||
You must include the compliance_markup module in your .fixtures.yml: | ||
|
||
``` yaml | ||
--- | ||
fixtures: | ||
repositories: | ||
... | ||
compliance_markup: https://github.com/simp/pupmod-simp-compliance_markup | ||
... | ||
``` | ||
|
||
NOTE: The helper module sets up the hiera.yml to include the compliance | ||
module. It should just ignore this if compliance_markup is not included | ||
but, because of a quirk in the testing framework, it doesn't. When it | ||
tries to compile you will get an error like: | ||
|
||
``` ruby | ||
error during compilation: Evaluation Error: Error while evaluating | ||
a Function Call, undefined method `load_typed' for nil:NilClass | ||
``` | ||
### Gemfile | ||
|
||
The Gemfile for your puppet module should have the following included (with updated | ||
versions where necessary): | ||
|
||
``` ruby | ||
group :test do | ||
gem 'puppet', 'puppet', ENV.fetch('PUPPET_VERSION', '~> 5.5') | ||
gem 'rspec' | ||
gem 'rspec-puppet' | ||
gem 'hiera-puppet-helper' | ||
gem 'puppetlabs_spec_helper' | ||
gem 'metadata-json-lint' | ||
gem 'puppet-strings' | ||
gem 'simp-spec-helpers' | ||
gem 'simp-rspec-puppet-facts', ENV.fetch('SIMP_RSPEC_PUPPET_FACTS_VERSION', '~> 2.2') | ||
gem 'simp-rake-helpers', ENV.fetch('SIMP_RAKE_HELPERS_VERSION', '~> 5.9') | ||
gem 'facterdb' | ||
end | ||
``` | ||
|
||
## Usage | ||
|
||
### In a Unit Test | ||
|
||
In your puppet module, create a file spec/spec_helper.rb with the following contents: | ||
|
||
``` ruby | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Most of this code block should probably go inside the |
||
require 'simp/rspec-puppet-facts' | ||
include Simp::RspecPuppetFacts | ||
require 'simp/spec_helpers' | ||
include Simp::SpecHelpers | ||
require 'pathname' | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. pathname isn't required by anything here; it is only used once in |
||
|
||
fixture_path = File.expand_path(File.join(__FILE__, '..', 'fixtures')) | ||
module_name = File.basename(File.expand_path(File.join(__FILE__,'../..'))) | ||
|
||
global_spec_helper(fixture_path, module_name) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd pass in |
||
|
||
# Get any local methods in spec_helper_local.rb | ||
local_spec_helper = File.join(File.dirname(File.expand_path(__FILE__)),"spec_helper_local.rb") | ||
require_relative 'spec_helper_local' if File.exists?(local_spec_helper) | ||
|
||
``` | ||
Require the spec helper at the top of each unit test file. | ||
|
||
```ruby | ||
require 'spec_helper' | ||
``` | ||
Place any module specific configurations or overrides in a file spec/spec_helper_local.rb. For example to use RSPEC instead of MOCHA to mock the environment place the following | ||
in spec/spec_helper_local.rb: | ||
|
||
``` ruby | ||
RSpec.configure do |c| | ||
c.mock_framework = :rspec | ||
c.mock_with :rspec | ||
end | ||
``` | ||
|
||
### Environment Variables | ||
|
||
PUPPET_DEBUG set to anything will enable debug | ||
|
||
|
||
|
||
### Available methods | ||
|
||
Besides the global_spec_helper that is used to set up RSPEC the following | ||
methods are installed and can be used in your tests: | ||
|
||
|
||
#### set_hieradata(hieradata) | ||
This can be used from inside your spec tests to load custom hieradata within | ||
any context. | ||
|
||
Example: | ||
|
||
describe 'some::class' do | ||
context 'with version 10' do | ||
let(:hieradata){ "#{class_name}_v10" } | ||
... | ||
end | ||
end | ||
|
||
Then, create a YAML file at spec/fixtures/hieradata/some__class_v10.yaml. | ||
|
||
Hiera will use this file as it's base of information stacked on top of | ||
'default.yaml' and <module_name>.yaml per the defaults above. | ||
|
||
Note: Any colons (:) are replaced with underscores (_) in the class name. | ||
|
||
|
||
#### set_environment | ||
This can be used from inside your spec tests to set the testable environment. | ||
You can use this to stub out an ENC. | ||
|
||
Example: | ||
|
||
context 'in the :foo environment' do | ||
let(:environment){:foo} | ||
... | ||
end | ||
|
||
#### normalize_compliance_results | ||
Can be used to removed expected errors in compliance data due to test configuration. | ||
See pupmod-simp-pupmod for example. | ||
|
||
### Limitations | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
$: << File.expand_path( '../lib/', __FILE__ ) | ||
|
||
require 'rubygems' | ||
require 'rake/clean' | ||
require 'fileutils' | ||
require 'find' | ||
require 'rspec/core/rake_task' | ||
require 'simp/rake/spec' | ||
|
||
@package='simp-spec-helpers' | ||
@rakefile_dir=File.dirname(__FILE__) | ||
|
||
Simp::Rake::Spec.new(@rakefile_dir) | ||
|
||
CLEAN.include "#{@package}-*.gem" | ||
CLEAN.include 'pkg' | ||
CLEAN.include 'dist' | ||
CLEAN.include '.vendor' | ||
Find.find( @rakefile_dir ) do |path| | ||
if File.directory? path | ||
CLEAN.include path if File.basename(path) == 'tmp' | ||
else | ||
Find.prune | ||
end | ||
end | ||
|
||
|
||
desc 'Ensure gemspec-safe permissions on all files' | ||
task :chmod do | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This task should be defined alongside |
||
gemspec = File.expand_path( "#{@package}.gemspec", @rakefile_dir ).strip | ||
spec = Gem::Specification::load( gemspec ) | ||
spec.files.each do |file| | ||
FileUtils.chmod 'go=r', file | ||
end | ||
end | ||
|
||
desc 'special notes about these rake commands' | ||
task :help do | ||
puts %Q{ | ||
== environment variables == | ||
SIMP_RPM_BUILD when set, alters the gem produced by pkg:gem to be RPM-safe. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Shouldn't this |
||
'pkg:gem' sets this automatically. | ||
} | ||
end | ||
|
||
desc "Run spec tests" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There aren't any spec tests for this task to run. |
||
RSpec::Core::RakeTask.new(:spec) do |t| | ||
t.rspec_opts = ['--color'] | ||
t.pattern = 'spec/lib/**/*_spec.rb' | ||
end | ||
|
||
desc %q{run all RSpec tests (alias of 'spec')} | ||
task :test => :spec | ||
|
||
# vim: syntax=ruby |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
require 'simp/spec_helpers' |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,14 @@ | ||
require 'bundler' | ||
require 'rspec' | ||
|
||
module Simp; end | ||
|
||
module Simp::SpecHelpers | ||
require 'puppetlabs_spec_helper/module_spec_helper' | ||
require 'rspec-puppet' | ||
|
||
require 'simp/spec_helpers/helpers' | ||
include Simp::SpecHelpers::Helpers | ||
|
||
# Stealing this from the Ruby 2.5 Dir::Tmpname workaround from Rails | ||
def self.tmpname | ||
t = Time.new.strftime("%Y%m%d") | ||
"simp-spec-helpers-#{t}-#{$$}-#{rand(0x100000000).to_s(36)}.tmp" | ||
end | ||
require 'simp/spec_helpers/compliance' | ||
include Simp::SpecHelpers::ComplianceMarkup | ||
|
||
end | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is
SIMP_SKIP_NON_SIMPOS_TESTS
used by anything? It's not referenced in any other code in the repository.