diff --git a/app/listeners/reporting_event_listener.rb b/app/listeners/reporting_event_listener.rb index 0b5d09d2e..1792ef09f 100644 --- a/app/listeners/reporting_event_listener.rb +++ b/app/listeners/reporting_event_listener.rb @@ -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 diff --git a/spec/listeners/reporting_event_listener_spec.rb b/spec/listeners/reporting_event_listener_spec.rb index 690343ed4..037455221 100644 --- a/spec/listeners/reporting_event_listener_spec.rb +++ b/spec/listeners/reporting_event_listener_spec.rb @@ -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