From 39f769aa13ed47042120747720e1165fb0333ddb Mon Sep 17 00:00:00 2001 From: Ryan Lue Date: Thu, 17 Jan 2019 14:57:22 +0800 Subject: [PATCH] Refactoring: Migrate second test case in cti_caller_test.rb --- spec/models/cti/caller_id_spec.rb | 73 +++++++++++++++++++++---- test/unit/cti_caller_id_test.rb | 90 ------------------------------- 2 files changed, 64 insertions(+), 99 deletions(-) diff --git a/spec/models/cti/caller_id_spec.rb b/spec/models/cti/caller_id_spec.rb index cd93e496d..f30d8dd15 100644 --- a/spec/models/cti/caller_id_spec.rb +++ b/spec/models/cti/caller_id_spec.rb @@ -102,22 +102,43 @@ RSpec.describe Cti::CallerId do end context 'when given a recognized number' do - subject!(:caller_id) { create(:caller_id) } + subject!(:caller_id) { create(:caller_id, caller_id: number) } + let(:number) { '1234567890' } it 'returns an array with the corresponding CallerId' do - expect(Cti::CallerId.lookup(caller_id.caller_id)) - .to match_array([caller_id]) + expect(Cti::CallerId.lookup(number)).to match_array([caller_id]) end context 'shared by multiple CallerIds' do - subject!(:caller_ids) do - User.last(2).map { |u| create(:caller_id, caller_id: '1234567890', user: u) } + context '(for different users)' do + subject!(:caller_ids) do + [create(:caller_id, caller_id: number, user: User.last), + create(:caller_id, caller_id: number, user: User.offset(1).last)] + end + + it 'returns all corresponding CallerId records' do + expect(Cti::CallerId.lookup(number)).to match_array(caller_ids) + end end - # NOTE: this only works if the CallerId records are for distinct Users. - # Not sure if that's necessary to the spec, though. - it 'returns all CallerId records with that number' do - expect(Cti::CallerId.lookup('1234567890')).to match_array(caller_ids) + context '(for the same user)' do + subject!(:caller_ids) { create_list(:caller_id, 2, caller_id: number) } + + it 'returns one corresponding CallerId record by MAX(id)' do + expect(Cti::CallerId.lookup(number)).to match_array(caller_ids.last(1)) + end + end + + context '(some for the same user, some for another)' do + subject!(:caller_ids) do + [create(:caller_id, caller_id: number, user: User.last), + create(:caller_id, caller_id: number, user: User.last), + create(:caller_id, caller_id: number, user: User.offset(1).last)] + end + + it 'returns one CallerId record per unique #user_id, by MAX(id)' do + expect(Cti::CallerId.lookup(number)).to match_array(caller_ids.last(2)) + end end end end @@ -194,6 +215,40 @@ RSpec.describe Cti::CallerId do end end + describe '.maybe_add' do + let(:attributes) { attributes_for(:caller_id) } + + it 'wraps .find_or_initialize_by (passing only five defining attributes)' do + expect(described_class) + .to receive(:find_or_initialize_by) + .with(attributes.slice(:caller_id, :level, :object, :o_id, :user_id)) + .and_call_original + + Cti::CallerId.maybe_add(attributes) + end + + context 'if no matching record found' do + it 'adds given #comment attribute' do + expect { Cti::CallerId.maybe_add(attributes.merge(comment: 'foo')) } + .to change { Cti::CallerId.count }.by(1) + + expect(Cti::CallerId.last.comment).to eq('foo') + end + end + + context 'if matching record found' do + let(:attributes) { caller_id.attributes.symbolize_keys } + let(:caller_id) { create(:caller_id) } + + it 'ignores given #comment attribute' do + expect(Cti::CallerId.maybe_add(attributes.merge(comment: 'foo'))) + .to eq(caller_id) + + expect(caller_id.comment).to be_blank + end + end + end + describe 'callbacks' do subject!(:caller_id) { build(:cti_caller_id, caller_id: phone) } let(:phone) { '1234567890' } diff --git a/test/unit/cti_caller_id_test.rb b/test/unit/cti_caller_id_test.rb index 224651bbd..290d4bcb7 100644 --- a/test/unit/cti_caller_id_test.rb +++ b/test/unit/cti_caller_id_test.rb @@ -55,96 +55,6 @@ class CtiCallerIdTest < ActiveSupport::TestCase Scheduler.worker(true) end - test '2 lookups' do - - Cti::CallerId.destroy_all - - Cti::CallerId.maybe_add( - caller_id: '4999999999', - level: 'maybe', - user_id: 2, - object: 'Ticket', - o_id: 2, - ) - - Cti::CallerId.maybe_add( - caller_id: '4912345678901', - comment: 'Hairdresser Bob Smith, San Francisco', - level: 'public', - user_id: 2, - object: 'GoYello', - o_id: 1, - ) - - caller_ids = Cti::CallerId.lookup('4912345678901') - assert_equal(1, caller_ids.length) - assert_equal('public', caller_ids[0].level) - assert_equal(2, caller_ids[0].user_id) - assert_equal('Hairdresser Bob Smith, San Francisco', caller_ids[0].comment) - - Cti::CallerId.maybe_add( - caller_id: '4912345678901', - level: 'maybe', - user_id: 2, - object: 'Ticket', - o_id: 2, - ) - - caller_ids = Cti::CallerId.lookup('4912345678901') - assert_equal(1, caller_ids.length) - assert_equal('maybe', caller_ids[0].level) - assert_equal(2, caller_ids[0].user_id) - assert_nil(caller_ids[0].comment) - - Cti::CallerId.maybe_add( - caller_id: '4912345678901', - level: 'maybe', - user_id: 2, - object: 'Ticket', - o_id: 2, - ) - - caller_ids = Cti::CallerId.lookup('4912345678901') - assert_equal(1, caller_ids.length) - assert_equal('maybe', caller_ids[0].level) - assert_equal(2, caller_ids[0].user_id) - assert_nil(caller_ids[0].comment) - - user_id = User.find_by(login: 'ticket-caller_id-customer1@example.com').id - - Cti::CallerId.maybe_add( - caller_id: '4912345678901', - level: 'maybe', - user_id: user_id, - object: 'Ticket', - o_id: 2, - ) - - caller_ids = Cti::CallerId.lookup('4912345678901') - assert_equal(2, caller_ids.length) - assert_equal('maybe', caller_ids[0].level) - assert_equal(user_id, caller_ids[0].user_id) - assert_nil(caller_ids[0].comment) - assert_equal('maybe', caller_ids[1].level) - assert_equal(2, caller_ids[1].user_id) - assert_nil(caller_ids[1].comment) - - Cti::CallerId.maybe_add( - caller_id: '4912345678901', - level: 'known', - user_id: user_id, - object: 'User', - o_id: 2, - ) - - caller_ids = Cti::CallerId.lookup('4912345678901') - assert_equal(1, caller_ids.length) - assert_equal('known', caller_ids[0].level) - assert_equal(user_id, caller_ids[0].user_id) - assert_nil(caller_ids[0].comment) - - end - test '3 process - log' do ticket1 = Ticket.create!(