fix: contacts count on filter (#7446)

- Fixes the wrong count shown during the contact filter when contact has multiple labels associated.
This commit is contained in:
OMAR.A
2023-07-26 17:31:04 +03:00
committed by GitHub
parent f8ae6cd95c
commit 1d8341504a
2 changed files with 31 additions and 20 deletions

View File

@@ -54,7 +54,7 @@ class Contacts::FilterService < FilterService
end
def base_relation
Current.account.contacts.left_outer_joins(:labels)
Current.account.contacts.distinct(:id).left_outer_joins(:labels)
end
private

View File

@@ -4,17 +4,17 @@ describe Contacts::FilterService do
subject(:filter_service) { described_class }
let!(:account) { create(:account) }
let!(:user_1) { create(:user, account: account) }
let!(:user_2) { create(:user, account: account) }
let!(:first_user) { create(:user, account: account) }
let!(:second_user) { create(:user, account: account) }
let!(:inbox) { create(:inbox, account: account, enable_auto_assignment: false) }
let(:en_contact) { create(:contact, account: account, additional_attributes: { 'browser_language': 'en' }) }
let(:el_contact) { create(:contact, account: account, additional_attributes: { 'browser_language': 'el' }) }
let(:cs_contact) { create(:contact, account: account, additional_attributes: { 'browser_language': 'cs' }) }
before do
create(:inbox_member, user: user_1, inbox: inbox)
create(:inbox_member, user: user_2, inbox: inbox)
create(:conversation, account: account, inbox: inbox, assignee: user_1, contact: en_contact)
create(:inbox_member, user: first_user, inbox: inbox)
create(:inbox_member, user: second_user, inbox: inbox)
create(:conversation, account: account, inbox: inbox, assignee: first_user, contact: en_contact)
create(:conversation, account: account, inbox: inbox)
Current.account = account
@@ -55,12 +55,6 @@ describe Contacts::FilterService do
attribute_key: 'browser_language',
filter_operator: 'equal_to',
values: ['en'],
query_operator: 'OR'
}.with_indifferent_access,
{
attribute_key: 'name',
filter_operator: 'equal_to',
values: [en_contact.name],
query_operator: nil
}.with_indifferent_access
]
@@ -68,8 +62,25 @@ describe Contacts::FilterService do
it 'filter contacts by additional_attributes' do
params[:payload] = payload
result = filter_service.new(params, user_1).perform
expect(result[:count]).to be 2
result = filter_service.new(params, first_user).perform
expect(result[:count]).to be 1
expect(result[:contacts].first.id).to eq(en_contact.id)
end
it 'filter contacts by name' do
params[:payload] = [
{
attribute_key: 'name',
filter_operator: 'equal_to',
values: [en_contact.name],
query_operator: nil
}.with_indifferent_access
]
result = filter_service.new(params, first_user).perform
expect(result[:count]).to be 1
expect(result[:contacts].length).to be 1
expect(result[:contacts].first.name).to eq(en_contact.name)
end
it 'filter contact by tags' do
@@ -83,7 +94,7 @@ describe Contacts::FilterService do
}.with_indifferent_access
]
result = filter_service.new(params, user_1).perform
result = filter_service.new(params, first_user).perform
expect(result[:contacts].length).to be 2
expect(result[:contacts].first.label_list).to include('support')
expect(result[:contacts].last.label_list).to include('support')
@@ -111,7 +122,7 @@ describe Contacts::FilterService do
query_operator: nil
}.with_indifferent_access
]
result = filter_service.new(params, user_1).perform
result = filter_service.new(params, first_user).perform
expect(result[:contacts].length).to be 1
expect(result[:contacts].first.id).to eq(cs_contact.id)
end
@@ -137,7 +148,7 @@ describe Contacts::FilterService do
query_operator: nil
}.with_indifferent_access
]
result = filter_service.new(params, user_1).perform
result = filter_service.new(params, first_user).perform
expect(result[:contacts].length).to be 1
expect(result[:contacts].first.id).to eq(el_contact.id)
end
@@ -158,7 +169,7 @@ describe Contacts::FilterService do
query_operator: nil
}.with_indifferent_access
]
result = filter_service.new(params, user_1).perform
result = filter_service.new(params, first_user).perform
expected_count = Contact.where("created_at < ? AND custom_attributes->>'customer_type' = ?", Date.tomorrow, 'platinum').count
expect(result[:contacts].length).to be expected_count
@@ -196,7 +207,7 @@ describe Contacts::FilterService do
'test custom data'
).count
result = filter_service.new(params, user_1).perform
result = filter_service.new(params, first_user).perform
expect(result[:contacts].length).to be expected_count
expect(result[:contacts].first.id).to eq(el_contact.id)
end
@@ -213,7 +224,7 @@ describe Contacts::FilterService do
expected_count = Contact.where('last_activity_at < ?', (Time.zone.today - 2.days)).count
result = filter_service.new(params, user_1).perform
result = filter_service.new(params, first_user).perform
expect(result[:contacts].length).to be expected_count
expect(result[:contacts].pluck(:id)).to include(el_contact.id)
expect(result[:contacts].pluck(:id)).to include(cs_contact.id)