]> git.donarmstrong.com Git - dsa-puppet.git/blobdiff - 3rdparty/modules/inifile/spec/unit/puppet/util/ini_file_spec.rb
add puppetlabs/inifile to 3rdparty
[dsa-puppet.git] / 3rdparty / modules / inifile / spec / unit / puppet / util / ini_file_spec.rb
diff --git a/3rdparty/modules/inifile/spec/unit/puppet/util/ini_file_spec.rb b/3rdparty/modules/inifile/spec/unit/puppet/util/ini_file_spec.rb
new file mode 100644 (file)
index 0000000..7a92090
--- /dev/null
@@ -0,0 +1,287 @@
+require 'spec_helper'
+require 'stringio'
+require 'puppet/util/ini_file'
+
+describe Puppet::Util::IniFile do
+  let(:subject) { Puppet::Util::IniFile.new("/my/ini/file/path") }
+
+  before :each do
+    File.should_receive(:file?).with("/my/ini/file/path") { true }
+    described_class.should_receive(:readlines).once.with("/my/ini/file/path") do
+      sample_content
+    end
+  end
+
+  context "when parsing a file" do
+    let(:sample_content) {
+      template = <<-EOS
+# This is a comment
+[section1]
+; This is also a comment
+foo=foovalue
+
+bar = barvalue
+baz =
+[section2]
+
+foo= foovalue2
+baz=bazvalue
+ ; commented = out setting
+    #another comment
+ ; yet another comment
+ zot = multi word value
+ xyzzy['thing1']['thing2']=xyzzyvalue
+ l=git log
+      EOS
+      template.split("\n")
+    }
+
+    it "should parse the correct number of sections" do
+      # there is always a "global" section, so our count should be 3.
+      subject.section_names.length.should == 3
+    end
+
+    it "should parse the correct section_names" do
+      # there should always be a "global" section named "" at the beginning of the list
+      subject.section_names.should == ["", "section1", "section2"]
+    end
+
+    it "should expose settings for sections" do
+      subject.get_settings("section1").should == {
+        "bar" => "barvalue",
+        "baz" => "",
+        "foo" => "foovalue"
+      }
+
+      subject.get_settings("section2").should == {
+        "baz" => "bazvalue",
+        "foo" => "foovalue2",
+        "l" => "git log",
+        "xyzzy['thing1']['thing2']" => "xyzzyvalue",
+        "zot" => "multi word value"
+      }
+    end
+
+  end
+
+  context "when parsing a file whose first line is a section" do
+    let(:sample_content) {
+      template = <<-EOS
+[section1]
+; This is a comment
+foo=foovalue
+      EOS
+      template.split("\n")
+    }
+
+    it "should parse the correct number of sections" do
+      # there is always a "global" section, so our count should be 2.
+      subject.section_names.length.should == 2
+    end
+
+    it "should parse the correct section_names" do
+      # there should always be a "global" section named "" at the beginning of the list
+      subject.section_names.should == ["", "section1"]
+    end
+
+    it "should expose settings for sections" do
+      subject.get_value("section1", "foo").should == "foovalue"
+    end
+
+  end
+
+  context "when parsing a file with a 'global' section" do
+    let(:sample_content) {
+      template = <<-EOS
+foo = bar
+[section1]
+; This is a comment
+foo=foovalue
+      EOS
+      template.split("\n")
+    }
+
+    it "should parse the correct number of sections" do
+      # there is always a "global" section, so our count should be 2.
+      subject.section_names.length.should == 2
+    end
+
+    it "should parse the correct section_names" do
+      # there should always be a "global" section named "" at the beginning of the list
+      subject.section_names.should == ["", "section1"]
+    end
+
+    it "should expose settings for sections" do
+      subject.get_value("", "foo").should == "bar"
+      subject.get_value("section1", "foo").should == "foovalue"
+    end
+  end
+
+  context "when updating a file with existing empty values" do
+    let(:sample_content) {
+      template = <<-EOS
+[section1]
+foo=
+#bar=
+#xyzzy['thing1']['thing2']='xyzzyvalue'
+      EOS
+      template.split("\n")
+    }
+
+    it "should properly update uncommented values" do
+      subject.get_value("section1", "far").should == nil
+      subject.set_value("section1", "foo", "foovalue")
+      subject.get_value("section1", "foo").should == "foovalue"
+    end
+
+    it "should properly update commented values" do
+      subject.get_value("section1", "bar").should == nil
+      subject.set_value("section1", "bar", "barvalue")
+      subject.get_value("section1", "bar").should == "barvalue"
+      subject.get_value("section1", "xyzzy['thing1']['thing2']").should == nil
+      subject.set_value("section1", "xyzzy['thing1']['thing2']", "xyzzyvalue")
+      subject.get_value("section1", "xyzzy['thing1']['thing2']").should == "xyzzyvalue"
+    end
+
+    it "should properly add new empty values" do
+      subject.get_value("section1", "baz").should == nil
+      subject.set_value("section1", "baz", "bazvalue")
+      subject.get_value("section1", "baz").should == "bazvalue"
+    end
+  end
+
+  context 'the file has quotation marks in its section names' do
+    let(:sample_content) do
+      template = <<-EOS
+[branch "master"]
+        remote = origin
+        merge = refs/heads/master
+
+[alias]
+to-deploy = log --merges --grep='pull request' --format='%s (%cN)' origin/production..origin/master
+[branch "production"]
+        remote = origin
+        merge = refs/heads/production
+      EOS
+      template.split("\n")
+    end
+
+    it 'should parse the sections' do
+      subject.section_names.should match_array ['',
+                                                'branch "master"',
+                                                'alias',
+                                                'branch "production"'
+      ]
+    end
+  end
+
+  context 'Samba INI file with dollars in section names' do
+    let(:sample_content) do
+      template = <<-EOS
+      [global]
+        workgroup = FELLOWSHIP
+        ; ...
+        idmap config * : backend = tdb
+
+      [printers]
+        comment = All Printers
+        ; ...
+        browseable = No
+
+      [print$]
+        comment = Printer Drivers
+        path = /var/lib/samba/printers
+
+      [Shares]
+        path = /home/shares
+        read only = No
+        guest ok = Yes
+      EOS
+      template.split("\n")
+    end
+
+    it "should parse the correct section_names" do
+      subject.section_names.should match_array [
+        '',
+        'global',
+        'printers',
+        'print$',
+        'Shares'
+      ]
+    end
+  end
+
+  context 'section names with forward slashes in them' do
+    let(:sample_content) do
+      template = <<-EOS
+[monitor:///var/log/*.log]
+disabled = test_value
+      EOS
+      template.split("\n")
+    end
+
+    it "should parse the correct section_names" do
+      subject.section_names.should match_array [
+        '',
+        'monitor:///var/log/*.log'
+      ]
+    end
+  end
+
+  context 'KDE Configuration with braces in setting names' do
+    let(:sample_content) do
+      template = <<-EOS
+      [khotkeys]
+_k_friendly_name=khotkeys
+{5465e8c7-d608-4493-a48f-b99d99fdb508}=Print,none,PrintScreen
+{d03619b6-9b3c-48cc-9d9c-a2aadb485550}=Search,none,Search
+EOS
+      template.split("\n")
+    end
+
+    it "should expose settings for sections" do
+      subject.get_value("khotkeys", "{5465e8c7-d608-4493-a48f-b99d99fdb508}").should == "Print,none,PrintScreen"
+      subject.get_value("khotkeys", "{d03619b6-9b3c-48cc-9d9c-a2aadb485550}").should == "Search,none,Search"
+    end
+  end
+
+  context 'Configuration with colons in setting names' do
+    let(:sample_content) do
+      template = <<-EOS
+      [Drive names]
+A:=5.25" Floppy
+B:=3.5" Floppy
+C:=Winchester
+EOS
+      template.split("\n")
+    end
+
+    it "should expose settings for sections" do
+      subject.get_value("Drive names", "A:").should eq '5.25" Floppy'
+      subject.get_value("Drive names", "B:").should eq '3.5" Floppy'
+      subject.get_value("Drive names", "C:").should eq 'Winchester'
+    end
+  end
+
+  context 'Configuration with spaces in setting names' do
+    let(:sample_content) do
+      template = <<-EOS
+      [global]
+        # log files split per-machine:
+        log file = /var/log/samba/log.%m
+
+        kerberos method = system keytab
+        passdb backend = tdbsam
+        security = ads
+EOS
+      template.split("\n")
+    end
+
+    it "should expose settings for sections" do
+      subject.get_value("global", "log file").should eq '/var/log/samba/log.%m'
+      subject.get_value("global", "kerberos method").should eq 'system keytab'
+      subject.get_value("global", "passdb backend").should eq 'tdbsam'
+      subject.get_value("global", "security").should eq 'ads'
+    end
+  end
+end