File: ldap_spec.rb

package info (click to toggle)
puppet 5.5.22-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 21,316 kB
  • sloc: ruby: 254,925; sh: 1,608; xml: 219; makefile: 153; sql: 103
file content (151 lines) | stat: -rw-r--r-- 5,267 bytes parent folder | download
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
require 'spec_helper'

require 'puppet/indirector/ldap'

describe Puppet::Indirector::Ldap do
  before do
    @indirection = double('indirection', :name => :testing)
    allow(Puppet::Indirector::Indirection).to receive(:instance).and_return(@indirection)
    module Testing; end
    @ldap_class = class Testing::MyLdap < Puppet::Indirector::Ldap
      self
    end

    @connection = double('ldap')
  end

  describe "when instantiating ldap" do
    it "should be deprecated" do
      expect(Puppet).to receive(:deprecation_warning).with("Puppet::Indirector::Ldap is deprecated and will be removed in a future release of Puppet.")

      @ldap_class.new
    end

    it "should not emit a deprecation warning when they are disabled" do
      expect(Puppet).not_to receive(:warning).with(/Puppet::Indirector::Ldap is deprecated/)
      Puppet[:disable_warnings] = ['deprecations']

      @ldap_class.new
    end

    it "should only emit the deprecation warning once" do
      expect(Puppet).to receive(:warning).with(/Puppet::Indirector::Ldap is deprecated/).once

      @ldap_class.new
      @ldap_class.new
    end
  end

  describe "when searching ldap" do
    before do
      @searcher = @ldap_class.new
      # Stub everything, and we can selectively replace with an expect as
      # we need to for testing.
      allow(@searcher).to receive(:connection).and_return(@connection)
      allow(@searcher).to receive(:search_filter).and_return(:filter)
      allow(@searcher).to receive(:search_base).and_return(:base)
      allow(@searcher).to receive(:process)

      @request = double('request', :key => "yay")
    end

    it "should call the ldapsearch method with the search filter" do
      expect(@searcher).to receive(:search_filter).with("yay").and_return("yay's filter")
      expect(@searcher).to receive(:ldapsearch).with("yay's filter")
      @searcher.find @request
    end

    it "should fail if no block is passed to the ldapsearch method" do
      expect { @searcher.ldapsearch("blah") }.to raise_error(ArgumentError)
    end

    it "should use the results of the ldapbase method as the ldap search base" do
      allow(@searcher).to receive(:search_base).and_return("mybase")
      expect(@connection).to receive(:search).with("mybase", anything, anything, anything)

      @searcher.find @request
    end

    it "should default to the value of the :search_base setting as the result of the ldapbase method" do
      Puppet[:ldapbase] = "myldapbase"
      searcher = @ldap_class.new
      expect(searcher.search_base).to eq("myldapbase")
    end

    it "should use the results of the :search_attributes method as the list of attributes to return" do
      allow(@searcher).to receive(:search_attributes).and_return(:myattrs)
      expect(@connection).to receive(:search).with(anything, anything, anything, :myattrs)

      @searcher.find @request
    end

    it "should use depth 2 when searching" do
      expect(@connection).to receive(:search).with(anything, 2, anything, anything)

      @searcher.find @request
    end

    it "should call process() on the first found entry" do
      expect(@connection).to receive(:search).and_yield("myresult")
      expect(@searcher).to receive(:process).with("myresult")
      @searcher.find @request
    end

    it "should reconnect and retry the search if there is a failure" do
      run = false
      allow(@connection).to receive(:search) do |*args|
        if run
          true
        else
          run = true
          raise "failed"
        end
      end.and_yield("myresult")
      expect(@searcher).to receive(:process).with("myresult")

      @searcher.find @request
    end

    it "should not reconnect on failure more than once" do
      count = 0
      allow(@connection).to receive(:search) do |*_|
        count += 1
        raise ArgumentError, "yay"
      end
      expect { @searcher.find(@request) }.to raise_error(Puppet::Error)
      expect(count).to eq(2)
    end

    it "should return true if an entry is found" do
      expect(@connection).to receive(:search).and_yield("result")
      expect(@searcher.ldapsearch("whatever") { |r| }).to be_truthy
    end
  end

  describe "when connecting to ldap", :if => Puppet.features.ldap? do
    it "should create and start a Util::Ldap::Connection instance" do
      conn = double('connection', :connection => "myconn", :start => nil)
      expect(Puppet::Util::Ldap::Connection).to receive(:instance).and_return(conn)

      expect(@searcher.connection).to eq("myconn")
    end

    it "should only create the ldap connection when asked for it the first time" do
      conn = double('connection', :connection => "myconn", :start => nil)
      expect(Puppet::Util::Ldap::Connection).to receive(:instance).and_return(conn)

      @searcher.connection
    end

    it "should cache the connection" do
      conn = double('connection', :connection => "myconn", :start => nil)
      expect(Puppet::Util::Ldap::Connection).to receive(:instance).and_return(conn)

      expect(@searcher.connection).to equal(@searcher.connection)
    end
  end

  describe "when reconnecting to ldap", :if => (Puppet.features.root? and Facter.value("hostname") == "culain") do
    it "should reconnect to ldap when connections are lost"
  end
end