chefspec 9.2.1 → 9.3.0
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 +4 -4
- data/Gemfile +16 -9
- data/Rakefile +60 -52
- data/chefspec.gemspec +20 -20
- data/lib/chefspec.rb +29 -29
- data/lib/chefspec/api.rb +14 -14
- data/lib/chefspec/api/core.rb +3 -3
- data/lib/chefspec/api/described.rb +3 -5
- data/lib/chefspec/api/stubs.rb +2 -2
- data/lib/chefspec/api/stubs_for.rb +12 -12
- data/lib/chefspec/berkshelf.rb +4 -4
- data/lib/chefspec/cacher.rb +2 -2
- data/lib/chefspec/coverage.rb +35 -40
- data/lib/chefspec/coverage/filters.rb +18 -15
- data/lib/chefspec/deprecations.rb +3 -3
- data/lib/chefspec/errors.rb +7 -7
- data/lib/chefspec/expect_exception.rb +2 -1
- data/lib/chefspec/extensions.rb +14 -14
- data/lib/chefspec/extensions/chef/client.rb +3 -3
- data/lib/chefspec/extensions/chef/conditional.rb +2 -1
- data/lib/chefspec/extensions/chef/cookbook/gem_installer.rb +5 -4
- data/lib/chefspec/extensions/chef/cookbook_loader.rb +1 -0
- data/lib/chefspec/extensions/chef/cookbook_uploader.rb +1 -1
- data/lib/chefspec/extensions/chef/data_query.rb +3 -3
- data/lib/chefspec/extensions/chef/lwrp_base.rb +1 -0
- data/lib/chefspec/extensions/chef/provider.rb +8 -5
- data/lib/chefspec/extensions/chef/resource.rb +14 -9
- data/lib/chefspec/extensions/chef/resource/freebsd_package.rb +2 -1
- data/lib/chefspec/extensions/chef/run_context/cookbook_compiler.rb +12 -1
- data/lib/chefspec/extensions/chef/securable.rb +1 -1
- data/lib/chefspec/extensions/ohai/system.rb +1 -1
- data/lib/chefspec/file_cache_path_proxy.rb +3 -3
- data/lib/chefspec/formatter.rb +3 -3
- data/lib/chefspec/librarian.rb +7 -6
- data/lib/chefspec/matchers.rb +9 -9
- data/lib/chefspec/matchers/do_nothing_matcher.rb +15 -15
- data/lib/chefspec/matchers/include_any_recipe_matcher.rb +4 -4
- data/lib/chefspec/matchers/include_recipe_matcher.rb +1 -1
- data/lib/chefspec/matchers/link_to_matcher.rb +2 -2
- data/lib/chefspec/matchers/notifications_matcher.rb +5 -4
- data/lib/chefspec/matchers/render_file_matcher.rb +3 -3
- data/lib/chefspec/matchers/resource_matcher.rb +18 -16
- data/lib/chefspec/mixins/normalize.rb +1 -1
- data/lib/chefspec/policyfile.rb +6 -6
- data/lib/chefspec/renderer.rb +4 -4
- data/lib/chefspec/rspec.rb +1 -1
- data/lib/chefspec/server.rb +1 -1
- data/lib/chefspec/server_methods.rb +8 -8
- data/lib/chefspec/server_runner.rb +10 -10
- data/lib/chefspec/solo_runner.rb +26 -24
- data/lib/chefspec/stubs/command_registry.rb +1 -1
- data/lib/chefspec/stubs/command_stub.rb +1 -1
- data/lib/chefspec/stubs/data_bag_item_registry.rb +1 -1
- data/lib/chefspec/stubs/data_bag_item_stub.rb +1 -1
- data/lib/chefspec/stubs/data_bag_registry.rb +1 -1
- data/lib/chefspec/stubs/data_bag_stub.rb +1 -1
- data/lib/chefspec/stubs/registry.rb +1 -1
- data/lib/chefspec/stubs/search_registry.rb +2 -2
- data/lib/chefspec/stubs/search_stub.rb +2 -2
- data/lib/chefspec/util.rb +7 -7
- data/lib/chefspec/version.rb +1 -1
- data/lib/chefspec/zero_server.rb +3 -3
- data/spec/spec_helper.rb +3 -4
- data/spec/support/hash.rb +3 -3
- data/spec/unit/cacher_spec.rb +17 -17
- data/spec/unit/coverage/filters_spec.rb +16 -16
- data/spec/unit/deprecations_spec.rb +8 -9
- data/spec/unit/errors_spec.rb +15 -15
- data/spec/unit/expect_exception_spec.rb +9 -9
- data/spec/unit/macros_spec.rb +50 -50
- data/spec/unit/matchers/do_nothing_matcher.rb +1 -1
- data/spec/unit/matchers/include_any_recipe_matcher_spec.rb +23 -23
- data/spec/unit/matchers/include_recipe_matcher_spec.rb +15 -15
- data/spec/unit/matchers/link_to_matcher_spec.rb +18 -18
- data/spec/unit/matchers/notifications_matcher_spec.rb +15 -16
- data/spec/unit/matchers/render_file_matcher_spec.rb +26 -26
- data/spec/unit/matchers/resource_matcher_spec.rb +1 -1
- data/spec/unit/matchers/state_attrs_matcher_spec.rb +24 -24
- data/spec/unit/matchers/subscribes_matcher_spec.rb +27 -29
- data/spec/unit/renderer_spec.rb +36 -36
- data/spec/unit/server_runner_spec.rb +6 -6
- data/spec/unit/solo_runner_spec.rb +69 -69
- data/spec/unit/stubs/command_registry_spec.rb +11 -11
- data/spec/unit/stubs/command_stub_spec.rb +26 -26
- data/spec/unit/stubs/data_bag_item_registry_spec.rb +17 -17
- data/spec/unit/stubs/data_bag_item_stub_spec.rb +14 -14
- data/spec/unit/stubs/data_bag_registry_spec.rb +16 -16
- data/spec/unit/stubs/data_bag_stub_spec.rb +13 -13
- data/spec/unit/stubs/registry_spec.rb +9 -9
- data/spec/unit/stubs/search_registry_spec.rb +17 -17
- data/spec/unit/stubs/search_stub_spec.rb +14 -14
- data/spec/unit/stubs/stub_spec.rb +22 -22
- metadata +6 -6
@@ -1,50 +1,50 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe ChefSpec::Matchers::IncludeAnyRecipeMatcher do
|
4
|
-
let(:node) { double(
|
5
|
-
let(:run_list) { double(
|
4
|
+
let(:node) { double("Chef::Node", run_list: run_list) }
|
5
|
+
let(:run_list) { double("Chef::RunList", run_list_items: run_list_items) }
|
6
6
|
let(:run_list_items) { [run_list_item_one] }
|
7
|
-
let(:run_list_item_one) { double(
|
8
|
-
let(:run_list_item_two) { double(
|
9
|
-
let(:loaded_recipes) { %w
|
10
|
-
let(:chef_run) { double(
|
7
|
+
let(:run_list_item_one) { double("Chef::RunList::RunListItem", name: "one") }
|
8
|
+
let(:run_list_item_two) { double("Chef::RunList::RunListItem", name: "two") }
|
9
|
+
let(:loaded_recipes) { %w{one} }
|
10
|
+
let(:chef_run) { double("chef run", run_context: { loaded_recipes: loaded_recipes, node: node }) }
|
11
11
|
|
12
12
|
subject { described_class.new }
|
13
13
|
|
14
|
-
describe
|
15
|
-
it
|
14
|
+
describe "#failure_message" do
|
15
|
+
it "has the right value" do
|
16
16
|
subject.matches?(chef_run)
|
17
|
-
expect(subject.failure_message).to eq(
|
17
|
+
expect(subject.failure_message).to eq("expected to include any recipe")
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
describe
|
22
|
-
it
|
21
|
+
describe "#failure_message_when_negated" do
|
22
|
+
it "has the right value" do
|
23
23
|
subject.matches?(chef_run)
|
24
|
-
expect(subject.failure_message_when_negated).to eq(
|
24
|
+
expect(subject.failure_message_when_negated).to eq("expected not to include any recipes")
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
describe
|
29
|
-
it
|
28
|
+
describe "#description" do
|
29
|
+
it "has the right value" do
|
30
30
|
subject.matches?(chef_run)
|
31
|
-
expect(subject.description).to eq(
|
31
|
+
expect(subject.description).to eq("include any recipe")
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
describe
|
36
|
-
context
|
37
|
-
let(:loaded_recipes) { %w
|
35
|
+
describe "#matches?" do
|
36
|
+
context "when 0 recipes are included" do
|
37
|
+
let(:loaded_recipes) { %w{one} }
|
38
38
|
|
39
|
-
it
|
39
|
+
it "returns false" do
|
40
40
|
expect(subject.matches?(chef_run)).to be false
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
context
|
45
|
-
let(:loaded_recipes) { %w
|
44
|
+
context "when at least one recipe is included" do
|
45
|
+
let(:loaded_recipes) { %w{one two} }
|
46
46
|
|
47
|
-
it
|
47
|
+
it "returns true" do
|
48
48
|
expect(subject.matches?(chef_run)).to be true
|
49
49
|
end
|
50
50
|
end
|
@@ -1,38 +1,38 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe ChefSpec::Matchers::IncludeRecipeMatcher do
|
4
|
-
let(:chef_run) { double(
|
5
|
-
subject { described_class.new(
|
4
|
+
let(:chef_run) { double("chef run", run_context: { loaded_recipes: %w{one two three} }) }
|
5
|
+
subject { described_class.new("one::default") }
|
6
6
|
|
7
|
-
describe
|
8
|
-
it
|
7
|
+
describe "#failure_message" do
|
8
|
+
it "has the right value" do
|
9
9
|
subject.matches?(chef_run)
|
10
10
|
expect(subject.failure_message)
|
11
|
-
.to eq(%q
|
11
|
+
.to eq(%q{expected ["one::default", "two::default", "three::default"] to include "one::default"})
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
describe
|
16
|
-
it
|
15
|
+
describe "#failure_message_when_negated" do
|
16
|
+
it "has the right value" do
|
17
17
|
subject.matches?(chef_run)
|
18
18
|
expect(subject.failure_message_when_negated)
|
19
|
-
.to eq(%q
|
19
|
+
.to eq(%q{expected "one::default" to not be included})
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
describe
|
24
|
-
it
|
23
|
+
describe "#description" do
|
24
|
+
it "has the right value" do
|
25
25
|
subject.matches?(chef_run)
|
26
|
-
expect(subject.description).to eq(%q
|
26
|
+
expect(subject.description).to eq(%q{include recipe "one::default"})
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
it
|
30
|
+
it "matches when the recipe is included" do
|
31
31
|
expect(subject.matches?(chef_run)).to be_truthy
|
32
32
|
end
|
33
33
|
|
34
|
-
it
|
35
|
-
failure = described_class.new(
|
34
|
+
it "does not match when the recipe is not included" do
|
35
|
+
failure = described_class.new("nope")
|
36
36
|
expect(failure.matches?(chef_run)).to be_falsy
|
37
37
|
end
|
38
38
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe ChefSpec::Matchers::LinkToMatcher do
|
4
|
-
let(:from) {
|
5
|
-
let(:to) {
|
4
|
+
let(:from) { "/var/www" }
|
5
|
+
let(:to) { "/var/html" }
|
6
6
|
let(:link) do
|
7
7
|
Chef::Resource::Link.new(from).tap do |link|
|
8
8
|
link.to(to)
|
@@ -11,44 +11,44 @@ describe ChefSpec::Matchers::LinkToMatcher do
|
|
11
11
|
end
|
12
12
|
subject { described_class.new(to) }
|
13
13
|
|
14
|
-
describe
|
15
|
-
it
|
14
|
+
describe "#failure_message" do
|
15
|
+
it "has the right value" do
|
16
16
|
subject.matches?(link)
|
17
17
|
expect(subject.failure_message)
|
18
|
-
.to eq(%Q
|
18
|
+
.to eq(%Q{expected "link[#{from}]" to link to "#{to}" but was "#{to}"})
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
describe
|
23
|
-
it
|
22
|
+
describe "#failure_message_when_negated" do
|
23
|
+
it "has the right value" do
|
24
24
|
subject.matches?(link)
|
25
25
|
expect(subject.failure_message_when_negated)
|
26
|
-
.to eq(%Q
|
26
|
+
.to eq(%Q{expected "link[#{from}]" to not link to "#{to}"})
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
describe
|
31
|
-
it
|
30
|
+
describe "#description" do
|
31
|
+
it "has the right value" do
|
32
32
|
subject.matches?(link)
|
33
|
-
expect(subject.description).to eq(%Q
|
33
|
+
expect(subject.description).to eq(%Q{link to "#{to}"})
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
context
|
38
|
-
it
|
37
|
+
context "when the link is correct" do
|
38
|
+
it "matches" do
|
39
39
|
expect(subject.matches?(link)).to be_truthy
|
40
40
|
end
|
41
41
|
|
42
|
-
it
|
42
|
+
it "adds the link to the coverage report" do
|
43
43
|
expect(ChefSpec::Coverage).to receive(:cover!).with(link)
|
44
44
|
subject.matches?(link)
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
context
|
49
|
-
subject { described_class.new(
|
48
|
+
context "when the link is not correct" do
|
49
|
+
subject { described_class.new("/nope/bad/path/bro") }
|
50
50
|
|
51
|
-
it
|
51
|
+
it "does not match" do
|
52
52
|
expect(subject.matches?(link)).to be_falsy
|
53
53
|
end
|
54
54
|
end
|
@@ -1,40 +1,39 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe ChefSpec::Matchers::NotificationsMatcher do
|
4
|
-
subject { described_class.new(
|
4
|
+
subject { described_class.new("execute[install]") }
|
5
5
|
let(:package) do
|
6
|
-
double(
|
7
|
-
name:
|
8
|
-
to_s:
|
6
|
+
double("package",
|
7
|
+
name: "package",
|
8
|
+
to_s: "package[foo]",
|
9
9
|
is_a?: true,
|
10
10
|
performed_action?: true,
|
11
11
|
immediate_notifications: [],
|
12
12
|
delayed_notifications: [],
|
13
|
-
before_notifications: []
|
14
|
-
)
|
13
|
+
before_notifications: [])
|
15
14
|
end
|
16
15
|
|
17
|
-
describe
|
18
|
-
it
|
16
|
+
describe "#failure_message" do
|
17
|
+
it "has the right value" do
|
19
18
|
subject.matches?(package)
|
20
19
|
expect(subject.failure_message)
|
21
|
-
.to include
|
20
|
+
.to include %{expected "package[foo]" to notify "execute[install]", but did not.}
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
25
|
-
describe
|
26
|
-
it
|
24
|
+
describe "#failure_message_when_negated" do
|
25
|
+
it "has the right value" do
|
27
26
|
subject.matches?(package)
|
28
27
|
expect(subject.failure_message_when_negated)
|
29
|
-
.to eq
|
28
|
+
.to eq %{expected "package[foo]" to not notify "execute[install]", but it did.}
|
30
29
|
end
|
31
30
|
end
|
32
31
|
|
33
|
-
describe
|
34
|
-
it
|
32
|
+
describe "#description" do
|
33
|
+
it "has the right value" do
|
35
34
|
subject.matches?(package)
|
36
35
|
expect(subject.description)
|
37
|
-
.to eq
|
36
|
+
.to eq %{notify "execute[install]"}
|
38
37
|
end
|
39
38
|
end
|
40
39
|
end
|
@@ -1,67 +1,67 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe ChefSpec::Matchers::RenderFileMatcher do
|
4
|
-
let(:path) {
|
5
|
-
let(:file) { double(
|
6
|
-
let(:chef_run) { double(
|
4
|
+
let(:path) { "/tmp/thing" }
|
5
|
+
let(:file) { double("file", to: path, to_s: "file[#{path}]", performed_action?: true) }
|
6
|
+
let(:chef_run) { double("chef run", find_resource: file) }
|
7
7
|
subject { described_class.new(path) }
|
8
8
|
|
9
|
-
describe
|
10
|
-
it
|
9
|
+
describe "#with_content" do
|
10
|
+
it "accepts do/end syntax" do
|
11
11
|
subject.matches?(chef_run)
|
12
12
|
expect(
|
13
13
|
subject.with_content do |content|
|
14
|
-
|
14
|
+
"Does not raise ArgumentError"
|
15
15
|
end.expected_content.first.call
|
16
|
-
).to eq(
|
16
|
+
).to eq("Does not raise ArgumentError")
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
describe
|
21
|
-
it
|
20
|
+
describe "#failure_message" do
|
21
|
+
it "has the right value" do
|
22
22
|
subject.matches?(chef_run)
|
23
23
|
expect(subject.failure_message)
|
24
|
-
.to eq(%Q
|
24
|
+
.to eq(%Q{expected Chef run to render "#{path}"})
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
describe
|
29
|
-
it
|
28
|
+
describe "#failure_message_when_negated" do
|
29
|
+
it "has the right value" do
|
30
30
|
subject.matches?(chef_run)
|
31
31
|
expect(subject.failure_message_when_negated)
|
32
|
-
.to eq(%Q
|
32
|
+
.to eq(%Q{expected file "#{path}" to not be in Chef run})
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
describe
|
37
|
-
it
|
36
|
+
describe "#description" do
|
37
|
+
it "has the right value" do
|
38
38
|
subject.matches?(chef_run)
|
39
|
-
expect(subject.description).to eq(%Q
|
39
|
+
expect(subject.description).to eq(%Q{render file "#{path}"})
|
40
40
|
end
|
41
41
|
|
42
|
-
it
|
42
|
+
it "has the right value when with_content is chained" do
|
43
43
|
subject.matches?(chef_run)
|
44
44
|
expect(
|
45
|
-
subject.with_content(
|
46
|
-
).to eq(%Q
|
45
|
+
subject.with_content("foo").with_content("bar").description
|
46
|
+
).to eq(%Q{render file "#{path}" with content "foo" with content "bar"})
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
context
|
51
|
-
it
|
50
|
+
context "when the file is correct" do
|
51
|
+
it "matches" do
|
52
52
|
expect(subject.matches?(chef_run)).to be_truthy
|
53
53
|
end
|
54
54
|
|
55
|
-
it
|
55
|
+
it "adds the resource to the coverage report" do
|
56
56
|
expect(ChefSpec::Coverage).to receive(:cover!).with(file)
|
57
57
|
subject.matches?(chef_run)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
-
context
|
62
|
-
it
|
61
|
+
context "when the file is not correct" do
|
62
|
+
it "does not match" do
|
63
63
|
allow(chef_run).to receive(:find_resource).and_return(nil)
|
64
|
-
failure = described_class.new(
|
64
|
+
failure = described_class.new("nope")
|
65
65
|
expect(failure.matches?(chef_run)).to be_falsy
|
66
66
|
end
|
67
67
|
end
|
@@ -1,22 +1,22 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe ChefSpec::Matchers::StateAttrsMatcher do
|
4
|
-
subject { described_class.new(
|
4
|
+
subject { described_class.new(%i{a b}) }
|
5
5
|
|
6
|
-
context
|
6
|
+
context "when the resource does not exist" do
|
7
7
|
let(:resource) { nil }
|
8
8
|
before { subject.matches?(resource) }
|
9
9
|
|
10
|
-
it
|
10
|
+
it "does not match" do
|
11
11
|
expect(subject).to_not be_matches(resource)
|
12
12
|
end
|
13
13
|
|
14
|
-
it
|
15
|
-
expect(subject.description).to eq(
|
14
|
+
it "has the correct description" do
|
15
|
+
expect(subject.description).to eq("have state attributes [:a, :b]")
|
16
16
|
end
|
17
17
|
|
18
|
-
it
|
19
|
-
expect(subject.failure_message).to include <<-EOH.gsub(/^ {8}/,
|
18
|
+
it "has the correct failure message for should" do
|
19
|
+
expect(subject.failure_message).to include <<-EOH.gsub(/^ {8}/, "")
|
20
20
|
expected _something_ to have state attributes, but the _something_ you gave me was nil!
|
21
21
|
Ensure the resource exists before making assertions:
|
22
22
|
|
@@ -24,8 +24,8 @@ describe ChefSpec::Matchers::StateAttrsMatcher do
|
|
24
24
|
EOH
|
25
25
|
end
|
26
26
|
|
27
|
-
it
|
28
|
-
expect(subject.failure_message_when_negated).to include <<-EOH.gsub(/^ {8}/,
|
27
|
+
it "has the correct failure message for should not" do
|
28
|
+
expect(subject.failure_message_when_negated).to include <<-EOH.gsub(/^ {8}/, "")
|
29
29
|
expected _something_ to not have state attributes, but the _something_ you gave me was nil!
|
30
30
|
Ensure the resource exists before making assertions:
|
31
31
|
|
@@ -34,34 +34,34 @@ describe ChefSpec::Matchers::StateAttrsMatcher do
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
context
|
38
|
-
let(:klass) { double(
|
39
|
-
let(:resource) { double(
|
37
|
+
context "when the resource exists" do
|
38
|
+
let(:klass) { double("class", state_attrs: %i{a b}) }
|
39
|
+
let(:resource) { double("resource", class: klass) }
|
40
40
|
before { subject.matches?(resource) }
|
41
41
|
|
42
|
-
it
|
43
|
-
expect(subject.description).to eq(
|
42
|
+
it "has the correct description" do
|
43
|
+
expect(subject.description).to eq("have state attributes [:a, :b]")
|
44
44
|
end
|
45
45
|
|
46
|
-
it
|
47
|
-
expect(subject.failure_message).to eq(
|
46
|
+
it "has the correct failure message for should" do
|
47
|
+
expect(subject.failure_message).to eq("expected [:a, :b] to equal [:a, :b]")
|
48
48
|
end
|
49
49
|
|
50
|
-
it
|
51
|
-
expect(subject.failure_message_when_negated).to eq(
|
50
|
+
it "has the correct failure message for should not" do
|
51
|
+
expect(subject.failure_message_when_negated).to eq("expected [:a, :b] to not equal [:a, :b]")
|
52
52
|
end
|
53
53
|
|
54
|
-
it
|
54
|
+
it "matches when the state attributes are correct" do
|
55
55
|
expect(subject).to be_matches(resource)
|
56
56
|
end
|
57
57
|
|
58
|
-
it
|
59
|
-
allow(klass).to receive(:state_attrs).and_return(
|
58
|
+
it "does not match when the state attributes are incorrect" do
|
59
|
+
allow(klass).to receive(:state_attrs).and_return(%i{c d})
|
60
60
|
expect(subject).to_not be_matches(resource)
|
61
61
|
end
|
62
62
|
|
63
|
-
it
|
64
|
-
allow(klass).to receive(:state_attrs).and_return(
|
63
|
+
it "does not match when partial state attribute are incorrect" do
|
64
|
+
allow(klass).to receive(:state_attrs).and_return(%i{b c})
|
65
65
|
expect(subject).to_not be_matches(resource)
|
66
66
|
end
|
67
67
|
end
|