summaryrefslogtreecommitdiff
path: root/spec/unit/run_status_spec.rb
blob: 60717fb3a8b57adfad73c5c0ef9871c7d8b8a263 (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
#
# Author:: Daniel DeLeo (<dan@chef.io>)
# Copyright:: Copyright 2010-2016, Chef Software 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"

describe Chef::RunStatus do
  before do
    @node = Chef::Node.new
    @events = Chef::EventDispatch::Dispatcher.new
    @run_context = Chef::RunContext.new(@node, {}, @events)
    @run_status = Chef::RunStatus.new(@node, @events)
  end

  describe "before the run context has been set" do
    it "converts to a hash" do
      @run_status.to_hash
    end
  end

  describe "when the run context has been set" do
    before do
      @run_status.run_context = @run_context
    end

    it "has a run context" do
      expect(@run_status.run_context).to equal(@run_context)
    end

    it "provides access to the run context's node" do
      expect(@run_status.node).to equal(@node)
    end

    it "converts to a hash" do
      expect(@run_status.to_hash[:node]).to equal(@node)
      expect(@run_status.to_hash[:success]).to be_truthy
    end

    describe "after it has recorded timing information" do
      before do
        @start_time = Time.new
        @end_time = @start_time + 23
        allow(Time).to receive(:now).and_return(@start_time, @end_time)
        @run_status.start_clock
        @run_status.stop_clock
      end

      it "records the start time of the run" do
        expect(@run_status.start_time).to eq(@start_time)
      end

      it "records the end time of the run" do
        expect(@run_status.end_time).to eq(@end_time)
      end

      it "gives the elapsed time of the chef run" do
        expect(@run_status.elapsed_time).to eq(23)
      end

      it "includes timing information in its hash form" do
        expect(@run_status.to_hash[:start_time]).to eq(@start_time)
        expect(@run_status.to_hash[:end_time]).to eq(@end_time)
        expect(@run_status.to_hash[:elapsed_time]).to eq(23)
      end

    end

    describe "with resources in the resource_collection" do
      before do
        @all_resources = [Chef::Resource::Cat.new("whiskers"), Chef::Resource::ZenMaster.new("dtz")]
        @run_context.resource_collection.all_resources.replace(@all_resources)
      end

      it "lists all resources" do
        expect(@run_status.all_resources).to eq(@all_resources)
      end

      it "has no updated resources" do
        expect(@run_status.updated_resources).to be_empty
      end

      it "includes the list of all resources in its hash form" do
        expect(@run_status.to_hash[:all_resources]).to eq(@all_resources)
        expect(@run_status.to_hash[:updated_resources]).to be_empty
      end

      describe "and some have been updated" do
        before do
          @all_resources.first.updated_by_last_action true
        end

        it "lists the updated resources" do
          expect(@run_status.updated_resources).to eq([@all_resources.first])
        end

        it "includes the list of updated resources in its hash form" do
          expect(@run_status.to_hash[:updated_resources]).to eq([@all_resources.first])
        end
      end
    end

    describe "when the run failed" do
      before do
        @exception = Exception.new("just testing")
        @backtrace = caller
        @exception.set_backtrace(@backtrace)
        @run_status.exception = @exception
      end

      it "stores the exception" do
        expect(@run_status.exception).to equal(@exception)
      end

      it "stores the backtrace" do
        expect(@run_status.backtrace).to eq(@backtrace)
      end

      it "says the run was not successful" do
        expect(@run_status.success?).to be_falsey
        expect(@run_status.failed?).to be_truthy
      end

      it "converts to a hash including the exception information" do
        expect(@run_status.to_hash[:success]).to be_falsey
        expect(@run_status.to_hash[:exception]).to eq("Exception: just testing")
        expect(@run_status.to_hash[:backtrace]).to eq(@backtrace)
      end
    end
  end
end