"""
Tests for the chat models.
"""
from django.utils import timezone

from chat.models import Message
from users.models import User


def test_message_is_unread():
    message = Message()

    assert message.unread


def test_message_is_not_unread():
    message = Message(read_at=timezone.now())

    assert not message.unread


def test_message_set_unread_inbox_gets_inbox(mocker):
    sender = User()
    recipient = User()
    message = Message(sender=sender, recipient=recipient)
    inbox_objects_mock = mocker.patch(
        "chat.models.Inbox.objects.get_or_create",
    )
    inbox_objects_mock.return_value = [mocker.Mock(), None]

    message.set_unread_inbox()

    inbox_objects_mock.assert_called_once_with(owner=recipient, sender=sender)


def test_message_set_unread_inbox_marks_inbox_as_unread(mocker):
    sender = User()
    recipient = User()
    message = Message(sender=sender, recipient=recipient)
    inbox_mock = mocker.Mock()
    inbox_objects_mock = mocker.patch(
        "chat.models.Inbox.objects.get_or_create",
    )
    inbox_objects_mock.return_value = [inbox_mock, None]

    message.set_unread_inbox()

    assert inbox_mock.has_unread
    inbox_mock.save.assert_called_once()


def test_message_get_sender_inbox(mocker):
    sender = User(username="sender")
    recipient = User(username="recipient")
    message = Message(sender=sender, recipient=recipient)
    inbox_objects_mock = mocker.patch(
        "chat.models.Inbox.objects.get_or_create",
    )
    inbox_objects_mock.return_value = [mocker.Mock(), None]

    message.get_sender_inbox()

    inbox_objects_mock.assert_called_with(owner=sender, sender=recipient)


def test_message_get_recipient_inbox(mocker):
    sender = User(username="sender")
    recipient = User(username="recipient")
    message = Message(sender=sender, recipient=recipient)
    inbox_objects_mock = mocker.patch(
        "chat.models.Inbox.objects.get_or_create",
    )
    inbox_objects_mock.return_value = [mocker.Mock(), None]

    message.get_recipient_inbox()

    inbox_objects_mock.assert_called_with(owner=recipient, sender=sender)


def test_message_add_message_to_inbox(mocker):
    sender = User(username="sender")
    recipient = User(username="recipient")
    message = Message(sender=sender, recipient=recipient)
    recipient_mock = mocker.patch.object(message, "get_recipient_inbox")
    sender_mock = mocker.patch.object(message, "get_sender_inbox")
    many_to_many_mock = mocker.patch(
        "django.db.models.fields.related_descriptors.create_forward_many_to_many_manager",
    )
    many_to_many_mock.return_value = mocker.Mock()

    message.add_message_to_inbox()

    message.inbox.add.assert_called_once_with(recipient_mock(), sender_mock())
