# frozen_string_literal: true

require 'rails_helper'

RSpec.describe Notification do
  context 'with associations' do
    it { is_expected.to belong_to(:account) }
    it { is_expected.to belong_to(:user) }
  end

  context 'with default order by' do
    it 'sort by primary id desc' do
      notification1 = create(:notification)
      create(:notification)
      notification3 = create(:notification)

      expect(described_class.all.first).to eq notification3
      expect(described_class.all.last).to eq notification1
    end
  end

  context 'when push_title is called' do
    it 'returns appropriate title suited for the notification type conversation_creation' do
      notification = create(:notification, notification_type: 'conversation_creation')

      expect(notification.push_message_title).to eq "[New conversation] - ##{notification.primary_actor.display_id} has\
 been created in #{notification.primary_actor.inbox.name}"
    end

    it 'returns appropriate title suited for the notification type conversation_assignment' do
      notification = create(:notification, notification_type: 'conversation_assignment')

      expect(notification.push_message_title).to eq "[Assigned to you] - ##{notification.primary_actor.display_id} has been assigned to you"
    end

    it 'returns appropriate title suited for the notification type assigned_conversation_new_message' do
      message = create(:message, sender: create(:user), content: Faker::Lorem.paragraphs(number: 2))
      notification = create(:notification, notification_type: 'assigned_conversation_new_message', primary_actor: message)

      expect(notification.push_message_title).to eq "[New message] - ##{notification.conversation.display_id} \
#{message.content.truncate_words(10)}"
    end

    it 'returns appropriate title suited for the notification type assigned_conversation_new_message when attachment message' do
      # checking content nil should be suffice for attachments
      message = create(:message, sender: create(:user), content: nil)
      notification = create(:notification, notification_type: 'assigned_conversation_new_message', primary_actor: message)

      expect(notification.push_message_title).to eq "[New message] - ##{notification.conversation.display_id} "
    end

    it 'returns appropriate title suited for the notification type conversation_mention' do
      message = create(:message, sender: create(:user), content: 'Hey [@John](mention://user/1/john), can you check this ticket?')
      notification = create(:notification, notification_type: 'conversation_mention', primary_actor: message, secondary_actor: message.sender)

      expect(notification.push_message_title).to eq "[##{message.conversation.display_id}] Hey @John, can you check this ticket?"
    end

    it 'returns appropriate title suited for the notification type conversation_mention having multiple mentions' do
      message = create(
        :message, sender:
        create(:user),
                  content: 'Hey [@John](mention://user/1/john), [@Alisha Peter](mention://user/2/alisha) can you check this ticket?'
      )
      notification = create(:notification, notification_type: 'conversation_mention', primary_actor: message, secondary_actor: message.sender)

      expect(notification.push_message_title).to eq "[##{message.conversation.display_id}] Hey @John, @Alisha Peter can you check this ticket?"
    end

    it 'returns appropriate title suited for the notification type conversation_mention if username contains white space' do
      message = create(
        :message, sender:
        create(:user),
                  content: 'Hey [@John Peter](mention://user/1/john%20K) please check this?'
      )
      notification = create(:notification, notification_type: 'conversation_mention', primary_actor: message, secondary_actor: message.sender)

      expect(notification.push_message_title).to eq "[##{message.conversation.display_id}] Hey @John Peter please check this?"
    end
  end
end
