summaryrefslogtreecommitdiff
path: root/spec/unit/puppet/provider/file_line/ruby_spec.rb
blob: 648c05b4369a0da5f5f857e22d0980f2f1c26ec1 (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
154
155
156
157
158
159
160
require 'puppet'
require 'tempfile'
provider_class = Puppet::Type.type(:file_line).provider(:ruby)
describe provider_class do
  context "when adding" do
    before :each do
      # TODO: these should be ported over to use the PuppetLabs spec_helper
      #  file fixtures once the following pull request has been merged:
      # https://github.com/puppetlabs/puppetlabs-stdlib/pull/73/files
      tmp = Tempfile.new('tmp')
      @tmpfile = tmp.path
      tmp.close!
      @resource = Puppet::Type::File_line.new(
        {:name => 'foo', :path => @tmpfile, :line => 'foo'}
      )
      @provider = provider_class.new(@resource)
    end
    it 'should detect if the line exists in the file' do
      File.open(@tmpfile, 'w') do |fh|
        fh.write('foo')
      end
      @provider.exists?.should be_true
    end
    it 'should detect if the line does not exist in the file' do
      File.open(@tmpfile, 'w') do |fh|
        fh.write('foo1')
      end
      @provider.exists?.should be_nil
    end
    it 'should append to an existing file when creating' do
      @provider.create
      File.read(@tmpfile).chomp.should == 'foo'
    end
  end

  context "when matching" do
    before :each do
      # TODO: these should be ported over to use the PuppetLabs spec_helper
      #  file fixtures once the following pull request has been merged:
      # https://github.com/puppetlabs/puppetlabs-stdlib/pull/73/files
      tmp = Tempfile.new('tmp')
      @tmpfile = tmp.path
      tmp.close!
      @resource = Puppet::Type::File_line.new(
          {
           :name => 'foo',
           :path => @tmpfile,
           :line => 'foo = bar',
           :match => '^foo\s*=.*$',
          }
      )
      @provider = provider_class.new(@resource)
    end

    it 'should raise an error if more than one line matches, and should not have modified the file' do
      File.open(@tmpfile, 'w') do |fh|
        fh.write("foo1\nfoo=blah\nfoo2\nfoo=baz")
      end
      @provider.exists?.should be_nil
      expect { @provider.create }.to raise_error(Puppet::Error, /More than one line.*matches/)
      File.read(@tmpfile).should eql("foo1\nfoo=blah\nfoo2\nfoo=baz")
    end

    it 'should replace all lines that matches' do
      @resource = Puppet::Type::File_line.new(
          {
           :name => 'foo',
           :path => @tmpfile,
           :line => 'foo = bar',
           :match => '^foo\s*=.*$',
           :multiple => true
          }
      )
      @provider = provider_class.new(@resource)
      File.open(@tmpfile, 'w') do |fh|
        fh.write("foo1\nfoo=blah\nfoo2\nfoo=baz")
      end
      @provider.exists?.should be_nil
      @provider.create
      File.read(@tmpfile).chomp.should eql("foo1\nfoo = bar\nfoo2\nfoo = bar")
    end

    it 'should raise an error with invalid values' do
      expect {
        @resource = Puppet::Type::File_line.new(
          {
           :name => 'foo',
           :path => @tmpfile,
           :line => 'foo = bar',
           :match => '^foo\s*=.*$',
           :multiple => 'asgadga'
          }
        )
      }.to raise_error(Puppet::Error, /Invalid value "asgadga"\. Valid values are true, false\./)
    end

    it 'should replace a line that matches' do
      File.open(@tmpfile, 'w') do |fh|
        fh.write("foo1\nfoo=blah\nfoo2")
      end
      @provider.exists?.should be_nil
      @provider.create
      File.read(@tmpfile).chomp.should eql("foo1\nfoo = bar\nfoo2")
    end
    it 'should add a new line if no lines match' do
      File.open(@tmpfile, 'w') do |fh|
        fh.write("foo1\nfoo2")
      end
      @provider.exists?.should be_nil
      @provider.create
      File.read(@tmpfile).should eql("foo1\nfoo2\nfoo = bar\n")
    end
    it 'should do nothing if the exact line already exists' do
      File.open(@tmpfile, 'w') do |fh|
        fh.write("foo1\nfoo = bar\nfoo2")
      end
      @provider.exists?.should be_true
      @provider.create
      File.read(@tmpfile).chomp.should eql("foo1\nfoo = bar\nfoo2")
    end
  end

  context "when removing" do
    before :each do
      # TODO: these should be ported over to use the PuppetLabs spec_helper
      #  file fixtures once the following pull request has been merged:
      # https://github.com/puppetlabs/puppetlabs-stdlib/pull/73/files
      tmp = Tempfile.new('tmp')
      @tmpfile = tmp.path
      tmp.close!
      @resource = Puppet::Type::File_line.new(
        {:name => 'foo', :path => @tmpfile, :line => 'foo', :ensure => 'absent' }
      )
      @provider = provider_class.new(@resource)
    end
    it 'should remove the line if it exists' do
      File.open(@tmpfile, 'w') do |fh|
        fh.write("foo1\nfoo\nfoo2")
      end
      @provider.destroy
      File.read(@tmpfile).should eql("foo1\nfoo2")
    end

    it 'should remove the line without touching the last new line' do
      File.open(@tmpfile, 'w') do |fh|
        fh.write("foo1\nfoo\nfoo2\n")
      end
      @provider.destroy
      File.read(@tmpfile).should eql("foo1\nfoo2\n")
    end

    it 'should remove any occurence of the line' do
      File.open(@tmpfile, 'w') do |fh|
        fh.write("foo1\nfoo\nfoo2\nfoo\nfoo")
      end
      @provider.destroy
      File.read(@tmpfile).should eql("foo1\nfoo2\n")
    end
  end
end