test: conversation assigned event

This commit is contained in:
Shivam Mishra
2025-08-11 20:23:58 +05:30
parent 2231640580
commit a55e951206
2 changed files with 69 additions and 8 deletions
@@ -110,23 +110,15 @@ class ReportingEventListener < BaseListener
def conversation_assigned(event)
conversation = extract_conversation_and_account(event)[0]
previous_changes = event.data[:changed_attributes] || {}
puts "DEBUG: previous_changes = #{previous_changes.inspect}"
return unless previous_changes['assignee_id']
puts "DEBUG: assignee_changed_to_assigned? = #{assignee_changed_to_assigned?(previous_changes)}"
puts "DEBUG: assignee_changed_to_unassigned? = #{assignee_changed_to_unassigned?(previous_changes)}"
if assignee_changed_to_assigned?(previous_changes)
puts 'DEBUG: Creating assignment event'
assignment_time_data = calculate_assignment_time(conversation, previous_changes)
puts "DEBUG: assignment_time_data = #{assignment_time_data.inspect}"
create_assignment_event(conversation, assignment_time_data)
elsif assignee_changed_to_unassigned?(previous_changes)
puts 'DEBUG: Creating unassignment event'
create_unassignment_event(conversation)
else
# Re-assignment: user to different user
puts 'DEBUG: Creating re-assignment event with value 0'
reassignment_data = { value: 0, business_hours_value: 0, start_time: conversation.updated_at }
create_assignment_event(conversation, reassignment_data)
end
@@ -10,6 +10,75 @@ describe ReportingEventListener do
account: account, inbox: inbox, conversation: conversation)
end
describe '#conversation_assigned' do
it 'creates conversation_assigned event on first assignment' do
# Create conversation without assignee
test_conversation = create(:conversation, account: account, inbox: inbox, assignee: nil)
expect(account.reporting_events.where(name: 'conversation_assigned').count).to be 0
# Simulate assignment 10 seconds later
travel_to 10.seconds.from_now do
test_conversation.update!(assignee: user)
event = Events::Base.new('conversation.updated', Time.zone.now, conversation: test_conversation,
changed_attributes: { 'assignee_id' => [nil, user.id] })
listener.conversation_assigned(event)
end
expect(account.reporting_events.where(name: 'conversation_assigned').count).to be 1
assigned_event = account.reporting_events.where(name: 'conversation_assigned').first
expect(assigned_event.user_id).to eq user.id
expect(assigned_event.value).to be_within(1).of(10)
end
it 'creates conversation_assigned event with value 0 on re-assignment' do
conversation.update!(assignee: user)
other_user = create(:user, account: account)
# Update conversation to new assignee
conversation.update!(assignee: other_user)
event = Events::Base.new('conversation.updated', Time.zone.now, conversation: conversation,
changed_attributes: { 'assignee_id' => [user.id, other_user.id] })
listener.conversation_assigned(event)
reassigned_event = account.reporting_events.where(name: 'conversation_assigned').first
expect(reassigned_event.user_id).to eq other_user.id
expect(reassigned_event.value).to eq 0
end
it 'creates conversation_assigned event with nil user_id on unassignment' do
conversation.update!(assignee: user)
conversation.update!(assignee: nil)
event = Events::Base.new('conversation.updated', Time.zone.now, conversation: conversation,
changed_attributes: { 'assignee_id' => [user.id, nil] })
listener.conversation_assigned(event)
unassigned_event = account.reporting_events.where(name: 'conversation_assigned').first
expect(unassigned_event.user_id).to be_nil
expect(unassigned_event.value).to eq 0
end
it 'calculates correct time for assignment after unassignment' do
conversation.update!(assignee: user)
# Create unassignment event first
event = Events::Base.new('conversation.updated', Time.zone.now, conversation: conversation,
changed_attributes: { 'assignee_id' => [user.id, nil] })
listener.conversation_assigned(event)
travel_to 5.minutes.from_now do
conversation.update!(assignee: user, updated_at: Time.zone.now)
event = Events::Base.new('conversation.updated', Time.zone.now, conversation: conversation,
changed_attributes: { 'assignee_id' => [nil, user.id] })
listener.conversation_assigned(event)
reassigned_event = account.reporting_events.where(name: 'conversation_assigned').last
expect(reassigned_event.user_id).to eq user.id
expect(reassigned_event.value).to be_within(5).of(300) # 5 minutes
end
end
end
describe '#conversation_created' do
it 'creates conversation_created event' do
expect(account.reporting_events.where(name: 'conversation_created').count).to be 0