spec/libraries/config_spec.rb in alchemy_cms-2.6.3 vs spec/libraries/config_spec.rb in alchemy_cms-2.7.0

- old
+ new

@@ -1,7 +1,114 @@ require 'spec_helper' -describe Alchemy::Config do - it "should have an array of fields for mailer" do - Alchemy::Config.get(:mailer)['fields'].should be_a(Array) +module Alchemy + describe Config do + + describe ".get" do + it "should call #show" do + Config.should_receive(:show).and_return({}) + Config.get(:mailer) + end + + it "should return the requested part of the config" do + Config.should_receive(:show).and_return({'mailer' => {'setting' => 'true'}}) + expect(Config.get(:mailer)).to eq({'setting' => 'true'}) + end + end + + describe '.main_app_config' do + let(:main_app_config_path) { "#{Rails.root}/config/alchemy/config.yml" } + + it "should call and return .read_file with the correct config path" do + Config.should_receive(:read_file).with(main_app_config_path).once.and_return({setting: 'true'}) + expect(Config.send(:main_app_config)).to eq({setting: 'true'}) + end + end + + describe '.env_specific_config' do + let(:env_specific_config_path) { "#{Rails.root}/config/alchemy/#{Rails.env}.config.yml" } + + it "should call and return .read_file with the correct config path" do + Config.should_receive(:read_file).with(env_specific_config_path).once.and_return({setting: 'true'}) + expect(Config.send(:env_specific_config)).to eq({setting: 'true'}) + end + end + + describe ".show" do + context "when ivar @config was not set before" do + before { Config.instance_variable_set("@config", nil) } + + it "should call and return .merge_configs!" do + Config.should_receive(:merge_configs!).once.and_return({setting: 'true'}) + expect(Config.show).to eq({setting: 'true'}) + end + end + + context "when ivar @config was already set" do + before { Config.instance_variable_set("@config", {setting: 'true'}) } + after { Config.instance_variable_set("@config", nil) } + + it "should have memoized the return value of .merge_configs!" do + expect(Config.send(:show)).to eq({setting: 'true'}) + end + end + end + + describe '.read_file' do + context 'when given path to yml file exists' do + before { File.stub!(:exists?).and_return(true) } + + it 'should call YAML.load_file with the given config path' do + YAML.should_receive(:load_file).once.with('path/to/config.yml').and_return({}) + Config.send(:read_file, 'path/to/config.yml') + end + + context 'but its empty' do + before do + File.stub!(:exists?).with('empty_file.yml').and_return(true) + YAML.stub!(:load_file).and_return(false) # YAML.load_file returns false if file is empty. + end + + it "should return an empty Hash" do + expect(Config.send(:read_file, 'empty_file.yml')).to eq({}) + end + end + end + + context 'when given path to yml file does not exist' do + it 'should return an empty Hash' do + expect(Config.send(:read_file, 'does/not/exist.yml')).to eq({}) + end + end + end + + describe '.merge_configs!' do + let(:config_1) do + {setting_1: 'same', other_setting: 'something'} + end + + let(:config_2) do + {setting_1: 'same', setting_2: 'anything'} + end + + it "should stringify the keys" do + expect(Config.send(:merge_configs!, config_1)).to eq(config_1.stringify_keys!) + end + + context 'when all passed configs are empty' do + it "should raise an error" do + expect { Config.send(:merge_configs!, {}) }.to raise_error + end + end + + context 'when configs containing same keys' do + it "should merge them together" do + expect(Config.send(:merge_configs!, config_1, config_2)).to eq( + {'setting_1' => 'same', 'other_setting' => 'something', 'setting_2' => 'anything'} + ) + end + end + end + end + end