Created
November 6, 2017 18:55
-
-
Save delbetu/37710fbbd0bc5ffbaea38a6a41992c0b to your computer and use it in GitHub Desktop.
Ruby Rspec - Class example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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