chefspec 2.0.1 → 3.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/lib/chefspec.rb +30 -44
  3. data/lib/chefspec/api.rb +74 -0
  4. data/lib/chefspec/api/apt_package.rb +192 -0
  5. data/lib/chefspec/api/batch.rb +43 -0
  6. data/lib/chefspec/api/chef_gem.rb +191 -0
  7. data/lib/chefspec/api/cookbook_file.rb +166 -0
  8. data/lib/chefspec/api/cron.rb +80 -0
  9. data/lib/chefspec/api/deploy.rb +117 -0
  10. data/lib/chefspec/api/directory.rb +80 -0
  11. data/lib/chefspec/api/dpkg_package.rb +117 -0
  12. data/lib/chefspec/api/easy_install_package.rb +154 -0
  13. data/lib/chefspec/api/env.rb +117 -0
  14. data/lib/chefspec/api/erl_call.rb +43 -0
  15. data/lib/chefspec/api/execute.rb +43 -0
  16. data/lib/chefspec/api/file.rb +166 -0
  17. data/lib/chefspec/api/freebsd_package.rb +80 -0
  18. data/lib/chefspec/api/gem_package.rb +191 -0
  19. data/lib/chefspec/api/git.rb +117 -0
  20. data/lib/chefspec/api/group.rb +154 -0
  21. data/lib/chefspec/api/http_request.rb +228 -0
  22. data/lib/chefspec/api/ifconfig.rb +154 -0
  23. data/lib/chefspec/api/include_recipe.rb +26 -0
  24. data/lib/chefspec/api/ips_package.rb +117 -0
  25. data/lib/chefspec/api/link.rb +102 -0
  26. data/lib/chefspec/api/log.rb +43 -0
  27. data/lib/chefspec/api/macports_package.rb +154 -0
  28. data/lib/chefspec/api/mdadm.rb +117 -0
  29. data/lib/chefspec/api/mount.rb +192 -0
  30. data/lib/chefspec/api/notifications.rb +38 -0
  31. data/lib/chefspec/api/ohai.rb +43 -0
  32. data/lib/chefspec/api/package.rb +192 -0
  33. data/lib/chefspec/api/pacman_package.rb +155 -0
  34. data/lib/chefspec/api/portage_package.rb +155 -0
  35. data/lib/chefspec/api/powershell_script.rb +43 -0
  36. data/lib/chefspec/api/registry_key.rb +166 -0
  37. data/lib/chefspec/api/remote_directory.rb +120 -0
  38. data/lib/chefspec/api/remote_file.rb +166 -0
  39. data/lib/chefspec/api/render_file.rb +32 -0
  40. data/lib/chefspec/api/route.rb +80 -0
  41. data/lib/chefspec/api/rpm_package.rb +117 -0
  42. data/lib/chefspec/api/ruby_block.rb +37 -0
  43. data/lib/chefspec/api/script.rb +228 -0
  44. data/lib/chefspec/api/service.rb +246 -0
  45. data/lib/chefspec/api/smartos_package.rb +117 -0
  46. data/lib/chefspec/api/solaris_package.rb +80 -0
  47. data/lib/chefspec/api/subversion.rb +154 -0
  48. data/lib/chefspec/api/template.rb +166 -0
  49. data/lib/chefspec/api/user.rb +228 -0
  50. data/lib/chefspec/api/yum_package.rb +154 -0
  51. data/lib/chefspec/berkshelf.rb +37 -0
  52. data/lib/chefspec/deprecations.rb +151 -0
  53. data/lib/chefspec/errors.rb +99 -0
  54. data/lib/chefspec/expect_exception.rb +45 -0
  55. data/lib/chefspec/extensions/chef/client.rb +15 -0
  56. data/lib/chefspec/extensions/chef/conditional.rb +11 -0
  57. data/lib/chefspec/extensions/chef/data_query.rb +29 -0
  58. data/lib/chefspec/extensions/chef/lwrp_base.rb +44 -0
  59. data/lib/chefspec/extensions/chef/resource.rb +27 -0
  60. data/lib/chefspec/extensions/chef/securable.rb +19 -0
  61. data/lib/chefspec/formatter.rb +270 -0
  62. data/lib/chefspec/macros.rb +217 -0
  63. data/lib/chefspec/matchers.rb +9 -0
  64. data/lib/chefspec/matchers/include_recipe_matcher.rb +45 -0
  65. data/lib/chefspec/matchers/link_to_matcher.rb +28 -0
  66. data/lib/chefspec/matchers/notifications_matcher.rb +92 -0
  67. data/lib/chefspec/matchers/render_file_matcher.rb +72 -0
  68. data/lib/chefspec/matchers/resource_matcher.rb +143 -0
  69. data/lib/chefspec/renderer.rb +137 -0
  70. data/lib/chefspec/rspec.rb +17 -0
  71. data/lib/chefspec/runner.rb +274 -0
  72. data/lib/chefspec/stubs/command_registry.rb +11 -0
  73. data/lib/chefspec/stubs/command_stub.rb +37 -0
  74. data/lib/chefspec/stubs/data_bag_item_registry.rb +13 -0
  75. data/lib/chefspec/stubs/data_bag_item_stub.rb +25 -0
  76. data/lib/chefspec/stubs/data_bag_registry.rb +13 -0
  77. data/lib/chefspec/stubs/data_bag_stub.rb +23 -0
  78. data/lib/chefspec/stubs/registry.rb +32 -0
  79. data/lib/chefspec/stubs/search_registry.rb +13 -0
  80. data/lib/chefspec/stubs/search_stub.rb +25 -0
  81. data/lib/chefspec/stubs/stub.rb +37 -0
  82. data/lib/chefspec/version.rb +1 -2
  83. metadata +100 -103
  84. data/lib/chef/expect_exception.rb +0 -34
  85. data/lib/chef/formatters/chefspec.rb +0 -233
  86. data/lib/chef/knife/cookbook_create_specs.rb +0 -107
  87. data/lib/chefspec/chef_runner.rb +0 -275
  88. data/lib/chefspec/helpers/describe.rb +0 -17
  89. data/lib/chefspec/matchers/cron.rb +0 -7
  90. data/lib/chefspec/matchers/env.rb +0 -8
  91. data/lib/chefspec/matchers/execute.rb +0 -33
  92. data/lib/chefspec/matchers/file.rb +0 -83
  93. data/lib/chefspec/matchers/file_content.rb +0 -32
  94. data/lib/chefspec/matchers/group.rb +0 -8
  95. data/lib/chefspec/matchers/include_recipe.rb +0 -20
  96. data/lib/chefspec/matchers/link.rb +0 -14
  97. data/lib/chefspec/matchers/log.rb +0 -21
  98. data/lib/chefspec/matchers/notifications.rb +0 -43
  99. data/lib/chefspec/matchers/package.rb +0 -39
  100. data/lib/chefspec/matchers/python.rb +0 -7
  101. data/lib/chefspec/matchers/ruby_block.rb +0 -13
  102. data/lib/chefspec/matchers/script.rb +0 -34
  103. data/lib/chefspec/matchers/service.rb +0 -25
  104. data/lib/chefspec/matchers/shared.rb +0 -132
  105. data/lib/chefspec/matchers/user.rb +0 -8
  106. data/lib/chefspec/minitest.rb +0 -195
  107. data/lib/chefspec/monkey_patches/conditional.rb +0 -19
  108. data/lib/chefspec/monkey_patches/hash.rb +0 -23
  109. data/lib/chefspec/monkey_patches/lwrp_base.rb +0 -45
  110. data/lib/chefspec/monkey_patches/provider.rb +0 -43
@@ -1,8 +0,0 @@
1
-
2
- require 'chefspec/matchers/shared'
3
-
4
- module ChefSpec
5
- module Matchers
6
- define_resource_matchers([:create, :remove], [:user], :username)
7
- end
8
- end
@@ -1,195 +0,0 @@
1
- module ChefSpec
2
- # Supports running minitest-chef-handler examples without a real converge.
3
- #
4
- # This is experimental and comes with the following caveats:
5
- #
6
- # * This support is intended only to run existing examples at present. This
7
- # means that it has not been tested with examples that explicitly create a
8
- # new ChefRunner.
9
- # * Examples that shell out or access the file system using Ruby will fail.
10
- # This support only ensures that minitest-chef-handler matchers work.
11
- # * Only a subset of minitest-chef-handler matchers are currently supported
12
- # , equivalent to the built-in RSpec matchers.
13
- # * It is assumed that your spec class includes the `MiniTest::Chef` modules
14
- # directly. Add this include for ChefSpec mode:
15
- #
16
- # include ChefSpec::MiniTest
17
- module MiniTest
18
-
19
- # minitest-chef-handler declares methods for each resource that use
20
- # `load_current_resource` to fetch the current state of the node. We override
21
- # these and instantiate fresh resources.
22
- def self.override_minitest_resources(run_context, within_module)
23
- ::Chef::Resource.constants.each do |resource|
24
- if Chef::Resource.const_get(resource).respond_to?(:ancestors) and
25
- Chef::Resource.const_get(resource).ancestors.include? Chef::Resource
26
- method_name = Chef::Mixin::ConvertToClassName.
27
- convert_to_snake_case(resource.to_s).to_sym
28
- within_module.send(:define_method, method_name) do |name|
29
- Chef::Resource.const_get(resource).new(name).tap do |r|
30
- r.run_context = run_context
31
- end
32
- end
33
- end
34
- end
35
- end
36
-
37
- # minitest-chef-handler patches `Chef::Resource` to handle file uid and gid
38
- # conversion. In our instance these values are not populated by the
39
- # provider and will instead be whatever was specified against the resource
40
- # so we remove this conversion.
41
- def self.remove_file_id_conversion
42
- ::Chef::Resource.class_eval do
43
- def resource_value(attribute)
44
- send(attribute)
45
- end
46
- end
47
- end
48
-
49
- def self.override_minitest_assertions(chef_run)
50
-
51
- remove_file_id_conversion
52
-
53
- ::MiniTest::Chef::Assertions.class_eval do
54
-
55
- def assert_includes_content(file, content)
56
- assert file_includes_content?(file, content),
57
- "Expected file '#{file.path}' to include the specified content"
58
- file
59
- end
60
-
61
- def refute_includes_content(file, content)
62
- refute file_includes_content?(file, content),
63
- "Expected file '#{file.path}' not to include the specified content"
64
- file
65
- end
66
-
67
- def assert_path_exists(file_or_dir)
68
- paths = file_resources + resources_by_type(:directory)
69
- actual_resource = paths.find{|file| file_or_dir.path == file.path and
70
- ! Array(file.action).include?(:delete)}
71
- assert actual_resource, "Expected path '#{file_or_dir.path}' to exist"
72
- actual_resource
73
- end
74
-
75
- def refute_path_exists(file_or_dir)
76
- paths = file_resources + resources_by_type(:directory)
77
- actual_resource = paths.find{|file| file_or_dir.path == file.path and
78
- Array(file.action).include?(:delete)}
79
- assert actual_resource, "Expected path '#{file_or_dir.path}' not to exist"
80
- actual_resource
81
- end
82
-
83
- private
84
-
85
- def same_resource_type?(expected_resource, actual_resource)
86
- case actual_resource.resource_name.to_s
87
- when /file$/
88
- expected_resource.resource_name == :file
89
- else
90
- expected_resource.resource_name == actual_resource.resource_name
91
- end
92
- end
93
-
94
- def find_resource(expected_resource, field)
95
- resources.find do |actual_resource|
96
- same_resource_type?(expected_resource, actual_resource) and
97
- expected_resource.send(field) == actual_resource.send(field)
98
- end
99
- end
100
-
101
- def self.override_assertion(assert_name, field, wont_actions = [])
102
- [:assert, :refute].each do |prefix|
103
- define_method("#{prefix}_#{assert_name}") do |expected_resource|
104
- actual_resource = find_resource(expected_resource, field)
105
- is_wont = false
106
- if actual_resource
107
- is_wont = ! (Array(actual_resource.action) & wont_actions).empty?
108
- end
109
- # If we are refuting then the assertion is actually positive,
110
- # we are for example asserting that the package has the `:remove`
111
- # action.
112
- if prefix == :assert || is_wont
113
- assert actual_resource
114
- else
115
- refute actual_resource
116
- end
117
- actual_resource
118
- end
119
- end
120
- end
121
-
122
- override_assertion :installed, :package_name, [:remove, :purge]
123
- override_assertion :enabled, :enabled, [:disable]
124
- override_assertion :running, :running, [:stop]
125
- override_assertion :user_exists, :username, [:remove]
126
- override_assertion :group_exists, :group_name, [:remove]
127
-
128
- def file_resources
129
- resources.select{|r| r.resource_name.to_s.end_with?('file')} +
130
- resources.select{|r| r.resource_name == :template}
131
- end
132
-
133
- def resources_by_type(type)
134
- resources.select{|r| r.resource_name == type}
135
- end
136
-
137
- def cookbook_files(cookbook)
138
- run_context.cookbook_collection[cookbook].file_filenames
139
- end
140
-
141
- def file_includes_content?(file, content)
142
- file_resources.any? do |f|
143
- f.path == file.path &&
144
- case f.resource_name
145
- when :cookbook_file
146
- content_from_cookbook_file(chef_run, f)
147
- when :file
148
- content_from_file(chef_run, f)
149
- when :template
150
- content_from_template(chef_run, f)
151
- else raise NotImplementedError,
152
- ":#{f.resource_name} not supported for comparison"
153
- end.include?(content)
154
- end
155
- end
156
-
157
- end
158
- end
159
-
160
- def self.share_object(spec_mod, name, obj)
161
- spec_mod.send(:define_method, name) do
162
- obj
163
- end
164
- end
165
-
166
- def self.included(other_mod)
167
- self.support_fake_converge(other_mod) if spec_module?(other_mod)
168
- end
169
-
170
- def self.support_fake_converge(spec_mod)
171
- chef_run = ChefSpec::ChefRunner.new(
172
- :cookbook_path => default_cookbook_path).converge recipe_for_module(spec_mod)
173
- override_minitest_resources(chef_run.run_context, spec_mod)
174
- override_minitest_assertions(chef_run)
175
- share_object(spec_mod, :chef_run, chef_run)
176
- share_object(spec_mod, :node, chef_run.node)
177
- share_object(spec_mod, :resources, chef_run.resources)
178
- share_object(spec_mod, :run_context, chef_run.run_context)
179
- end
180
-
181
- def self.recipe_for_module(mod)
182
- mod.to_s.split('::')[-2..-1].join('::')
183
- end
184
-
185
- def self.spec_module?(mod)
186
- # minitest-chef-handler module names are of the form:
187
- # `recipe::example::default`
188
- recipe_for_module(mod) == recipe_for_module(mod).downcase
189
- end
190
-
191
- def self.default_cookbook_path
192
- Pathname.new(File.join(caller(3).first.split(':').slice(0..-3).first, "..", "..", "..")).cleanpath
193
- end
194
- end
195
- end
@@ -1,19 +0,0 @@
1
- class Chef
2
- class Resource
3
- class Conditional
4
- alias_method :original_evaluate_command, :evaluate_command
5
- def evaluate_command
6
- runner.stubbed_commands.each do |stubbed_cmd, result|
7
- case command
8
- when stubbed_cmd then return result
9
- end
10
- end
11
- if runner.actually_run_shell_guards?
12
- return original_evaluate_command
13
- end
14
- raise RSpec::Mocks::MockExpectationError.new(
15
- "The following shell guard was unstubbed: #{description}")
16
- end
17
- end
18
- end
19
- end
@@ -1,23 +0,0 @@
1
- # Ruby stdlib Hash class
2
- class Hash
3
- # Monkey-patch to stdlib Hash to give us Mash style lookup
4
- def method_missing(m, *args, &block)
5
- if has_key?(m.to_sym)
6
- self[m.to_sym]
7
- elsif has_key?(m.to_s)
8
- self[m.to_s]
9
- else
10
- super
11
- end
12
- end
13
-
14
- # Monkey-patch to stdlib Hash to correspond to Mash-style lookup
15
- # @see {Hash#respond_to?}
16
- def respond_to?(m, include_private = false)
17
- if has_key?(m.to_sym) || has_key?(m.to_s)
18
- true
19
- else
20
- super
21
- end
22
- end
23
- end
@@ -1,45 +0,0 @@
1
- if Chef::VERSION >= '11.0.0'
2
-
3
- # Override Chef LWRP creation to remove existing class to avoid redefinition warnings.
4
- class Chef
5
- class Provider
6
- # Chef provider for a resource
7
- class LWRPBase < Provider
8
- class << self
9
- alias_method :old_build_from_file, :build_from_file
10
-
11
- # Override Opscode provider to remove any existing LWRP
12
- #
13
- # @param [String] cookbook_name The name of the cookbook
14
- # @param [String] filename File to load as a LWRP
15
- # @param [Chef::RunContext] run_context Context of a Chef Run
16
- # @return [Chef::Provider] the created provider
17
- def build_from_file(*args)
18
- cookbook_name, filename = args[0,2]
19
- remove_existing_lwrp(convert_to_class_name(filename_to_qualified_string(cookbook_name, filename)))
20
- old_build_from_file(*args)
21
- end
22
-
23
- # Remove any existing Chef provider or resource with the specified name.
24
- #
25
- # @param [String] class_name The class name. Must be a valid constant name.
26
- def remove_existing_lwrp(class_name)
27
- [Chef::Resource::LWRPBase, Chef::Provider::LWRPBase, Chef::Resource, Chef::Provider].each do |resource_holder|
28
- if RUBY_VERSION < '1.9'
29
- if resource_holder.const_defined? class_name
30
- resource_holder.send(:remove_const, class_name)
31
- end
32
- else
33
- if resource_holder.const_defined? class_name, false
34
- resource_holder.send(:remove_const, class_name)
35
- end
36
- end
37
- end
38
- end
39
-
40
- end
41
- end
42
- end
43
-
44
- end
45
- end
@@ -1,43 +0,0 @@
1
- if Chef::VERSION < '11.0.0'
2
-
3
- # Override Chef LWRP creation to remove existing class to avoid redefinition warnings.
4
- class Chef
5
- # Chef provider for a resource
6
- class Provider
7
- class << self
8
- alias_method :old_build_from_file, :build_from_file
9
-
10
- # Override Opscode provider to remove any existing LWRP
11
- #
12
- # @param [String] cookbook_name The name of the cookbook
13
- # @param [String] filename File to load as a LWRP
14
- # @param [Chef::RunContext] run_context Context of a Chef Run
15
- # @return [Chef::Provider] the created provider
16
- def build_from_file(*args)
17
- cookbook_name, filename = args[0,2]
18
- remove_existing_lwrp(convert_to_class_name(filename_to_qualified_string(cookbook_name, filename)))
19
- old_build_from_file(*args)
20
- end
21
-
22
- # Remove any existing Chef provider or resource with the specified name.
23
- #
24
- # @param [String] class_name The class name. Must be a valid constant name.
25
- def remove_existing_lwrp(class_name)
26
- [Chef::Resource, Chef::Provider].each do |resource_holder|
27
- if RUBY_VERSION < '1.9'
28
- if resource_holder.const_defined? class_name
29
- resource_holder.send(:remove_const, class_name)
30
- end
31
- else
32
- if resource_holder.const_defined? class_name, false
33
- resource_holder.send(:remove_const, class_name)
34
- end
35
- end
36
- end
37
- end
38
-
39
- end
40
- end
41
- end
42
-
43
- end