diff options
Diffstat (limited to 'puppet/modules/stdlib/spec/unit')
12 files changed, 696 insertions, 0 deletions
| diff --git a/puppet/modules/stdlib/spec/unit/facter/facter_dot_d_spec.rb b/puppet/modules/stdlib/spec/unit/facter/facter_dot_d_spec.rb new file mode 100755 index 00000000..0afadb25 --- /dev/null +++ b/puppet/modules/stdlib/spec/unit/facter/facter_dot_d_spec.rb @@ -0,0 +1,32 @@ +#! /usr/bin/env ruby -S rspec +require 'spec_helper' +require 'facter/facter_dot_d' + +describe Facter::Util::DotD do + +  context 'returns a simple fact' do +    before :each do +      Facter.stubs(:version).returns('1.6.1') +      subject.stubs(:entries).returns(['/etc/facter/facts.d/fake_fact.txt']) +      File.stubs(:readlines).with('/etc/facter/facts.d/fake_fact.txt').returns(['fake_fact=fake fact']) +      subject.create +    end + +    it 'should return successfully' do +      expect(Facter.fact(:fake_fact).value).to eq('fake fact') +    end +  end + +  context 'returns a fact with equals signs' do +    before :each do +      Facter.stubs(:version).returns('1.6.1') +      subject.stubs(:entries).returns(['/etc/facter/facts.d/foo.txt']) +      File.stubs(:readlines).with('/etc/facter/facts.d/foo.txt').returns(['foo=1+1=2']) +      subject.create +    end + +    it 'should return successfully' do +      expect(Facter.fact(:foo).value).to eq('1+1=2') +    end +  end +end diff --git a/puppet/modules/stdlib/spec/unit/facter/pe_version_spec.rb b/puppet/modules/stdlib/spec/unit/facter/pe_version_spec.rb new file mode 100755 index 00000000..4d0349e6 --- /dev/null +++ b/puppet/modules/stdlib/spec/unit/facter/pe_version_spec.rb @@ -0,0 +1,76 @@ +#!/usr/bin/env rspec + +require 'spec_helper' + +describe "PE Version specs" do +  before :each do +    # Explicitly load the pe_version.rb file which contains generated facts +    # that cannot be automatically loaded.  Puppet 2.x implements +    # Facter.collection.load while Facter 1.x markes Facter.collection.load as +    # a private method. +    if Facter.collection.respond_to? :load +      Facter.collection.load(:pe_version) +    else +      Facter.collection.loader.load(:pe_version) +    end +  end + +  context "If PE is installed" do +    %w{ 2.6.1 2.10.300 }.each do |version| +      puppetversion = "2.7.19 (Puppet Enterprise #{version})" +      context "puppetversion => #{puppetversion}" do +        before :each do +          Facter.fact(:puppetversion).stubs(:value).returns(puppetversion) +        end + +        (major,minor,patch) = version.split(".") + +        it "Should return true" do +          expect(Facter.fact(:is_pe).value).to eq(true) +        end + +        it "Should have a version of #{version}" do +          expect(Facter.fact(:pe_version).value).to eq(version) +        end + +        it "Should have a major version of #{major}" do +          expect(Facter.fact(:pe_major_version).value).to eq(major) +        end + +        it "Should have a minor version of #{minor}" do +          expect(Facter.fact(:pe_minor_version).value).to eq(minor) +        end + +        it "Should have a patch version of #{patch}" do +          expect(Facter.fact(:pe_patch_version).value).to eq(patch) +        end +      end +    end +  end + +  context "When PE is not installed" do +    before :each do +      Facter.fact(:puppetversion).stubs(:value).returns("2.7.19") +    end + +    it "is_pe is false" do +      expect(Facter.fact(:is_pe).value).to eq(false) +    end + +    it "pe_version is nil" do +      expect(Facter.fact(:pe_version).value).to be_nil +    end + +    it "pe_major_version is nil" do +      expect(Facter.fact(:pe_major_version).value).to be_nil +    end + +    it "pe_minor_version is nil" do +      expect(Facter.fact(:pe_minor_version).value).to be_nil +    end + +    it "Should have a patch version" do +      expect(Facter.fact(:pe_patch_version).value).to be_nil +    end +  end +end diff --git a/puppet/modules/stdlib/spec/unit/facter/root_home_spec.rb b/puppet/modules/stdlib/spec/unit/facter/root_home_spec.rb new file mode 100755 index 00000000..98fe1419 --- /dev/null +++ b/puppet/modules/stdlib/spec/unit/facter/root_home_spec.rb @@ -0,0 +1,52 @@ +#! /usr/bin/env ruby -S rspec +require 'spec_helper' +require 'facter/root_home' + +describe Facter::Util::RootHome do +  context "solaris" do +    let(:root_ent) { "root:x:0:0:Super-User:/:/sbin/sh" } +    let(:expected_root_home) { "/" } + +    it "should return /" do +      Facter::Util::Resolution.expects(:exec).with("getent passwd root").returns(root_ent) +      expect(Facter::Util::RootHome.get_root_home).to eq(expected_root_home) +    end +  end +  context "linux" do +    let(:root_ent) { "root:x:0:0:root:/root:/bin/bash" } +    let(:expected_root_home) { "/root" } + +    it "should return /root" do +      Facter::Util::Resolution.expects(:exec).with("getent passwd root").returns(root_ent) +      expect(Facter::Util::RootHome.get_root_home).to eq(expected_root_home) +    end +  end +  context "windows" do +    before :each do +      Facter::Util::Resolution.expects(:exec).with("getent passwd root").returns(nil) +    end +    it "should be nil on windows" do +      expect(Facter::Util::RootHome.get_root_home).to be_nil +    end +  end +end + +describe 'root_home', :type => :fact do +  before { Facter.clear } +  after { Facter.clear } + +  context "macosx" do +    before do +      Facter.fact(:kernel).stubs(:value).returns("Darwin") +      Facter.fact(:osfamily).stubs(:value).returns("Darwin") +    end +    let(:expected_root_home) { "/var/root" } +    sample_dscacheutil = File.read(fixtures('dscacheutil','root')) + +    it "should return /var/root" do +      Facter::Util::Resolution.stubs(:exec).with("dscacheutil -q user -a name root").returns(sample_dscacheutil) +      expect(Facter.fact(:root_home).value).to eq(expected_root_home) +    end +  end + +end diff --git a/puppet/modules/stdlib/spec/unit/facter/util/puppet_settings_spec.rb b/puppet/modules/stdlib/spec/unit/facter/util/puppet_settings_spec.rb new file mode 100755 index 00000000..c06137d7 --- /dev/null +++ b/puppet/modules/stdlib/spec/unit/facter/util/puppet_settings_spec.rb @@ -0,0 +1,36 @@ +#! /usr/bin/env ruby -S rspec +require 'spec_helper' +require 'facter/util/puppet_settings' + +describe Facter::Util::PuppetSettings do + +  describe "#with_puppet" do +    context "Without Puppet loaded" do +      before(:each) do +        Module.expects(:const_get).with("Puppet").raises(NameError) +      end + +      it 'should be nil' do +        expect(subject.with_puppet { Puppet[:vardir] }).to be_nil +      end +      it 'should not yield to the block' do +        Puppet.expects(:[]).never +        expect(subject.with_puppet { Puppet[:vardir] }).to be_nil +      end +    end +    context "With Puppet loaded" do +      module Puppet; end +      let(:vardir) { "/var/lib/puppet" } + +      before :each do +        Puppet.expects(:[]).with(:vardir).returns vardir +      end +      it 'should yield to the block' do +        subject.with_puppet { Puppet[:vardir] } +      end +      it 'should return the nodes vardir' do +        expect(subject.with_puppet { Puppet[:vardir] }).to eq vardir +      end +    end +  end +end diff --git a/puppet/modules/stdlib/spec/unit/puppet/functions/type_of_spec.rb b/puppet/modules/stdlib/spec/unit/puppet/functions/type_of_spec.rb new file mode 100644 index 00000000..8afb6246 --- /dev/null +++ b/puppet/modules/stdlib/spec/unit/puppet/functions/type_of_spec.rb @@ -0,0 +1,33 @@ +#! /usr/bin/env ruby -S rspec + +require 'spec_helper' + +if ENV["FUTURE_PARSER"] == 'yes' or Puppet.version >= "4" +  require 'puppet/pops' +  require 'puppet/loaders' + +  describe 'the type_of function' do +    before(:all) do +      loaders = Puppet::Pops::Loaders.new(Puppet::Node::Environment.create(:testing, [File.join(fixtures, "modules")])) +      Puppet.push_context({:loaders => loaders}, "test-examples") +    end + +    after(:all) do +      Puppet::Pops::Loaders.clear +      Puppet::pop_context() +    end + +    let(:func) do +      # Load the function from the environment modulepath's modules (ie, fixtures) +      Puppet.lookup(:loaders).private_environment_loader.load(:function, 'type_of') +    end + +    it 'gives the type of a string' do +      expect(func.call({}, 'hello world')).to be_kind_of(Puppet::Pops::Types::PStringType) +    end + +    it 'gives the type of an integer' do +      expect(func.call({}, 5)).to be_kind_of(Puppet::Pops::Types::PIntegerType) +    end +  end +end diff --git a/puppet/modules/stdlib/spec/unit/puppet/parser/functions/basename_spec.rb b/puppet/modules/stdlib/spec/unit/puppet/parser/functions/basename_spec.rb new file mode 100755 index 00000000..8a2d0dc3 --- /dev/null +++ b/puppet/modules/stdlib/spec/unit/puppet/parser/functions/basename_spec.rb @@ -0,0 +1,46 @@ +#! /usr/bin/env ruby -S rspec +require 'spec_helper' + +describe "the basename function" do +  let(:scope) { PuppetlabsSpec::PuppetInternals.scope } + +  it "should exist" do +    Puppet::Parser::Functions.function("basename").should == "function_basename" +  end + +  it "should raise a ParseError if there is less than 1 argument" do +    lambda { scope.function_basename([]) }.should( raise_error(Puppet::ParseError)) +  end + +  it "should raise a ParseError if there are more than 2 arguments" do +    lambda { scope.function_basename(['a', 'b', 'c']) }.should( raise_error(Puppet::ParseError)) +  end + +  it "should return basename for an absolute path" do +    result = scope.function_basename(['/path/to/a/file.ext']) +    result.should(eq('file.ext')) +  end + +  it "should return basename for a relative path" do +    result = scope.function_basename(['path/to/a/file.ext']) +    result.should(eq('file.ext')) +  end + +  it "should strip extention when extension specified (absolute path)" do +    result = scope.function_basename(['/path/to/a/file.ext', '.ext']) +    result.should(eq('file')) +  end + +  it "should strip extention when extension specified (relative path)" do +    result = scope.function_basename(['path/to/a/file.ext', '.ext']) +    result.should(eq('file')) +  end + +  it "should complain about non-string first argument" do +    lambda { scope.function_basename([[]]) }.should( raise_error(Puppet::ParseError)) +  end + +  it "should complain about non-string second argument" do +    lambda { scope.function_basename(['/path/to/a/file.ext', []]) }.should( raise_error(Puppet::ParseError)) +  end +end diff --git a/puppet/modules/stdlib/spec/unit/puppet/parser/functions/bool2str_spec.rb b/puppet/modules/stdlib/spec/unit/puppet/parser/functions/bool2str_spec.rb new file mode 100755 index 00000000..b8788918 --- /dev/null +++ b/puppet/modules/stdlib/spec/unit/puppet/parser/functions/bool2str_spec.rb @@ -0,0 +1,46 @@ +#! /usr/bin/env ruby -S rspec +require 'spec_helper' + +describe "the bool2str function" do +  let(:scope) { PuppetlabsSpec::PuppetInternals.scope } + +  it "should exist" do +    expect(Puppet::Parser::Functions.function("bool2str")).to eq("function_bool2str") +  end + +  it "should raise a ParseError if there is less than 1 arguments" do +    expect { scope.function_bool2str([]) }.to( raise_error(Puppet::ParseError)) +  end + +  it "should convert true to 'true'" do +    result = scope.function_bool2str([true]) +    expect(result).to(eq('true')) +  end + +  it "should convert true to a string" do +    result = scope.function_bool2str([true]) +    expect(result.class).to(eq(String)) +  end + +  it "should convert false to 'false'" do +    result = scope.function_bool2str([false]) +    expect(result).to(eq('false')) +  end + +  it "should convert false to a string" do +    result = scope.function_bool2str([false]) +    expect(result.class).to(eq(String)) +  end + +  it "should not accept a string" do +    expect { scope.function_bool2str(["false"]) }.to( raise_error(Puppet::ParseError)) +  end + +  it "should not accept a nil value" do +    expect { scope.function_bool2str([nil]) }.to( raise_error(Puppet::ParseError)) +  end + +  it "should not accept an undef" do +    expect { scope.function_bool2str([:undef]) }.to( raise_error(Puppet::ParseError)) +  end +end diff --git a/puppet/modules/stdlib/spec/unit/puppet/parser/functions/camelcase_spec.rb b/puppet/modules/stdlib/spec/unit/puppet/parser/functions/camelcase_spec.rb new file mode 100755 index 00000000..70382adb --- /dev/null +++ b/puppet/modules/stdlib/spec/unit/puppet/parser/functions/camelcase_spec.rb @@ -0,0 +1,24 @@ +#! /usr/bin/env ruby -S rspec +require 'spec_helper' + +describe "the camelcase function" do +  let(:scope) { PuppetlabsSpec::PuppetInternals.scope } + +  it "should exist" do +    expect(Puppet::Parser::Functions.function("camelcase")).to eq("function_camelcase") +  end + +  it "should raise a ParseError if there is less than 1 arguments" do +    expect { scope.function_camelcase([]) }.to( raise_error(Puppet::ParseError)) +  end + +  it "should capitalize the beginning of a normal string" do +    result = scope.function_camelcase(["abc"]) +    expect(result).to(eq("Abc")) +  end + +  it "should camelcase an underscore-delimited string" do +    result = scope.function_camelcase(["aa_bb_cc"]) +    expect(result).to(eq("AaBbCc")) +  end +end diff --git a/puppet/modules/stdlib/spec/unit/puppet/parser/functions/str2saltedsha1_spec.rb b/puppet/modules/stdlib/spec/unit/puppet/parser/functions/str2saltedsha1_spec.rb new file mode 100644 index 00000000..753cb24a --- /dev/null +++ b/puppet/modules/stdlib/spec/unit/puppet/parser/functions/str2saltedsha1_spec.rb @@ -0,0 +1,45 @@ +#! /usr/bin/env ruby -S rspec +require 'spec_helper' + +describe "the str2saltedsha1 function" do +  let(:scope) { PuppetlabsSpec::PuppetInternals.scope } + +  it "should exist" do +    Puppet::Parser::Functions.function("str2saltedsha1").should == "function_str2saltedsha1" +  end + +  it "should raise a ParseError if there is less than 1 argument" do +    expect { scope.function_str2saltedsha1([]) }.should( raise_error(Puppet::ParseError) ) +  end + +  it "should raise a ParseError if there is more than 1 argument" do +    expect { scope.function_str2saltedsha1(['foo', 'bar', 'baz']) }.should( raise_error(Puppet::ParseError) ) +  end + +  it "should return a salted-sha1 password hash 136 characters in length" do +    result = scope.function_str2saltedsha1(["password"]) +    result.length.should(eq(136)) +  end + +  it "should raise an error if you pass a non-string password" do +    expect { scope.function_str2saltedsha1([1234]) }.should( raise_error(Puppet::ParseError) ) +  end + +  it "should generate a valid password" do +    # Allow the function to generate a password based on the string 'password' +    password_hash = scope.function_str2saltedsha1(["password"]) + +    # Separate the Salt and Password from the Password Hash +    salt     = password_hash[0..7] +    password = password_hash[8..-1] + +    # Convert the Salt and Password from Hex to Binary Data +    str_salt     = Array(salt.lines).pack('H*') +    str_password = Array(password.lines).pack('H*') + +    # Combine the Binary Salt with 'password' and compare the end result +    saltedpass    = Digest::SHA1.digest(str_salt + 'password') +    result        = (str_salt + saltedpass).unpack('H*')[0] +    result.should == password_hash +  end +end diff --git a/puppet/modules/stdlib/spec/unit/puppet/provider/file_line/ruby_spec.rb b/puppet/modules/stdlib/spec/unit/puppet/provider/file_line/ruby_spec.rb new file mode 100755 index 00000000..d2a129c3 --- /dev/null +++ b/puppet/modules/stdlib/spec/unit/puppet/provider/file_line/ruby_spec.rb @@ -0,0 +1,225 @@ +#! /usr/bin/env ruby -S rspec +require 'spec_helper' +require 'tempfile' +provider_class = Puppet::Type.type(:file_line).provider(:ruby) +describe provider_class do +  context "when adding" do +    let :tmpfile do +      tmp = Tempfile.new('tmp') +      path = tmp.path +      tmp.close! +      path +    end +    let :resource do +      Puppet::Type::File_line.new( +        {:name => 'foo', :path => tmpfile, :line => 'foo'} +      ) +    end +    let :provider do +      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 +      expect(provider.exists?).to be_truthy +    end +    it 'should detect if the line does not exist in the file' do +      File.open(tmpfile, 'w') do |fh| +        fh.write('foo1') +      end +      expect(provider.exists?).to be_nil +    end +    it 'should append to an existing file when creating' do +      provider.create +      expect(File.read(tmpfile).chomp).to eq('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 + +    describe 'using match' do +      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 +        expect(@provider.exists?).to be_nil +        expect { @provider.create }.to raise_error(Puppet::Error, /More than one line.*matches/) +        expect(File.read(@tmpfile)).to 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 +        expect(@provider.exists?).to be_nil +        @provider.create +        expect(File.read(@tmpfile).chomp).to 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 +        expect(@provider.exists?).to be_nil +        @provider.create +        expect(File.read(@tmpfile).chomp).to 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 +        expect(@provider.exists?).to be_nil +        @provider.create +        expect(File.read(@tmpfile)).to 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 +        expect(@provider.exists?).to be_truthy +        @provider.create +        expect(File.read(@tmpfile).chomp).to eql("foo1\nfoo = bar\nfoo2") +      end +    end + +    describe 'using after' do +      let :resource do +        Puppet::Type::File_line.new( +          { +            :name  => 'foo', +            :path  => @tmpfile, +            :line  => 'inserted = line', +            :after => '^foo1', +          } +        ) +      end + +      let :provider do +        provider_class.new(resource) +      end + +      context 'with one line matching the after expression' do +        before :each do +          File.open(@tmpfile, 'w') do |fh| +            fh.write("foo1\nfoo = blah\nfoo2\nfoo = baz") +          end +        end + +        it 'inserts the specified line after the line matching the "after" expression' do +          provider.create +          expect(File.read(@tmpfile).chomp).to eql("foo1\ninserted = line\nfoo = blah\nfoo2\nfoo = baz") +        end +      end + +      context 'with two lines matching the after expression' do +        before :each do +          File.open(@tmpfile, 'w') do |fh| +            fh.write("foo1\nfoo = blah\nfoo2\nfoo1\nfoo = baz") +          end +        end + +        it 'errors out stating "One or no line must match the pattern"' do +          expect { provider.create }.to raise_error(Puppet::Error, /One or no line must match the pattern/) +        end +      end + +      context 'with no lines matching the after expression' do +        let :content do +          "foo3\nfoo = blah\nfoo2\nfoo = baz\n" +        end + +        before :each do +          File.open(@tmpfile, 'w') do |fh| +            fh.write(content) +          end +        end + +        it 'appends the specified line to the file' do +          provider.create +          expect(File.read(@tmpfile)).to eq(content << resource[:line] << "\n") +        end +      end +    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 +      expect(File.read(@tmpfile)).to 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 +      expect(File.read(@tmpfile)).to 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 +      expect(File.read(@tmpfile)).to eql("foo1\nfoo2\n") +    end +  end +end diff --git a/puppet/modules/stdlib/spec/unit/puppet/type/anchor_spec.rb b/puppet/modules/stdlib/spec/unit/puppet/type/anchor_spec.rb new file mode 100755 index 00000000..c738a272 --- /dev/null +++ b/puppet/modules/stdlib/spec/unit/puppet/type/anchor_spec.rb @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby + +require 'spec_helper' + +anchor = Puppet::Type.type(:anchor).new(:name => "ntp::begin") + +describe anchor do +  it "should stringify normally" do +    expect(anchor.to_s).to eq("Anchor[ntp::begin]") +  end +end diff --git a/puppet/modules/stdlib/spec/unit/puppet/type/file_line_spec.rb b/puppet/modules/stdlib/spec/unit/puppet/type/file_line_spec.rb new file mode 100755 index 00000000..410d0bfe --- /dev/null +++ b/puppet/modules/stdlib/spec/unit/puppet/type/file_line_spec.rb @@ -0,0 +1,70 @@ +#! /usr/bin/env ruby -S rspec +require 'spec_helper' +require 'tempfile' +describe Puppet::Type.type(:file_line) do +  let :file_line do +    Puppet::Type.type(:file_line).new(:name => 'foo', :line => 'line', :path => '/tmp/path') +  end +  it 'should accept a line and path' do +    file_line[:line] = 'my_line' +    expect(file_line[:line]).to eq('my_line') +    file_line[:path] = '/my/path' +    expect(file_line[:path]).to eq('/my/path') +  end +  it 'should accept a match regex' do +    file_line[:match] = '^foo.*$' +    expect(file_line[:match]).to eq('^foo.*$') +  end +  it 'should accept a match regex that does not match the specified line' do +    expect { +      Puppet::Type.type(:file_line).new( +          :name   => 'foo', +          :path   => '/my/path', +          :line   => 'foo=bar', +          :match  => '^bar=blah$' +    )}.not_to raise_error +  end +  it 'should accept a match regex that does match the specified line' do +    expect { +      Puppet::Type.type(:file_line).new( +          :name   => 'foo', +          :path   => '/my/path', +          :line   => 'foo=bar', +          :match  => '^\s*foo=.*$' +      )}.not_to raise_error +  end +  it 'should accept posix filenames' do +    file_line[:path] = '/tmp/path' +    expect(file_line[:path]).to eq('/tmp/path') +  end +  it 'should not accept unqualified path' do +    expect { file_line[:path] = 'file' }.to raise_error(Puppet::Error, /File paths must be fully qualified/) +  end +  it 'should require that a line is specified' do +    expect { Puppet::Type.type(:file_line).new(:name => 'foo', :path => '/tmp/file') }.to raise_error(Puppet::Error, /Both line and path are required attributes/) +  end +  it 'should require that a file is specified' do +    expect { Puppet::Type.type(:file_line).new(:name => 'foo', :line => 'path') }.to raise_error(Puppet::Error, /Both line and path are required attributes/) +  end +  it 'should default to ensure => present' do +    expect(file_line[:ensure]).to eq :present +  end + +  it "should autorequire the file it manages" do +    catalog = Puppet::Resource::Catalog.new +    file = Puppet::Type.type(:file).new(:name => "/tmp/path") +    catalog.add_resource file +    catalog.add_resource file_line + +    relationship = file_line.autorequire.find do |rel| +      (rel.source.to_s == "File[/tmp/path]") and (rel.target.to_s == file_line.to_s) +    end +    expect(relationship).to be_a Puppet::Relationship +  end + +  it "should not autorequire the file it manages if it is not managed" do +    catalog = Puppet::Resource::Catalog.new +    catalog.add_resource file_line +    expect(file_line.autorequire).to be_empty +  end +end | 
