# encoding: utf-8
require 'spec_helper'
describe GithubCLI::Config do
let(:filename) { '.githubrc' }
let(:path) { "/users/#{filename}" }
let(:config_name) { 'simple_config' }
let(:config) { described_class.new fixture_path }
before do
config.stub(:global_options_file) { fixture_path(config_name) }
File.stub(:open) { YAML.load fixture('simple_config') }
end
it 'returns config type' do
GithubCLI.config = GithubCLI::Config.new filename
GithubCLI.config.should be_a GithubCLI::Config
end
context 'array access' do
it 'returns value for the key' do
expect(config['user.login']).to eql('login')
end
it 'searches in commands' do
expect(config['issue.list']).to eql({ 'title' => 'ticket' })
end
it 'returns nil for missing key' do
expect(config['non-existent']).to be_nil
end
end
context '#fetch' do
it 'finds value' do
expect(config.fetch('user.token')).to eql('ad7f9asdf97as98df7as9fd7')
end
it 'uses default value' do
expect(config.fetch('unkown', 11)).to eql(11)
end
it 'raises error' do
expect { config.fetch('unkown') }.to raise_error(IndexError)
end
end
context '#pretty' do
it 'collects options into array' do
options= {'user.token' => 'abc123' }
config.stub(:all).and_return options
expect(config.pretty).to eql([['user.token','abc123']])
end
it 'marks nil option value as undefined' do
options= {'option' => nil}
config.stub(:all).and_return options
expect(config.pretty).to eql([['option', 'UNDEFINED']])
end
end
context '#save' do
let(:attrs) { {} }
let(:cmd) { stub(:cmd, :namespace => 'repo', :name => 'create') }
before do
GithubCLI::Command.stub(:all) { [cmd] }
File.stub(:open)
end
it 'saves config to yaml format' do
File.stub(:open).and_yield filename
YAML.should_receive(:dump).with(attrs, filename)
config.save attrs
end
it 'retrieves api commands' do
config.save attrs
attrs.should have_key 'commands.repo.create'
end
it 'skips commands with no namespace' do
cmd.stub(:namespace) { '' }
config.save attrs
attrs.keys.should be_empty
end
it 'skips help commands' do
cmd.stub(:name) { 'help' }
config.save attrs
attrs.keys.should be_empty
end
end
context "#load" do
it "loads empty hash if config doesn't exist" do
File.stub(:exists?) { false }
config.load == {}
end
it "loads yaml config" do
File.stub(:exists?) { true }
File.stub(:open).and_yield filename
YAML.should_receive(:load).with(filename)
config.load
end
end
context "#path" do
it 'looks for local config file' do
root = "/users/"
File.stub(:exists?) { true }
config = GithubCLI::Config.new root
config.path.to_s.should == "#{root}/.githubrc"
end
it 'reads global file if local is missing ' do
File.stub(:exists?) { false }
config = GithubCLI::Config.new path
config.path.to_s.should == "#{ENV['HOME']}/#{filename}"
end
end
end # GithubCLI::Config