summaryrefslogtreecommitdiff
path: root/spec/unit/deprecation_spec.rb
blob: 2e1f3c39f33c3024de2fb88003fa74af1e6a6bca (plain)
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
151
152
153
#
# Author:: Serdar Sutay (<serdar@opscode.com>)
# Copyright:: Copyright (c) 2013 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
      before(:each) do
        @warning_output = [ ]
        allow(Chef::Log).to receive(:warn) { |msg| @warning_output << msg }
      end

      it 'should be enabled for deprecated methods' do
        TestClass.new.deprecated_method(10)
        expect(@warning_output).not_to be_empty
      end

      it 'should contain stack trace' do
        TestClass.new.deprecated_method(10)
        expect(@warning_output.join("").include?(".rb")).to be_truthy
      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