spec/lib/rambling/trie/configuration/provider_collection_spec.rb
# frozen_string_literal: true
require 'spec_helper'
describe Rambling::Trie::Configuration::ProviderCollection do
let(:configured_default) { nil }
let :configured_providers do
{ one: first_provider, two: second_provider }
end
let :first_provider do
instance_double Rambling::Trie::Serializers::Marshal, :first_provider
end
let :second_provider do
instance_double Rambling::Trie::Serializers::Marshal, :second_provider
end
let :provider_collection do
described_class.new(
:provider,
configured_providers,
configured_default,
)
end
describe '.new' do
it 'has a name' do
expect(provider_collection.name).to eq :provider
end
it 'has the given providers' do
expect(provider_collection.providers)
.to eq one: first_provider, two: second_provider
end
it 'has a default provider' do
expect(provider_collection.default).to eq first_provider
end
context 'when a default is provided' do
let(:configured_default) { second_provider }
it 'has that as the default provider' do
expect(provider_collection.default).to eq second_provider
end
end
end
describe 'aliases and delegates' do
let(:providers) { provider_collection.providers }
before do
allow(providers).to receive_messages(
:[] => 'value',
keys: %i(a b),
)
end
# rubocop:disable RSpec/MultipleExpectations
it 'delegates `#[]` to providers' do
expect(provider_collection[:key]).to eq 'value'
expect(providers).to have_received(:[]).with :key
end
# rubocop:enable RSpec/MultipleExpectations
# rubocop:disable RSpec/MultipleExpectations
it 'aliases `#formats` to `providers#keys`' do
expect(provider_collection.formats).to eq %i(a b)
expect(providers).to have_received :keys
end
# rubocop:enable RSpec/MultipleExpectations
end
describe '#add' do
let :provider do
instance_double Rambling::Trie::Serializers::Marshal, :provider
end
before do
provider_collection.add :three, provider
end
it 'adds a new provider' do
expect(provider_collection.providers[:three]).to eq provider
end
end
describe '#default=' do
let :other_provider do
instance_double Rambling::Trie::Serializers::Marshal, :other_provider
end
context 'when the given value is in the providers list' do
it 'changes the default provider' do
provider_collection.default = second_provider
expect(provider_collection.default).to eq second_provider
end
end
context 'when the given value is not in the providers list' do
it 'raises an error and keeps the default provider' do
expect { provider_collection.default = other_provider }
.to raise_error(ArgumentError)
.and(not_change { provider_collection.default })
end
it 'raises an ArgumentError' do
expect { provider_collection.default = other_provider }
.to raise_error ArgumentError
end
end
context 'when the providers list is empty' do
let(:configured_providers) { {} }
it 'accepts nil' do
provider_collection.default = nil
expect(provider_collection.default).to be_nil
end
# rubocop:disable RSpec/MultipleExpectations
it 'raises an ArgumentError for any other provider' do
expect do
provider_collection.default = other_provider
end.to raise_error ArgumentError
expect(provider_collection.default).to be_nil
end
# rubocop:enable RSpec/MultipleExpectations
end
end
describe '#resolve' do
context 'when the file extension is one of the providers' do
[
['hola.one', :first_provider],
['hola.two', :second_provider],
].each do |test_params|
filepath, provider = test_params
it 'returns the corresponding provider' do
provider_instance = public_send provider
expect(provider_collection.resolve filepath).to eq provider_instance
end
end
end
context 'when the file extension is not one of the providers' do
%w(hola.unknown hola).each do |filepath|
it 'returns the default provider' do
expect(provider_collection.resolve filepath).to eq first_provider
end
end
end
end
describe '#reset' do
let(:configured_default) { second_provider }
let :provider do
instance_double Rambling::Trie::Serializers::Marshal, :provider
end
before do
provider_collection.add :three, provider
provider_collection.default = provider
end
it 'resets to back to the initially configured values (:three => nil)' do
provider_collection.reset
expect(provider_collection[:three]).to be_nil
end
it 'resets to back to the initially configured default' do
provider_collection.reset
expect(provider_collection.default).to eq second_provider
end
end
end