summaryrefslogtreecommitdiff
path: root/spec/integration/knife/config_get_profile_spec.rb
blob: 1ead66d2dd8809b7e1de3ddf350a48489bd0f70d (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
#
# Copyright 2018, Noah Kantrowitz
#
# 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 "support/shared/integration/integration_helper"
require "support/shared/context/config"

describe "knife config get-profile", :workstation do
  include IntegrationSupport
  include KnifeSupport

  include_context "default config options"
  include_context "with a chef repo"

  let(:cmd_args) { [] }

  subject do
    cmd = knife("config", "get-profile", *cmd_args, instance_filter: lambda { |instance|
      # Fake the failsafe check because this command doesn't actually process knife.rb.
      $__KNIFE_INTEGRATION_FAILSAFE_CHECK << " ole"
    })
    cmd.stdout
  end

  around do |ex|
    # Store and reset the value of some env vars.
    old_chef_home = ENV["CHEF_HOME"]
    old_knife_home = ENV["KNIFE_HOME"]
    old_home = ENV["HOME"]
    old_wd = Dir.pwd
    ChefConfig::PathHelper.per_tool_home_environment = "KNIFE_HOME"
    # Clear these out because they are cached permanently.
    ChefConfig::PathHelper.class_exec { remove_class_variable(:@@home_dir) }
    Chef::Knife::ConfigGetProfile.reset_config_loader!
    begin
      ex.run
    ensure
      ENV["CHEF_HOME"] = old_chef_home
      ENV["KNIFE_HOME"] = old_knife_home
      ENV["HOME"] = old_home
      Dir.chdir(old_wd)
      ENV[ChefHelpers.windows? ? "CD" : "PWD"] = Dir.pwd
      ChefConfig::PathHelper.per_tool_home_environment = nil
    end
  end

  before do
    # Always run from the temp folder. This can't be in the `around` block above
    # because it has to run after the before set in the "with a chef repo" shared context.
    directory("repo")
    Dir.chdir(path_to("repo"))
    ENV[ChefHelpers.windows? ? "CD" : "PWD"] = Dir.pwd
    ENV["HOME"] = path_to(".")
  end

  context "with no configuration" do
    it { is_expected.to eq "default\n" }
  end

  context "with --profile" do
    let(:cmd_args) { %w{--profile production} }
    it { is_expected.to eq "production\n" }
  end

  context "with an environment variable" do
    around do |ex|
      old_chef_profile = ENV["CHEF_PROFILE"]
      begin
        ENV["CHEF_PROFILE"] = "staging"
        ex.run
      ensure
        ENV["CHEF_PROFILE"] = old_chef_profile
      end
    end

    it { is_expected.to eq "staging\n" }
  end

  context "with a context file" do
    before { file(".chef/context", "development\n") }
    it { is_expected.to eq "development\n" }
  end

  context "with a context file under $CHEF_HOME" do
    before do
      file("chefhome/.chef/context", "other\n")
      ENV["CHEF_HOME"] = path_to("chefhome")
    end

    it { is_expected.to eq "other\n" }
  end

  context "with a context file under $KNIFE_HOME" do
    before do
      file("knifehome/.chef/context", "other\n")
      ENV["KNIFE_HOME"] = path_to("knifehome")
    end

    it { is_expected.to eq "other\n" }
  end
end