require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
describe Setting do
  subject { Setting }

  context "Test with stubs" do
    before :each do
      stub_setting_files
      Setting.reload(
          :files => ["default.yml", "environments/test.yml"],
          :path  => "config/settings",
          :local => true)
    end

    it 'should return test specific values' do
      Setting.available_settings['one'].should == "test"
      Setting.one.should == "test"
      Setting['one'].should == "test"
    end

    it "should handle custom values overriding everything else" do
      Setting.seven.should == "seven from custom"
    end

    it "handles multiple values" do
      Setting['six'].should == {"default"=>"default value", "extra"=>"recursively overriden", "deep_level"=>{"value"=>"even deeper level"}}
      Setting.available_settings['six']['default'].should == "default value"
      Setting.seven.should == "seven from custom"
    end

    it "should support symbols as keys" do
      Setting[:six].should == {"default"=>"default value", "extra"=>"recursively overriden"}
    end

    it "handles default key" do
      Setting.default_setting.should == 1
      Setting['seven']['default'].should == "seven from custom"
    end

    it "should handle empty strings" do
      Setting.empty.should == ""
    end

    it "should responds to ? mark" do
      Setting.autologin?.should == true
    end

    it "should returns false correctly" do
      Setting.flag_false.should be(false)
    end

    it "should merge keys recursivelly" do
      Setting.six(:extra).should == "recursively overriden"
      Setting.six(:deep_level)[:value] = "even deeper level"
    end

    it "should create keys if it does not exist" do
      Setting.test_specific.should == "exist"
    end
  end

  context "When running with threads" do
    it "should keep its values" do
      3.times do |time|
        Thread.new {
          Proc.new{
            Setting.available_settings.shoud_not be_empty
          }
        }
      end
    end
  end

  context "When running inside a proc" do
    it "should keep its values" do
      Proc.new{
        Setting.available_settings.shoud_not be_empty
      }
    end
  end

  context "Test from file" do
    before :each do
      Setting.reload(
          :files => ['sample.yml'],
          :path  => File.join(File.dirname(__FILE__)) + '/fixtures'
      )
    end

    it 'should support [] syntax' do
      Setting['tax']['default'].should == 0.0
      Setting['tax'].should == {'default' => 0.0, 'california' => 7.5}
    end

    it 'should support method invocation syntax' do
      Setting.tax.should == 0.0

      Setting.tax(:default).should == Setting.tax
      Setting.tax('default').should == Setting.tax
      Setting.tax(:california).should == 7.5

      Setting.states.should == ['CA', 'WA', 'NY']
      Setting.states(:default).should == Setting.states
      Setting.states(:ship_to).should == ['CA', 'NY']
    end

    it 'should correctly process Boolean values' do
      Setting.boolean_true?.should be(true)
      Setting.boolean_true.should == 4
      Setting.boolean_false?.should be(false)
      Setting.boolean_false?(:default).should be(false)
      Setting.boolean_false?(:negated).should be(true)
    end

  end
end