chefspec-bootstrap 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,9 +1,6 @@
1
1
  LineLength:
2
2
  Max: 120
3
3
 
4
- Style/Next:
5
- Enabled: false
6
-
7
4
  Documentation:
8
5
  Enabled: false
9
6
 
data/README.md CHANGED
@@ -9,18 +9,18 @@ chefspec-bootstrap
9
9
  [travis]: http://travis-ci.org/AMeng/chefspec-bootstrap
10
10
  [codeclimate]: https://codeclimate.com/github/AMeng/chefspec-bootstrap
11
11
 
12
- A command line tool to get started with ChefSpec. Generates spec files for your untested recipes.
12
+ A command line tool to get started with [ChefSpec](https://github.com/sethvargo/chefspec). Generates spec files for your untested recipes.
13
13
 
14
14
  Given a cookbook called `my_cookbook` with a recipe called `my_recipe.rb`:
15
15
  ```ruby
16
- package "apache2"
16
+ package 'apache2'
17
17
 
18
- file "/etc/apache2/sites-available/default" do
18
+ file '/etc/apache2/sites-available/default' do
19
19
  action :delete
20
20
  end
21
21
 
22
- template "/etc/apache2/sites-available/mysite" do
23
- source "mysite.conf.erb"
22
+ template '/etc/apache2/sites-available/mysite' do
23
+ source 'mysite.conf.erb'
24
24
  end
25
25
  ```
26
26
 
@@ -31,16 +31,16 @@ require 'chefspec'
31
31
  describe 'my_cookbook::my_recipe' do
32
32
  let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }
33
33
 
34
- it "installs the apache2 package" do
35
- expect(chef_run).to install_package("apache2")
34
+ it 'installs the apache2 package' do
35
+ expect(chef_run).to install_package('apache2')
36
36
  end
37
37
 
38
- it "deletes the /etc/apache2/conf.d/python.conf file" do
39
- expect(chef_run).to delete_file("/etc/apache2/conf.d/python.conf")
38
+ it 'deletes the /etc/apache2/conf.d/python.conf file' do
39
+ expect(chef_run).to delete_file('/etc/apache2/conf.d/python.conf')
40
40
  end
41
41
 
42
- it "creates the /etc/apache2/sites-available/mysite template" do
43
- expect(chef_run).to create_template("/etc/apache2/sites-available/mysite")
42
+ it 'creates the /etc/apache2/sites-available/mysite template' do
43
+ expect(chef_run).to create_template('/etc/apache2/sites-available/mysite')
44
44
  end
45
45
  end
46
46
  ```
@@ -62,8 +62,9 @@ Options
62
62
  ```
63
63
  Usage: chefspec-bootstrap <recipe.rb> [options]
64
64
  -t, --template <file> ERB template file used to generate specs
65
- -s, --spechelper <file> spec_helper.rb file. By default, looks in spec/spec_helper.rb
65
+ -s, --spec-helper <file> spec_helper.rb file. By default, looks in spec/spec_helper.rb
66
66
  -o, --output <file> File to output spec. Prints to stdout if not specified.
67
+ -c, --cookbook-path <dir> Cookbook path (directory). Your spec_helper file can override this.
67
68
  ```
68
69
 
69
70
  Creating a custom template
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'chefspec-bootstrap'
3
- s.version = '0.0.5'
4
- s.date = '2014-12-01'
3
+ s.version = '0.1.0'
4
+ s.date = '2014-12-23'
5
5
  s.summary = 'Bootstrap your ChefSpec tests.'
6
6
  s.description = 'Automatically generate ChefSpec tests based on your recipes.'
7
7
  s.authors = ['Alexander Meng']
@@ -96,13 +96,8 @@ module ChefSpec
96
96
 
97
97
  def get_resources(chef_run, cookbook, recipe)
98
98
  if chef_run
99
- resources = get_all_resources(chef_run)
100
- if @recursive
101
- return resources
102
- else
103
- return resources.select do |resource|
104
- resource.cookbook_name == cookbook.to_sym && resource.recipe_name == recipe
105
- end
99
+ return get_all_resources(chef_run).select do |resource|
100
+ resource.cookbook_name == cookbook.to_sym && resource.recipe_name == recipe
106
101
  end
107
102
  else
108
103
  return []
@@ -112,19 +107,29 @@ module ChefSpec
112
107
  def generate_test_cases(resources)
113
108
  test_cases = []
114
109
  resources.each do |resource|
115
- verbs = resource.action
116
- verbs = [verbs] unless verbs.respond_to?(:each)
110
+ verbs = resource.instance_variable_get(:@performed_actions)
111
+ if verbs.empty?
112
+ if resource.action != [:nothing]
113
+ verbs = { resource.action.to_s => {} }
114
+ else
115
+ verbs = { nothing: {} }
116
+ end
117
+ end
117
118
 
118
119
  noun = resource.resource_name
119
120
  adjective = resource.name
121
+ guarded = resource.performed_actions.empty?
120
122
 
121
- verbs.each do |verb|
122
- next if verb == :nothing
123
-
123
+ verbs.each do |verb, time|
124
124
  test_cases.push(
125
125
  it: get_it_block(noun, verb, adjective),
126
126
  expect: get_expect_block(noun, verb),
127
- name: adjective
127
+ name: adjective,
128
+ guarded: guarded,
129
+ nothing: verb == :nothing,
130
+ noun: noun,
131
+ adjective: adjective,
132
+ compile_time: time[:compile_time]
128
133
  )
129
134
  end
130
135
  end
@@ -132,6 +137,7 @@ module ChefSpec
132
137
  end
133
138
 
134
139
  def get_it_block(noun, verb, adjective)
140
+ verb = 'ignore' if verb == :nothing
135
141
  it = '%{verb}s the %{adjective} %{noun}'
136
142
  noun_readable = noun.to_s.gsub('_', ' ')
137
143
  verb_readable = verb.to_s.gsub('_', ' ')
@@ -2,12 +2,16 @@ require_relative '../lib/chefspec_bootstrap'
2
2
  require_relative 'spec_helper'
3
3
 
4
4
  describe 'Bootstrap' do
5
- %w(failure directory package).each do |resource|
6
- it "creates the expected spec file for #{resource}" do
7
- bootstrap = ChefSpec::Bootstrap.new("spec/cookbooks/spec/recipes/#{resource}.rb", nil, nil, nil, nil)
8
- template = File.open("spec/templates/#{resource}.txt", 'rb').read
5
+ recipes = Dir.entries('spec/cookbooks/spec/recipes').map do |file|
6
+ file.scan(/(.*).rb/).last.first if file.end_with?('.rb')
7
+ end.compact
9
8
 
10
- expect { bootstrap.generate }.to output(template).to_stdout
9
+ recipes.each do |recipe|
10
+ it "creates the expected spec file for #{recipe}" do
11
+ bootstrap = ChefSpec::Bootstrap.new("spec/cookbooks/spec/recipes/#{recipe}.rb", nil, nil, nil, nil)
12
+ spec = File.open("spec/meta/#{recipe}_spec.rb", 'rb').read
13
+
14
+ expect { bootstrap.generate }.to output(spec).to_stdout
11
15
  end
12
16
  end
13
17
  end
@@ -0,0 +1,3 @@
1
+ package 'compileable' do
2
+ action :nothing
3
+ end.run_action(:install)
@@ -0,0 +1,9 @@
1
+ # rubocop:disable Lint/UselessComparison
2
+
3
+ package 'guardable' do
4
+ not_if { 1 == 1 }
5
+ end
6
+
7
+ package 'unguardable' do
8
+ only_if { 1 == 1 }
9
+ end
@@ -0,0 +1,7 @@
1
+ package 'multiactionable' do
2
+ action [:install, :upgrade, :purge]
3
+ end
4
+
5
+ package 'mixactionable' do
6
+ action [:upgrade, :purge]
7
+ end.run_action(:install)
@@ -0,0 +1,7 @@
1
+ # rubocop:disable Lint/UselessComparison
2
+
3
+ package 'actionable'
4
+
5
+ package 'unactionable' do
6
+ action :nothing
7
+ end
@@ -0,0 +1,10 @@
1
+ require 'chefspec'
2
+ require_relative '../spec_helper'
3
+
4
+ describe 'spec::compile_time' do
5
+ let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }
6
+
7
+ it 'installs the compileable package' do
8
+ expect(chef_run).to install_package('compileable').at_compile_time
9
+ end
10
+ end
@@ -0,0 +1,22 @@
1
+ require 'chefspec'
2
+ require_relative '../spec_helper'
3
+
4
+ describe 'spec::directory' do
5
+ let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }
6
+
7
+ it 'creates the defaultable directory' do
8
+ expect(chef_run).to create_directory('defaultable')
9
+ end
10
+
11
+ it 'creates the identifiable directory' do
12
+ expect(chef_run).to create_directory('identifiable')
13
+ end
14
+
15
+ it 'creates the creatable directory' do
16
+ expect(chef_run).to create_directory('creatable')
17
+ end
18
+
19
+ it 'deletes the deletable directory' do
20
+ expect(chef_run).to delete_directory('deletable')
21
+ end
22
+ end
@@ -4,6 +4,6 @@ require_relative '../spec_helper'
4
4
  describe 'spec::failure' do
5
5
  let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }
6
6
  it 'runs successfully' do
7
- expect{chef_run}.not_to raise_error
7
+ expect { chef_run }.to raise_error
8
8
  end
9
9
  end
@@ -0,0 +1,14 @@
1
+ require 'chefspec'
2
+ require_relative '../spec_helper'
3
+
4
+ describe 'spec::guard' do
5
+ let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }
6
+
7
+ it 'installs the guardable package' do
8
+ expect(chef_run).to_not install_package('guardable')
9
+ end
10
+
11
+ it 'installs the unguardable package' do
12
+ expect(chef_run).to install_package('unguardable')
13
+ end
14
+ end
@@ -0,0 +1,30 @@
1
+ require 'chefspec'
2
+ require_relative '../spec_helper'
3
+
4
+ describe 'spec::multiple_actions' do
5
+ let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }
6
+
7
+ it 'installs the multiactionable package' do
8
+ expect(chef_run).to install_package('multiactionable')
9
+ end
10
+
11
+ it 'upgrades the multiactionable package' do
12
+ expect(chef_run).to upgrade_package('multiactionable')
13
+ end
14
+
15
+ it 'purges the multiactionable package' do
16
+ expect(chef_run).to purge_package('multiactionable')
17
+ end
18
+
19
+ it 'installs the mixactionable package' do
20
+ expect(chef_run).to install_package('mixactionable').at_compile_time
21
+ end
22
+
23
+ it 'upgrades the mixactionable package' do
24
+ expect(chef_run).to upgrade_package('mixactionable')
25
+ end
26
+
27
+ it 'purges the mixactionable package' do
28
+ expect(chef_run).to purge_package('mixactionable')
29
+ end
30
+ end
@@ -0,0 +1,14 @@
1
+ require 'chefspec'
2
+ require_relative '../spec_helper'
3
+
4
+ describe 'spec::nothing' do
5
+ let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }
6
+
7
+ it 'installs the actionable package' do
8
+ expect(chef_run).to install_package('actionable')
9
+ end
10
+
11
+ it 'ignores the unactionable package' do
12
+ expect(chef_run.package('unactionable')).to do_nothing
13
+ end
14
+ end
@@ -0,0 +1,34 @@
1
+ require 'chefspec'
2
+ require_relative '../spec_helper'
3
+
4
+ describe 'spec::package' do
5
+ let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }
6
+
7
+ it 'installs the defaultable package' do
8
+ expect(chef_run).to install_package('defaultable')
9
+ end
10
+
11
+ it 'installs the identifiable package' do
12
+ expect(chef_run).to install_package('identifiable')
13
+ end
14
+
15
+ it 'installs the installable package' do
16
+ expect(chef_run).to install_package('installable')
17
+ end
18
+
19
+ it 'purges the purgeable package' do
20
+ expect(chef_run).to purge_package('purgeable')
21
+ end
22
+
23
+ it 'reconfigs the reconfigurable package' do
24
+ expect(chef_run).to reconfig_package('reconfigurable')
25
+ end
26
+
27
+ it 'removes the removeable package' do
28
+ expect(chef_run).to remove_package('removeable')
29
+ end
30
+
31
+ it 'upgrades the upgradable package' do
32
+ expect(chef_run).to upgrade_package('upgradable')
33
+ end
34
+ end
@@ -4,10 +4,11 @@ require_relative '../spec_helper'<% end %>
4
4
  describe '<%= cookbook %>::<%= recipe %>' do
5
5
  let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }<% if not test_cases.empty? %><% test_cases.each do |test_case| %>
6
6
 
7
- it "<%= test_case[:it] %>" do
8
- expect(chef_run).to <%= test_case[:expect] %>("<%= test_case[:name] %>")
7
+ it '<%= test_case[:it] %>' do<% if test_case[:nothing] %>
8
+ expect(chef_run.<%= test_case[:noun] %>('<%= test_case[:adjective] %>')).to do_nothing<% else %>
9
+ expect(chef_run).to<% if test_case[:guarded] %>_not<% end %> <%= test_case[:expect] %>('<%= test_case[:name] %>')<% if test_case[:compile_time] %>.at_compile_time<% end %><% end %>
9
10
  end<% end %><% else %>
10
11
  it 'runs successfully' do
11
- expect{chef_run}.not_to raise_error
12
+ expect { chef_run }.to raise_error
12
13
  end<% end %>
13
14
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chefspec-bootstrap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-12-01 00:00:00.000000000 Z
12
+ date: 2014-12-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: chefspec
@@ -94,13 +94,21 @@ files:
94
94
  - lib/api_map.rb
95
95
  - lib/chefspec_bootstrap.rb
96
96
  - spec/chefspec_bootstrap_spec.rb
97
+ - spec/cookbooks/spec/recipes/compile_time.rb
97
98
  - spec/cookbooks/spec/recipes/directory.rb
98
99
  - spec/cookbooks/spec/recipes/failure.rb
100
+ - spec/cookbooks/spec/recipes/guard.rb
101
+ - spec/cookbooks/spec/recipes/multiple_actions.rb
102
+ - spec/cookbooks/spec/recipes/nothing.rb
99
103
  - spec/cookbooks/spec/recipes/package.rb
104
+ - spec/meta/compile_time_spec.rb
105
+ - spec/meta/directory_spec.rb
106
+ - spec/meta/failure_spec.rb
107
+ - spec/meta/guard_spec.rb
108
+ - spec/meta/multiple_actions_spec.rb
109
+ - spec/meta/nothing_spec.rb
110
+ - spec/meta/package_spec.rb
100
111
  - spec/spec_helper.rb
101
- - spec/templates/directory.txt
102
- - spec/templates/failure.txt
103
- - spec/templates/package.txt
104
112
  - templates/default.erb
105
113
  homepage: http://rubygems.org/gems/chefspec-bootstrap
106
114
  licenses:
@@ -1,22 +0,0 @@
1
- require 'chefspec'
2
- require_relative '../spec_helper'
3
-
4
- describe 'spec::directory' do
5
- let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }
6
-
7
- it "creates the defaultable directory" do
8
- expect(chef_run).to create_directory("defaultable")
9
- end
10
-
11
- it "creates the identifiable directory" do
12
- expect(chef_run).to create_directory("identifiable")
13
- end
14
-
15
- it "creates the creatable directory" do
16
- expect(chef_run).to create_directory("creatable")
17
- end
18
-
19
- it "deletes the deletable directory" do
20
- expect(chef_run).to delete_directory("deletable")
21
- end
22
- end
@@ -1,34 +0,0 @@
1
- require 'chefspec'
2
- require_relative '../spec_helper'
3
-
4
- describe 'spec::package' do
5
- let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }
6
-
7
- it "installs the defaultable package" do
8
- expect(chef_run).to install_package("defaultable")
9
- end
10
-
11
- it "installs the identifiable package" do
12
- expect(chef_run).to install_package("identifiable")
13
- end
14
-
15
- it "installs the installable package" do
16
- expect(chef_run).to install_package("installable")
17
- end
18
-
19
- it "purges the purgeable package" do
20
- expect(chef_run).to purge_package("purgeable")
21
- end
22
-
23
- it "reconfigs the reconfigurable package" do
24
- expect(chef_run).to reconfig_package("reconfigurable")
25
- end
26
-
27
- it "removes the removeable package" do
28
- expect(chef_run).to remove_package("removeable")
29
- end
30
-
31
- it "upgrades the upgradable package" do
32
- expect(chef_run).to upgrade_package("upgradable")
33
- end
34
- end