Skip to content

Instantly share code, notes, and snippets.

@delbetu
Created November 6, 2017 18:55
Show Gist options
  • Save delbetu/37710fbbd0bc5ffbaea38a6a41992c0b to your computer and use it in GitHub Desktop.
Save delbetu/37710fbbd0bc5ffbaea38a6a41992c0b to your computer and use it in GitHub Desktop.
Ruby Rspec - Class example
class UniquenessValidator
def initialize(sources: [])
@sources = sources
end
def run
# 'admin_intro_crm_basics', 'lex_migration_introduction', 'admin_intro_crm_basics'
top_level_ids = sources.map(&:find_all_top_level_ids).flatten
calculate_repeated!(top_level_ids)
self
rescue => e
add_error!(e.message)
self
end
def repeated_ids
@repeated_ids || []
end
def error_messages
@error_messages || []
end
private
def calculate_repeated!(top_level_ids)
@repeated_ids =
top_level_ids # ['id1', 'id1', 'id2']
.group_by { |e| e } # [ ['id1', ['id1', 'id1']], ['id2', ['id2']] ]
.select { |_, v| v.size > 1 } # [ ['id1', ['id1', 'id1']] ]
.map(&:first) # ['id1']
end
def add_error!(error_message)
@error_messages ||= []
@error_messages << "Error: #{error_message}"
end
attr_reader :sources
end
describe UniquenessValidator do
describe '#run' do
subject(:validator) { described_class.new(sources: [source_explorer]) }
let(:ids) { %w(id1 id2 id3) }
let(:source_explorer) { double(find_all_top_level_ids: ids) }
it 'asks the source explorer for all top level ids' do
validator.run
expect(source_explorer).to have_received(:find_all_top_level_ids)
end
context 'when ids are repetead across multiple sources' do
let(:git_source_explorer) { double(find_all_top_level_ids: %w(id1 id2 id3)) }
let(:p4_source_explorer) { double(find_all_top_level_ids: %w(id4 id2 id5)) }
subject(:validator) do
described_class.new(sources: [git_source_explorer, p4_source_explorer])
end
it 'identifies its repetition' do
validator.run
expect(validator.repeated_ids).to match_array(%w(id2))
end
end
context 'when no id is repeated' do
it 'does not populate repeated_ids' do
result = validator.run
expect(result.repeated_ids).to be_empty
end
end
context 'when one id is repeated' do
let(:ids) { %w(id1 id2 id1) }
it 'populates repeated_ids' do
result = validator.run
expect(result.repeated_ids).to match_array(['id1'])
end
end
context 'when multiple ids are reapeated' do
let(:ids) { %w(id1 id2 id1 id3 id3 id3 id4 id5) }
it 'populates repeated_ids' do
result = validator.run
expect(result.repeated_ids).to match_array %w(id1 id3)
end
end
it 'populates its error_messages with nothing' do
result = validator.run
expect(result.error_messages).to be_empty
end
context 'when source explorer fails' do
it 'populates its error_messages' do
allow(source_explorer).to receive(:find_all_top_level_ids).and_raise('message')
result = validator.run
expect(result.error_messages).to eq(['Error: message'])
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment