chefspec-chef 9.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +30 -0
  3. data/LICENSE +22 -0
  4. data/Rakefile +85 -0
  5. data/chefspec-chef.gemspec +30 -0
  6. data/lib/chefspec/api/core.rb +217 -0
  7. data/lib/chefspec/api/described.rb +53 -0
  8. data/lib/chefspec/api/do_nothing.rb +26 -0
  9. data/lib/chefspec/api/include_any_recipe.rb +24 -0
  10. data/lib/chefspec/api/include_recipe.rb +28 -0
  11. data/lib/chefspec/api/link.rb +28 -0
  12. data/lib/chefspec/api/notifications.rb +40 -0
  13. data/lib/chefspec/api/reboot.rb +14 -0
  14. data/lib/chefspec/api/render_file.rb +37 -0
  15. data/lib/chefspec/api/state_attrs.rb +30 -0
  16. data/lib/chefspec/api/stubs.rb +183 -0
  17. data/lib/chefspec/api/stubs_for.rb +139 -0
  18. data/lib/chefspec/api/subscriptions.rb +37 -0
  19. data/lib/chefspec/api/user.rb +230 -0
  20. data/lib/chefspec/api.rb +39 -0
  21. data/lib/chefspec/berkshelf.rb +63 -0
  22. data/lib/chefspec/cacher.rb +64 -0
  23. data/lib/chefspec/coverage/filters.rb +82 -0
  24. data/lib/chefspec/coverage.rb +247 -0
  25. data/lib/chefspec/deprecations.rb +46 -0
  26. data/lib/chefspec/errors.rb +48 -0
  27. data/lib/chefspec/expect_exception.rb +51 -0
  28. data/lib/chefspec/extensions/chef/client.rb +21 -0
  29. data/lib/chefspec/extensions/chef/conditional.rb +16 -0
  30. data/lib/chefspec/extensions/chef/cookbook/gem_installer.rb +33 -0
  31. data/lib/chefspec/extensions/chef/cookbook_loader.rb +14 -0
  32. data/lib/chefspec/extensions/chef/cookbook_uploader.rb +12 -0
  33. data/lib/chefspec/extensions/chef/data_query.rb +49 -0
  34. data/lib/chefspec/extensions/chef/lwrp_base.rb +29 -0
  35. data/lib/chefspec/extensions/chef/provider.rb +39 -0
  36. data/lib/chefspec/extensions/chef/resource/freebsd_package.rb +17 -0
  37. data/lib/chefspec/extensions/chef/resource.rb +188 -0
  38. data/lib/chefspec/extensions/chef/run_context/cookbook_compiler.rb +84 -0
  39. data/lib/chefspec/extensions/chef/securable.rb +19 -0
  40. data/lib/chefspec/extensions/ohai/system.rb +11 -0
  41. data/lib/chefspec/extensions.rb +21 -0
  42. data/lib/chefspec/file_cache_path_proxy.rb +15 -0
  43. data/lib/chefspec/formatter.rb +282 -0
  44. data/lib/chefspec/librarian.rb +51 -0
  45. data/lib/chefspec/matchers/do_nothing_matcher.rb +52 -0
  46. data/lib/chefspec/matchers/include_any_recipe_matcher.rb +51 -0
  47. data/lib/chefspec/matchers/include_recipe_matcher.rb +46 -0
  48. data/lib/chefspec/matchers/link_to_matcher.rb +37 -0
  49. data/lib/chefspec/matchers/notifications_matcher.rb +143 -0
  50. data/lib/chefspec/matchers/render_file_matcher.rb +140 -0
  51. data/lib/chefspec/matchers/resource_matcher.rb +175 -0
  52. data/lib/chefspec/matchers/state_attrs_matcher.rb +71 -0
  53. data/lib/chefspec/matchers/subscribes_matcher.rb +72 -0
  54. data/lib/chefspec/matchers.rb +13 -0
  55. data/lib/chefspec/mixins/normalize.rb +22 -0
  56. data/lib/chefspec/policyfile.rb +69 -0
  57. data/lib/chefspec/renderer.rb +145 -0
  58. data/lib/chefspec/rspec.rb +21 -0
  59. data/lib/chefspec/runner.rb +8 -0
  60. data/lib/chefspec/server.rb +4 -0
  61. data/lib/chefspec/server_methods.rb +173 -0
  62. data/lib/chefspec/server_runner.rb +76 -0
  63. data/lib/chefspec/solo_runner.rb +516 -0
  64. data/lib/chefspec/stubs/command_registry.rb +11 -0
  65. data/lib/chefspec/stubs/command_stub.rb +37 -0
  66. data/lib/chefspec/stubs/data_bag_item_registry.rb +13 -0
  67. data/lib/chefspec/stubs/data_bag_item_stub.rb +25 -0
  68. data/lib/chefspec/stubs/data_bag_registry.rb +13 -0
  69. data/lib/chefspec/stubs/data_bag_stub.rb +23 -0
  70. data/lib/chefspec/stubs/registry.rb +32 -0
  71. data/lib/chefspec/stubs/search_registry.rb +13 -0
  72. data/lib/chefspec/stubs/search_stub.rb +25 -0
  73. data/lib/chefspec/stubs/stub.rb +38 -0
  74. data/lib/chefspec/util.rb +58 -0
  75. data/lib/chefspec/version.rb +3 -0
  76. data/lib/chefspec/zero_server.rb +142 -0
  77. data/lib/chefspec.rb +75 -0
  78. data/spec/spec_helper.rb +12 -0
  79. data/spec/support/hash.rb +35 -0
  80. data/spec/unit/cacher_spec.rb +70 -0
  81. data/spec/unit/coverage/filters_spec.rb +60 -0
  82. data/spec/unit/deprecations_spec.rb +52 -0
  83. data/spec/unit/errors_spec.rb +57 -0
  84. data/spec/unit/expect_exception_spec.rb +32 -0
  85. data/spec/unit/macros_spec.rb +119 -0
  86. data/spec/unit/matchers/do_nothing_matcher.rb +5 -0
  87. data/spec/unit/matchers/include_any_recipe_matcher_spec.rb +52 -0
  88. data/spec/unit/matchers/include_recipe_matcher_spec.rb +38 -0
  89. data/spec/unit/matchers/link_to_matcher_spec.rb +55 -0
  90. data/spec/unit/matchers/notifications_matcher_spec.rb +39 -0
  91. data/spec/unit/matchers/render_file_matcher_spec.rb +68 -0
  92. data/spec/unit/matchers/resource_matcher_spec.rb +5 -0
  93. data/spec/unit/matchers/state_attrs_matcher_spec.rb +68 -0
  94. data/spec/unit/matchers/subscribes_matcher_spec.rb +63 -0
  95. data/spec/unit/renderer_spec.rb +69 -0
  96. data/spec/unit/server_runner_spec.rb +28 -0
  97. data/spec/unit/solo_runner_spec.rb +171 -0
  98. data/spec/unit/stubs/command_registry_spec.rb +27 -0
  99. data/spec/unit/stubs/command_stub_spec.rb +61 -0
  100. data/spec/unit/stubs/data_bag_item_registry_spec.rb +39 -0
  101. data/spec/unit/stubs/data_bag_item_stub_spec.rb +36 -0
  102. data/spec/unit/stubs/data_bag_registry_spec.rb +39 -0
  103. data/spec/unit/stubs/data_bag_stub_spec.rb +35 -0
  104. data/spec/unit/stubs/registry_spec.rb +29 -0
  105. data/spec/unit/stubs/search_registry_spec.rb +39 -0
  106. data/spec/unit/stubs/search_stub_spec.rb +36 -0
  107. data/spec/unit/stubs/stub_spec.rb +64 -0
  108. data/templates/coverage/human.erb +22 -0
  109. data/templates/coverage/json.erb +8 -0
  110. data/templates/coverage/table.erb +14 -0
  111. data/templates/errors/cookbook_path_not_found.erb +3 -0
  112. data/templates/errors/erb_template_parse_error.erb +5 -0
  113. data/templates/errors/gem_load_error.erb +7 -0
  114. data/templates/errors/invalid_berkshelf_options.erb +4 -0
  115. data/templates/errors/may_need_to_specify_platform.erb +25 -0
  116. data/templates/errors/no_conversion_error.erb +1 -0
  117. data/templates/errors/not_stubbed.erb +7 -0
  118. data/templates/errors/shell_out_not_stubbed.erb +10 -0
  119. data/templates/errors/template_not_found.erb +9 -0
  120. metadata +221 -0
@@ -0,0 +1,171 @@
1
+ require "spec_helper"
2
+
3
+ describe ChefSpec::SoloRunner do
4
+ before do
5
+ allow_any_instance_of(ChefSpec::SoloRunner)
6
+ .to receive(:dry_run?)
7
+ .and_return(true)
8
+ end
9
+
10
+ describe "#initialize" do
11
+ let(:windows_caller_stack) do
12
+ [
13
+ "C:/cookbooks/Temp/spec/test_spec.rb:11:in `block (2 levels) in <top (required)>'",
14
+ "C:/Ruby193/lib/ruby/gems/1.9.1/gems/rspec-core-2.14.8/lib/rspec/core/example.rb:114:in `instance_eval'",
15
+ "C:/Ruby193/lib/ruby/gems/1.9.1/gems/rspec-core-2.14.8/lib/rspec/core/example.rb:114:in `block in run'",
16
+ "C:/Ruby193/lib/ruby/gems/1.9.1/gems/rspec-core-2.14.8/lib/rspec/core/example.rb:254:in `with_around_each_hooks'",
17
+ "C:/Ruby193/lib/ruby/gems/1.9.1/gems/rspec-core-2.14.8/lib/rspec/core/example.rb:111:in `run'",
18
+ "C:/Ruby193/lib/ruby/gems/1.9.1/gems/rspec-core-2.14.8/lib/rspec/core/example_group.rb:390:in `block in run_examples'",
19
+ "C:/Ruby193/lib/ruby/gems/1.9.1/gems/rspec-core-2.14.8/lib/rspec/core/example_group.rb:386:in `map'",
20
+ "C:/Ruby193/lib/ruby/gems/1.9.1/gems/rspec-core-2.14.8/lib/rspec/core/example_group.rb:386:in `run_examples'",
21
+ "C:/Ruby193/lib/ruby/gems/1.9.1/gems/rspec-core-2.14.8/lib/rspec/core/example_group.rb:371:in `run'",
22
+ "C:/Ruby193/lib/ruby/gems/1.9.1/gems/rspec-core-2.14.8/lib/rspec/core/command_line.rb:28:in `block (2 levels) in run'",
23
+ "C:/Ruby193/lib/ruby/gems/1.9.1/gems/rspec-core-2.14.8/lib/rspec/core/command_line.rb:28:in `map'",
24
+ "C:/Ruby193/lib/ruby/gems/1.9.1/gems/rspec-core-2.14.8/lib/rspec/core/command_line.rb:28:in `block in run'",
25
+ "C:/Ruby193/lib/ruby/gems/1.9.1/gems/rspec-core-2.14.8/lib/rspec/core/reporter.rb:58:in `report'",
26
+ "C:/Ruby193/lib/ruby/gems/1.9.1/gems/rspec-core-2.14.8/lib/rspec/core/command_line.rb:25:in `run'",
27
+ "C:/Ruby193/lib/ruby/gems/1.9.1/gems/rspec-core-2.14.8/lib/rspec/core/runner.rb:80:in `run'",
28
+ "C:/Ruby193/lib/ruby/gems/1.9.1/gems/rspec-core-2.14.8/lib/rspec/core/runner.rb:17:in `block in autorun'",
29
+ ]
30
+ end
31
+
32
+ it "defaults the log level to :warn" do
33
+ described_class.new
34
+ expect(Chef::Log.level).to eq(:warn)
35
+ end
36
+
37
+ it "sets the log level" do
38
+ described_class.new(log_level: :error)
39
+ expect(Chef::Log.level).to eq(:error)
40
+ end
41
+
42
+ it "defaults the cookbook_path to the calling spec" do
43
+ described_class.new
44
+ expect(Chef::Config.cookbook_path).to eq([File.expand_path("../../..", __dir__)])
45
+ end
46
+
47
+ it "defaults the cookbook_path to the calling spec when using windows paths" do
48
+ runner = described_class.new
49
+ windows_path = runner.instance_exec(windows_caller_stack) { |callstack|
50
+ calling_cookbook_path({}, callstack)
51
+ }
52
+ # There's got to be a better way to do this the File.expand_path returns
53
+ # something like /home/user/repos/chefspec/C:/cookbooks" which is less
54
+ # than ideal as a robust test
55
+ expect(windows_path).to end_with("C:/cookbooks")
56
+ end
57
+
58
+ it "sets the cookbook path" do
59
+ described_class.new(cookbook_path: "/tmp/bacon")
60
+ expect(Chef::Config.cookbook_path).to eq(["/tmp/bacon"])
61
+ end
62
+
63
+ it "sets the file cache path" do
64
+ described_class.new( file_cache_path: "/tmp/pantoa")
65
+ expect(Chef::Config.file_cache_path).to eq("/tmp/pantoa")
66
+ end
67
+
68
+ it "sets the Chef::Config" do
69
+ expect(Chef::Config.cache_type).to eq("Memory")
70
+ expect(Chef::Config.force_logger).to be_truthy
71
+ expect(Chef::Config.no_lazy_load).to be_truthy
72
+ expect(Chef::Config.solo).to be_truthy
73
+ expect(Chef::Config.use_policyfile).to be_falsey
74
+ end
75
+
76
+ it "yields a block to set node attributes" do
77
+ expect { |block| described_class.new({}, &block) }.to yield_with_args(Chef::Node)
78
+ end
79
+
80
+ context "default ohai attributes" do
81
+ let(:hash) { described_class.new.node.to_hash }
82
+
83
+ it "sets the default attributes" do
84
+ expect(hash["os"]).to eq("chefspec")
85
+ expect(hash["languages"]["ruby"]["bin_dir"]).to eq("/usr/local/bin")
86
+ expect(hash["os_version"]).to eq("0.6.1")
87
+ expect(hash["fqdn"]).to eq("chefspec.local")
88
+ expect(hash["domain"]).to eq("local")
89
+ expect(hash["ipaddress"]).to eq("127.0.0.1")
90
+ expect(hash["hostname"]).to eq("chefspec")
91
+ expect(hash["kernel"]["machine"]).to eq("i386")
92
+ end
93
+ end
94
+
95
+ context "fauxhai attributes" do
96
+ let(:hash) { described_class.new(platform: "ubuntu", version: "18.04").node.to_hash }
97
+
98
+ it "sets the attributes from fauxhai" do
99
+ expect(hash["os"]).to eq("linux")
100
+ expect(hash["languages"]["ruby"]["ruby_bin"]).to eq("/usr/local/bin/ruby")
101
+ expect(hash["os_version"]).to match(/5.4.0-.*-.*/) # avoid failing when fauxhai data changes
102
+ expect(hash["fqdn"]).to eq("fauxhai.local")
103
+ expect(hash["domain"]).to eq("local")
104
+ expect(hash["ipaddress"]).to eq("10.0.0.2")
105
+ expect(hash["hostname"]).to eq("Fauxhai")
106
+ expect(hash["kernel"]["machine"]).to eq("x86_64")
107
+ end
108
+ end
109
+
110
+ context "RSpec global configuration" do
111
+ before do
112
+ allow(RSpec.configuration).to receive(:cookbook_path).and_return("./path")
113
+ allow(RSpec.configuration).to receive(:environment_path).and_return("./env-path")
114
+ allow(RSpec.configuration).to receive(:file_cache_path).and_return("./file-cache-path")
115
+ allow(RSpec.configuration).to receive(:log_level).and_return(:fatal)
116
+ allow(RSpec.configuration).to receive(:path).and_return("ohai.json")
117
+ allow(RSpec.configuration).to receive(:platform).and_return("ubuntu")
118
+ allow(RSpec.configuration).to receive(:version).and_return("12.04")
119
+ end
120
+
121
+ it "uses the RSpec values" do
122
+ options = described_class.new.options
123
+ expect(options[:cookbook_path]).to eq("./path")
124
+ expect(options[:environment_path]).to eq("./env-path")
125
+ expect(options[:file_cache_path]).to eq("./file-cache-path")
126
+ expect(options[:log_level]).to eq(:fatal)
127
+ expect(options[:path]).to eq("ohai.json")
128
+ expect(options[:platform]).to eq("ubuntu")
129
+ expect(options[:version]).to eq("12.04")
130
+ end
131
+ end
132
+ end
133
+
134
+ describe "#node" do
135
+ it "returns the Chef::Node" do
136
+ expect(subject.node).to be_a(Chef::Node)
137
+ end
138
+
139
+ it "defines a #runner method that returns self" do
140
+ expect(subject.node.methods).to include(:runner)
141
+ expect(subject.node.runner).to be(subject)
142
+ end
143
+
144
+ it "allows attributes to be set on the node" do
145
+ subject.node.normal["bacon"] = "ham"
146
+ expect(subject.node.bacon).to eq("ham")
147
+ end
148
+ end
149
+
150
+ describe "#to_s" do
151
+ it "overrides the default string representation to something readable" do
152
+ expect(subject.converge("apache2::default").to_s)
153
+ .to eq("#<ChefSpec::SoloRunner run_list: [recipe[apache2::default]]>")
154
+ end
155
+
156
+ it "is ok when a convergence has not yet taken place" do
157
+ expect(subject.to_s).to eq("#<ChefSpec::SoloRunner run_list: []>")
158
+ end
159
+
160
+ it "includes the entire run_list" do
161
+ expect(subject.converge("apache2::default", "apache2::mod_ssl").to_s)
162
+ .to eq("#<ChefSpec::SoloRunner run_list: [recipe[apache2::default], recipe[apache2::mod_ssl]]>")
163
+ end
164
+
165
+ it "has the run_list only for the last convergence" do
166
+ ["mysql::client", "mysql::server"].each { |recipe| subject.converge(recipe) }
167
+ expect(subject.to_s)
168
+ .to eq("#<ChefSpec::SoloRunner run_list: [recipe[mysql::server]]>")
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe ChefSpec::Stubs::CommandRegistry do
4
+ before { described_class.reset! }
5
+
6
+ it "inherits from Registry" do
7
+ expect(described_class.superclass).to be(ChefSpec::Stubs::Registry)
8
+ end
9
+
10
+ describe "#stub_for" do
11
+ it "finds a stub by name" do
12
+ command = double("command", command: "test -f /var/www")
13
+ described_class.register(command)
14
+ expect(described_class.stub_for("test -f /var/www")).to eq(command)
15
+ end
16
+
17
+ it "finds a stub by regex" do
18
+ command = double("command", command: /test -f (.+)/)
19
+ described_class.register(command)
20
+ expect(described_class.stub_for("test -f /var/www")).to eq(command)
21
+ end
22
+
23
+ it "returns nil when no commands are matched" do
24
+ expect(described_class.stub_for("which a2ensite")).to eq(nil)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,61 @@
1
+ require "spec_helper"
2
+
3
+ describe ChefSpec::Stubs::CommandStub do
4
+ describe "#initialize" do
5
+ it "sets the command and block" do
6
+ block = Proc.new {}
7
+ stub = described_class.new("command", &block)
8
+
9
+ expect(stub.command).to eq("command")
10
+ expect(stub.block).to eq(block)
11
+ end
12
+ end
13
+
14
+ describe "#and_return" do
15
+ subject { described_class.new("command").and_return("value") }
16
+
17
+ it "sets the value" do
18
+ expect(subject.value).to eq("value")
19
+ end
20
+
21
+ it "returns an instance of the stub" do
22
+ expect(subject.and_return("value")).to be(subject)
23
+ end
24
+ end
25
+
26
+ describe "#result" do
27
+ context "when a value is given" do
28
+ subject { described_class.new("command").and_return("value") }
29
+
30
+ it "returns the value" do
31
+ expect(subject.result).to eq("value")
32
+ end
33
+ end
34
+
35
+ context "when a block is given" do
36
+ subject { described_class.new("command") { 1 == 2 } }
37
+
38
+ it "calls the block" do
39
+ expect(subject.result).to eq(false)
40
+ end
41
+ end
42
+ end
43
+
44
+ describe "#signature" do
45
+ context "when a value is given" do
46
+ subject { described_class.new("command").and_return(false) }
47
+
48
+ it "includes the value" do
49
+ expect(subject.signature).to eq('stub_command("command").and_return(false)')
50
+ end
51
+ end
52
+
53
+ context "when a block is given" do
54
+ subject { described_class.new("command") { 1 == 2 } }
55
+
56
+ it "includes a comment about the block" do
57
+ expect(subject.signature).to eq('stub_command("command") { # Ruby code }')
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe ChefSpec::Stubs::DataBagItemRegistry do
4
+ before { described_class.reset! }
5
+
6
+ it "inherits from Registry" do
7
+ expect(described_class.superclass).to be(ChefSpec::Stubs::Registry)
8
+ end
9
+
10
+ describe "#stub_for" do
11
+ it "finds a stub by name" do
12
+ search = double("search", bag: "users", id: "svargo")
13
+ described_class.register(search)
14
+ expect(described_class.stub_for("users", "svargo")).to eq(search)
15
+ end
16
+
17
+ it "finds a stub by Regex" do
18
+ search = double("search", bag: "users", id: /sv(.+)/)
19
+ described_class.register(search)
20
+ expect(described_class.stub_for("users", "svargo")).to eq(search)
21
+ end
22
+
23
+ it "matches when the bag is a Symbol" do
24
+ search = double("search", bag: :users, id: "svargo")
25
+ described_class.register(search)
26
+ expect(described_class.stub_for("users", "svargo")).to eq(search)
27
+ end
28
+
29
+ it "matches when the stub is a Symbol" do
30
+ search = double("search", bag: "users", id: "svargo")
31
+ described_class.register(search)
32
+ expect(described_class.stub_for(:users, "svargo")).to eq(search)
33
+ end
34
+
35
+ it "returns nil when no searches are matched" do
36
+ expect(described_class.stub_for("users", "svargo")).to eq(nil)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,36 @@
1
+ require "spec_helper"
2
+
3
+ describe ChefSpec::Stubs::DataBagItemStub do
4
+ it "inherts from Stub" do
5
+ expect(described_class.superclass).to be(ChefSpec::Stubs::Stub)
6
+ end
7
+
8
+ describe "#initialize" do
9
+ it "sets the bag, id, and block" do
10
+ block = Proc.new {}
11
+ stub = described_class.new("bag", "id", &block)
12
+
13
+ expect(stub.bag).to eq("bag")
14
+ expect(stub.id).to eq("id")
15
+ expect(stub.block).to eq(block)
16
+ end
17
+ end
18
+
19
+ describe "#signature" do
20
+ context "when a value is given" do
21
+ subject { described_class.new("bag", "id").and_return(false) }
22
+
23
+ it "includes the value" do
24
+ expect(subject.signature).to eq('stub_data_bag_item("bag", "id").and_return(false)')
25
+ end
26
+ end
27
+
28
+ context "when a block is given" do
29
+ subject { described_class.new("bag", "id") { 1 == 2 } }
30
+
31
+ it "includes a comment about the block" do
32
+ expect(subject.signature).to eq('stub_data_bag_item("bag", "id") { # Ruby code }')
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe ChefSpec::Stubs::DataBagRegistry do
4
+ before { described_class.reset! }
5
+
6
+ it "inherits from Registry" do
7
+ expect(described_class.superclass).to be(ChefSpec::Stubs::Registry)
8
+ end
9
+
10
+ describe "#stub_for" do
11
+ it "finds a stub by name" do
12
+ search = double("search", bag: "users")
13
+ described_class.register(search)
14
+ expect(described_class.stub_for("users")).to eq(search)
15
+ end
16
+
17
+ it "finds a stub by Regex" do
18
+ search = double("search", bag: "users")
19
+ described_class.register(search)
20
+ expect(described_class.stub_for("users")).to eq(search)
21
+ end
22
+
23
+ it "matches when the bag is Symbol" do
24
+ search = double("search", bag: :users)
25
+ described_class.register(search)
26
+ expect(described_class.stub_for("users")).to eq(search)
27
+ end
28
+
29
+ it "matches when the stub is Symbol" do
30
+ search = double("search", bag: "users")
31
+ described_class.register(search)
32
+ expect(described_class.stub_for(:users)).to eq(search)
33
+ end
34
+
35
+ it "returns nil when no searches are matched" do
36
+ expect(described_class.stub_for("users")).to eq(nil)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+
3
+ describe ChefSpec::Stubs::DataBagStub do
4
+ it "inherts from Stub" do
5
+ expect(described_class.superclass).to be(ChefSpec::Stubs::Stub)
6
+ end
7
+
8
+ describe "#initialize" do
9
+ it "sets the bag and block" do
10
+ block = Proc.new {}
11
+ stub = described_class.new("bag", &block)
12
+
13
+ expect(stub.bag).to eq("bag")
14
+ expect(stub.block).to eq(block)
15
+ end
16
+ end
17
+
18
+ describe "#signature" do
19
+ context "when a value is given" do
20
+ subject { described_class.new("bag").and_return(false) }
21
+
22
+ it "includes the value" do
23
+ expect(subject.signature).to eq('stub_data_bag("bag").and_return(false)')
24
+ end
25
+ end
26
+
27
+ context "when a block is given" do
28
+ subject { described_class.new("bag") { 1 == 2 } }
29
+
30
+ it "includes a comment about the block" do
31
+ expect(subject.signature).to eq('stub_data_bag("bag") { # Ruby code }')
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+
3
+ describe ChefSpec::Stubs::Registry do
4
+ before { described_class.reset! }
5
+
6
+ describe "#reset!" do
7
+ it "cleans the list of stubs" do
8
+ described_class.stubs = [1, 2, 3]
9
+ described_class.reset!
10
+
11
+ expect(described_class.stubs).to be_empty
12
+ end
13
+ end
14
+
15
+ describe "#register" do
16
+ it "adds the stub to the registry" do
17
+ described_class.register("bacon")
18
+ expect(described_class.stubs).to include("bacon")
19
+ end
20
+ end
21
+
22
+ describe "#stub_for" do
23
+ it "finds a stub by name" do
24
+ expect {
25
+ described_class.stub_for
26
+ }.to raise_error(ArgumentError)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe ChefSpec::Stubs::SearchRegistry do
4
+ before { described_class.reset! }
5
+
6
+ it "inherits from Registry" do
7
+ expect(described_class.superclass).to be(ChefSpec::Stubs::Registry)
8
+ end
9
+
10
+ describe "#stub_for" do
11
+ it "finds a stub by name" do
12
+ search = double("search", type: "node", query: "*:*")
13
+ described_class.register(search)
14
+ expect(described_class.stub_for("node", "*:*")).to eq(search)
15
+ end
16
+
17
+ it "finds a stub by Regex" do
18
+ search = double("search", type: "node", query: /name:(.+)/)
19
+ described_class.register(search)
20
+ expect(described_class.stub_for("node", "name:example.com")).to eq(search)
21
+ end
22
+
23
+ it "matches when the type is Symbol" do
24
+ search = double("search", type: :node, query: "*:*")
25
+ described_class.register(search)
26
+ expect(described_class.stub_for("node", "*:*")).to eq(search)
27
+ end
28
+
29
+ it "matches when the stub is Symbol" do
30
+ search = double("search", type: "node", query: "*:*")
31
+ described_class.register(search)
32
+ expect(described_class.stub_for(:node, "*:*")).to eq(search)
33
+ end
34
+
35
+ it "returns nil when no searches are matched" do
36
+ expect(described_class.stub_for("node", "name:example.com")).to eq(nil)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,36 @@
1
+ require "spec_helper"
2
+
3
+ describe ChefSpec::Stubs::SearchStub do
4
+ it "inherts from Stub" do
5
+ expect(described_class.superclass).to be(ChefSpec::Stubs::Stub)
6
+ end
7
+
8
+ describe "#initialize" do
9
+ it "sets the type, query, and block" do
10
+ block = Proc.new {}
11
+ stub = described_class.new("type", "query", &block)
12
+
13
+ expect(stub.type).to eq("type")
14
+ expect(stub.query).to eq("query")
15
+ expect(stub.block).to eq(block)
16
+ end
17
+ end
18
+
19
+ describe "#signature" do
20
+ context "when a value is given" do
21
+ subject { described_class.new("type", "query").and_return(false) }
22
+
23
+ it "includes the value" do
24
+ expect(subject.signature).to eq('stub_search("type", "query").and_return(false)')
25
+ end
26
+ end
27
+
28
+ context "when a block is given" do
29
+ subject { described_class.new("type", "query") { 1 == 2 } }
30
+
31
+ it "includes a comment about the block" do
32
+ expect(subject.signature).to eq('stub_search("type", "query") { # Ruby code }')
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,64 @@
1
+ require "spec_helper"
2
+
3
+ describe ChefSpec::Stubs::Stub do
4
+ describe "#and_return" do
5
+ subject { described_class.new.and_return("value") }
6
+
7
+ it "sets the value" do
8
+ expect(subject.value).to eq("value")
9
+ end
10
+
11
+ it "returns an instance of the stub" do
12
+ expect(subject.and_return("value")).to be(subject)
13
+ end
14
+ end
15
+
16
+ describe "#and_raise" do
17
+ subject { described_class.new.and_raise(ArgumentError) }
18
+
19
+ it "sets the block" do
20
+ expect(subject.instance_variable_get(:@block)).to be_a(Proc)
21
+ end
22
+
23
+ it "returns an instance of the stub" do
24
+ expect(subject.and_raise(ArgumentError)).to be(subject)
25
+ end
26
+ end
27
+
28
+ describe "#result" do
29
+ context "when a value is given" do
30
+ subject { described_class.new.and_return("value") }
31
+
32
+ it "returns the value" do
33
+ expect(subject.result).to eq("value")
34
+ end
35
+ end
36
+
37
+ context "when a block is given" do
38
+ subject { described_class.new }
39
+
40
+ it "calls the block" do
41
+ subject.instance_variable_set(:@block, Proc.new { 1 == 2 })
42
+ expect(subject.result).to eq(false)
43
+ end
44
+ end
45
+
46
+ context "when an exception block is given" do
47
+ subject { described_class.new.and_raise(ArgumentError) }
48
+
49
+ it "raises the exception" do
50
+ expect {
51
+ subject.result
52
+ }.to raise_error(ArgumentError)
53
+ end
54
+ end
55
+
56
+ context "when the value is a Hash" do
57
+ subject { described_class.new.and_return([ { name: "a" } ]) }
58
+
59
+ it "recursively mashifies the value" do
60
+ expect(subject.result.first).to be_a(Mash)
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,22 @@
1
+
2
+ <% if @total == 0 %>
3
+ No Chef resources found, skipping coverage calculation...
4
+ <% else %>
5
+ ChefSpec Coverage report generated...
6
+
7
+ Total Resources: <%= @total %>
8
+ Touched Resources: <%= @touched %>
9
+ Touch Coverage: <%= @coverage %>%
10
+
11
+ <% if @untouched_resources.empty? %>
12
+ You are awesome and so is your test coverage! Have a fantastic day!
13
+
14
+ <% else %>
15
+ Untouched Resources:
16
+
17
+ <% @untouched_resources.each do |resource| %>
18
+ <%= resource.to_s.ljust(32) %> <%= resource.source_file %>:<%= resource.source_line %>
19
+ <% end %>
20
+
21
+ <% end %>
22
+ <% end %>
@@ -0,0 +1,8 @@
1
+ { "resources":[
2
+ <%= @all_resources.map { |resource| resource.to_json }.join(",\n") %>
3
+ ],
4
+ "resource_count": <%= @total %>,
5
+ "resources_touched": <%= @touched %>,
6
+ "resource_coverage": <%= @coverage %>
7
+
8
+ }
@@ -0,0 +1,14 @@
1
+ <%='Touched'.to_s.ljust(8) %> <%='Resource'.to_s.ljust(48) %> File:Line
2
+ <% @all_resources.each do |resource| %>
3
+ <%=resource.touched?.to_s.ljust(8) %> <%= resource.to_s.ljust(48) %> <%= resource.source_file %>:<%= resource.source_line %>
4
+ <% end %>
5
+
6
+ <% if @total == 0 %>
7
+ No Chef resources found, skipping coverage calculation...
8
+ <% else %>
9
+ ChefSpec Coverage report generated...
10
+
11
+ Total Resources: <%= @total %>
12
+ Touched Resources: <%= @touched %>
13
+ Touch Coverage: <%= @coverage %>%
14
+ <% end %>
@@ -0,0 +1,3 @@
1
+ I could not find or infer a cookbook_path from your current working directory.
2
+ Please make sure you put your specs (tests) under a directory named 'spec' or
3
+ manually set the cookbook path in the RSpec configuration.
@@ -0,0 +1,5 @@
1
+ An Error occured during parsing the Erb Given.
2
+
3
+ Here is the original error:
4
+
5
+ <%= @original_error %>
@@ -0,0 +1,7 @@
1
+ I could not load the '<%= @name %>' gem! You must have the gem installed
2
+ on your local system before you can use the <%= @gem %> plugin.
3
+ You can install <%= @gem %> by running:
4
+
5
+ gem install <%= @gem %>
6
+
7
+ or add <%= @name %> to your Gemfile and run the `bundle` command to install.
@@ -0,0 +1,4 @@
1
+ The currently configured value for `berkshelf_options` appears to be invalid.
2
+ This attribute must be a Ruby hash with symbol keys. The current value is:
3
+
4
+ <%= @value %>