summaryrefslogtreecommitdiff
path: root/spec/unit/puppet/provider/file_line/ruby_spec.rb
blob: 50f58405d48ba3549f72d509b422ef2ca3888391 (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
require 'spec_helper'
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 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