From b990145875f570ded46a0716b5af16255c54ad01 Mon Sep 17 00:00:00 2001 From: Ryan Lue Date: Wed, 11 Dec 2019 10:32:45 +0800 Subject: [PATCH] Refactoring: DRY up TwitterSync.preferences_cleanup spec --- spec/lib/twitter_sync_spec.rb | 123 ++++++++++++++++------------------ 1 file changed, 58 insertions(+), 65 deletions(-) diff --git a/spec/lib/twitter_sync_spec.rb b/spec/lib/twitter_sync_spec.rb index f504ed244..c3e5c5c71 100644 --- a/spec/lib/twitter_sync_spec.rb +++ b/spec/lib/twitter_sync_spec.rb @@ -2,74 +2,67 @@ require 'rails_helper' RSpec.describe TwitterSync do describe '.preferences_cleanup' do - describe 'sanitizing Twitter preferences' do - context 'when given as a bare hash' do - it 'automatically adds empty hashes at :geo and :place' do - expect(described_class.preferences_cleanup({})) - .to eq({ geo: {}, place: {} }) - end - - it 'does not modify values at :mention_ids' do - expect(described_class.preferences_cleanup({ mention_ids: [1_234_567_890] })) - .to include({ mention_ids: [1_234_567_890] }) - end - - it 'converts geo: instance_of(Twitter::NullOjbect) to empty hash' do - expect(described_class.preferences_cleanup({ geo: Twitter::NullObject.new })) - .to include(geo: {}) - end - - it 'converts geo: instance_of(Twitter::Geo.new) to matching hash' do - expect(described_class.preferences_cleanup({ geo: Twitter::Geo.new(coordinates: [1, 1]) })) - .to include(geo: { coordinates: [1, 1] }) - end - - it 'converts place: instance_of(Twitter::NullOjbect) to empty hash' do - expect(described_class.preferences_cleanup({ place: Twitter::NullObject.new })) - .to include(place: {}) - end - - it 'converts place: instance_of(Twitter::Place.new) to matching hash' do - place_data = { country: 'da', name: 'do', woeid: 1, id: 1 } - - expect(described_class.preferences_cleanup({ place: Twitter::Place.new(place_data) })) - .to include(place: place_data) - end + shared_examples 'for normalizing input' do + it 'is converted (from bare hash)' do + expect(described_class.preferences_cleanup(raw_preferences)).to include(clean_preferences) end - context 'when given nested in an article preferences hash' do - it 'automatically adds empty hashes at :geo and :place' do - expect(described_class.preferences_cleanup({ twitter: {} })) - .to eq(twitter: { geo: {}, place: {} }) - end - - it 'does not modify values at :mention_ids' do - expect(described_class.preferences_cleanup({ twitter: { mention_ids: [1_234_567_890] } })) - .to include(twitter: hash_including(mention_ids: [1_234_567_890])) - end - - it 'converts geo: instance_of(Twitter::NullOjbect) to empty hash' do - expect(described_class.preferences_cleanup({ twitter: { geo: Twitter::NullObject.new } })) - .to include(twitter: hash_including(geo: {})) - end - - it 'converts geo: instance_of(Twitter::Geo.new) to matching hash' do - expect(described_class.preferences_cleanup({ twitter: { geo: Twitter::Geo.new(coordinates: [1, 1]) } })) - .to include(twitter: hash_including(geo: { coordinates: [1, 1] })) - end - - it 'converts place: instance_of(Twitter::NullOjbect) to empty hash' do - expect(described_class.preferences_cleanup({ twitter: { place: Twitter::NullObject.new } })) - .to include(twitter: hash_including(place: {})) - end - - it 'converts place: instance_of(Twitter::Place.new) to matching hash' do - place_data = { country: 'da', name: 'do', woeid: 1, id: 1 } - - expect(described_class.preferences_cleanup({ twitter: { place: Twitter::Place.new(place_data) } })) - .to include(twitter: hash_including(place: place_data)) - end + it 'is converted (from article.preferences hash)' do + expect(described_class.preferences_cleanup(twitter: raw_preferences)).to match({ twitter: hash_including(clean_preferences) }) end end + + describe ':geo key' do + context 'when absent' do + let(:raw_preferences) { {} } + let(:clean_preferences) { { geo: {} } } + + include_examples 'for normalizing input' + end + + context 'when instance_of(Twitter::NullOjbect)' do + let(:raw_preferences) { { geo: Twitter::NullObject.new } } + let(:clean_preferences) { { geo: {} } } + + include_examples 'for normalizing input' + end + + context 'when instance_of(Twitter::Geo.new)' do + let(:raw_preferences) { { geo: Twitter::Geo.new(coordinates: [1, 1]) } } + let(:clean_preferences) { { geo: { coordinates: [1, 1] } } } + + include_examples 'for normalizing input' + end + end + + describe ':place key' do + context 'when absent' do + let(:raw_preferences) { {} } + let(:clean_preferences) { { place: {} } } + + include_examples 'for normalizing input' + end + + context 'when instance_of(Twitter::NullOjbect)' do + let(:raw_preferences) { { place: Twitter::NullObject.new } } + let(:clean_preferences) { { place: {} } } + + include_examples 'for normalizing input' + end + + context 'when instance_of(Twitter::Place.new)' do + let(:raw_preferences) { { place: Twitter::Place.new({ country: 'da', name: 'do', woeid: 1, id: 1 }) } } + let(:clean_preferences) { { place: { country: 'da', name: 'do', woeid: 1, id: 1 } } } + + include_examples 'for normalizing input' + end + end + + describe ':mention_ids key' do + let(:raw_preferences) { { mention_ids: [1_234_567_890] } } + let(:clean_preferences) { { mention_ids: [1_234_567_890] } } + + include_examples 'for normalizing input' + end end end