mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-21 21:44:52 +00:00
fix: resolution count does not have account scope (#12370)
This commit is contained in:
@@ -40,6 +40,7 @@ class V2::Reports::Timeseries::CountReportBuilder < V2::Reports::Timeseries::Bas
|
|||||||
def scope_for_resolutions_count
|
def scope_for_resolutions_count
|
||||||
scope.reporting_events.where(
|
scope.reporting_events.where(
|
||||||
name: :conversation_resolved,
|
name: :conversation_resolved,
|
||||||
|
account_id: account.id,
|
||||||
created_at: range
|
created_at: range
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
@@ -47,6 +48,7 @@ class V2::Reports::Timeseries::CountReportBuilder < V2::Reports::Timeseries::Bas
|
|||||||
def scope_for_bot_resolutions_count
|
def scope_for_bot_resolutions_count
|
||||||
scope.reporting_events.where(
|
scope.reporting_events.where(
|
||||||
name: :conversation_bot_resolved,
|
name: :conversation_bot_resolved,
|
||||||
|
account_id: account.id,
|
||||||
created_at: range
|
created_at: range
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
@@ -54,6 +56,7 @@ class V2::Reports::Timeseries::CountReportBuilder < V2::Reports::Timeseries::Bas
|
|||||||
def scope_for_bot_handoffs_count
|
def scope_for_bot_handoffs_count
|
||||||
scope.reporting_events.joins(:conversation).select(:conversation_id).where(
|
scope.reporting_events.joins(:conversation).select(:conversation_id).where(
|
||||||
name: :conversation_bot_handoff,
|
name: :conversation_bot_handoff,
|
||||||
|
account_id: account.id,
|
||||||
created_at: range
|
created_at: range
|
||||||
).distinct
|
).distinct
|
||||||
end
|
end
|
||||||
|
|||||||
113
spec/builders/v2/reports/timeseries/count_report_builder_spec.rb
Normal file
113
spec/builders/v2/reports/timeseries/count_report_builder_spec.rb
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe V2::Reports::Timeseries::CountReportBuilder do
|
||||||
|
subject { described_class.new(account, params) }
|
||||||
|
|
||||||
|
let(:account) { create(:account) }
|
||||||
|
let(:account2) { create(:account) }
|
||||||
|
let(:user) { create(:user, email: 'agent1@example.com') }
|
||||||
|
let(:inbox) { create(:inbox, account: account) }
|
||||||
|
let(:inbox2) { create(:inbox, account: account2) }
|
||||||
|
let(:current_time) { Time.current }
|
||||||
|
|
||||||
|
let(:params) do
|
||||||
|
{
|
||||||
|
type: 'agent',
|
||||||
|
metric: 'resolutions_count',
|
||||||
|
since: (current_time - 1.day).beginning_of_day.to_i.to_s,
|
||||||
|
until: current_time.end_of_day.to_i.to_s,
|
||||||
|
id: user.id.to_s
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
before do
|
||||||
|
travel_to current_time
|
||||||
|
|
||||||
|
# Add the same user to both accounts
|
||||||
|
create(:account_user, account: account, user: user)
|
||||||
|
create(:account_user, account: account2, user: user)
|
||||||
|
|
||||||
|
# Create conversations in account1
|
||||||
|
conversation1 = create(:conversation, account: account, inbox: inbox, assignee: user)
|
||||||
|
conversation2 = create(:conversation, account: account, inbox: inbox, assignee: user)
|
||||||
|
|
||||||
|
# Create conversations in account2
|
||||||
|
conversation3 = create(:conversation, account: account2, inbox: inbox2, assignee: user)
|
||||||
|
conversation4 = create(:conversation, account: account2, inbox: inbox2, assignee: user)
|
||||||
|
|
||||||
|
# User resolves 2 conversations in account1
|
||||||
|
create(:reporting_event,
|
||||||
|
name: 'conversation_resolved',
|
||||||
|
account: account,
|
||||||
|
user: user,
|
||||||
|
conversation: conversation1,
|
||||||
|
created_at: current_time - 12.hours)
|
||||||
|
|
||||||
|
create(:reporting_event,
|
||||||
|
name: 'conversation_resolved',
|
||||||
|
account: account,
|
||||||
|
user: user,
|
||||||
|
conversation: conversation2,
|
||||||
|
created_at: current_time - 6.hours)
|
||||||
|
|
||||||
|
# Same user resolves 3 conversations in account2 - these should NOT be counted for account1
|
||||||
|
create(:reporting_event,
|
||||||
|
name: 'conversation_resolved',
|
||||||
|
account: account2,
|
||||||
|
user: user,
|
||||||
|
conversation: conversation3,
|
||||||
|
created_at: current_time - 8.hours)
|
||||||
|
|
||||||
|
create(:reporting_event,
|
||||||
|
name: 'conversation_resolved',
|
||||||
|
account: account2,
|
||||||
|
user: user,
|
||||||
|
conversation: conversation4,
|
||||||
|
created_at: current_time - 4.hours)
|
||||||
|
|
||||||
|
# Create another conversation in account2 for testing
|
||||||
|
conversation5 = create(:conversation, account: account2, inbox: inbox2, assignee: user)
|
||||||
|
create(:reporting_event,
|
||||||
|
name: 'conversation_resolved',
|
||||||
|
account: account2,
|
||||||
|
user: user,
|
||||||
|
conversation: conversation5,
|
||||||
|
created_at: current_time - 2.hours)
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#aggregate_value' do
|
||||||
|
it 'returns only resolutions performed by the user in the specified account' do
|
||||||
|
# User should have 2 resolutions in account1, not 5 (total across both accounts)
|
||||||
|
expect(subject.aggregate_value).to eq(2)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when querying account2' do
|
||||||
|
subject { described_class.new(account2, params) }
|
||||||
|
|
||||||
|
it 'returns only resolutions for account2' do
|
||||||
|
# User should have 3 resolutions in account2
|
||||||
|
expect(subject.aggregate_value).to eq(3)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#timeseries' do
|
||||||
|
it 'filters resolutions by account' do
|
||||||
|
result = subject.timeseries
|
||||||
|
# Should only count the 2 resolutions from account1
|
||||||
|
total_count = result.sum { |r| r[:value] }
|
||||||
|
expect(total_count).to eq(2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'account isolation' do
|
||||||
|
it 'does not leak data between accounts' do
|
||||||
|
# If account isolation works correctly, the counts should be different
|
||||||
|
account1_count = described_class.new(account, params).aggregate_value
|
||||||
|
account2_count = described_class.new(account2, params).aggregate_value
|
||||||
|
|
||||||
|
expect(account1_count).to eq(2)
|
||||||
|
expect(account2_count).to eq(3)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user