1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
#
# Author:: Serdar Sutay (<serdar@opscode.com>)
# Copyright:: Copyright 2013-2016, Opscode, Inc.
# License:: Apache License, Version 2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require "spec_helper"
require "chef/deprecation/warnings"
describe Chef::Deprecation do
# Support code for Chef::Deprecation
def self.class_from_string(str)
str.split("::").inject(Object) do |mod, class_name|
mod.const_get(class_name)
end
end
module DeprecatedMethods
def deprecated_method(value)
@value = value
end
def get_value
@value
end
end
class TestClass
extend Chef::Deprecation::Warnings
include DeprecatedMethods
add_deprecation_warnings_for(DeprecatedMethods.instance_methods)
end
method_snapshot_file = File.join(CHEF_SPEC_DATA, "file-providers-method-snapshot-chef-11-4.json")
method_snapshot = Chef::JSONCompat.parse(File.open(method_snapshot_file).read())
method_snapshot.each do |class_name, old_methods|
class_object = class_from_string(class_name)
current_methods = class_object.public_instance_methods.map(&:to_sym)
it "defines all methods on #{class_object} that were available in 11.0" do
old_methods.each do |old_method|
expect(current_methods).to include(old_method.to_sym)
end
end
end
context "when Chef::Config[:treat_deprecation_warnings_as_errors] is off" do
before do
Chef::Config[:treat_deprecation_warnings_as_errors] = false
end
context "deprecation warning messages" do
RSpec::Matchers.define_negated_matcher :a_non_empty_array, :be_empty
it "should be enabled for deprecated methods" do
expect(Chef::Log).to receive(:warn).with(a_non_empty_array)
TestClass.new.deprecated_method(10)
end
it "should contain stack trace" do
expect(Chef::Log).to receive(:warn).with(a_string_including(".rb"))
TestClass.new.deprecated_method(10)
end
end
it "deprecated methods should still be called" do
test_instance = TestClass.new
test_instance.deprecated_method(10)
expect(test_instance.get_value).to eq(10)
end
end
it "should raise when deprecation warnings are treated as errors" do
# rspec should set this
expect(Chef::Config[:treat_deprecation_warnings_as_errors]).to be true
test_instance = TestClass.new
expect { test_instance.deprecated_method(10) }.to raise_error(Chef::Exceptions::DeprecatedFeatureError)
end
context "When a class has deprecated_attr, _reader and _writer" do
before(:context) do
class DeprecatedAttrTest
extend Chef::Mixin::Deprecation
def initialize
@a = @r = @w = 1
end
deprecated_attr :a, "a"
deprecated_attr_reader :r, "r"
deprecated_attr_writer :w, "w"
end
end
it "The deprecated_attr emits warnings" do
test = DeprecatedAttrTest.new
expect { test.a = 10 }.to raise_error(Chef::Exceptions::DeprecatedFeatureError)
expect { test.a }.to raise_error(Chef::Exceptions::DeprecatedFeatureError)
end
it "The deprecated_attr_writer emits warnings, and does not create a reader" do
test = DeprecatedAttrTest.new
expect { test.w = 10 }.to raise_error(Chef::Exceptions::DeprecatedFeatureError)
expect { test.w }.to raise_error(NoMethodError)
end
it "The deprecated_attr_reader emits warnings, and does not create a writer" do
test = DeprecatedAttrTest.new
expect { test.r = 10 }.to raise_error(NoMethodError)
expect { test.r }.to raise_error(Chef::Exceptions::DeprecatedFeatureError)
end
context "With deprecation warnings not throwing exceptions" do
before do
Chef::Config[:treat_deprecation_warnings_as_errors] = false
end
it "The deprecated_attr can be written to and read from" do
test = DeprecatedAttrTest.new
test.a = 10
expect(test.a).to eq 10
end
it "The deprecated_attr_reader can be read from" do
test = DeprecatedAttrTest.new
expect(test.r).to eq 1
end
it "The deprecated_attr_writer can be written to" do
test = DeprecatedAttrTest.new
test.w = 10
expect(test.instance_eval { @w }).to eq 10
end
end
end
end
|