from unittest.mock import patch
from django.test import TestCase

from bookwyrm import models, broadcast


class Book(TestCase):
    def setUp(self):
        self.user = models.User.objects.create_user(
            'mouse', 'mouse@mouse.mouse', 'mouseword',
            local=True, localname='mouse')

        local_follower = models.User.objects.create_user(
            'joe', 'joe@mouse.mouse', 'jeoword',
            local=True, localname='joe')
        self.user.followers.add(local_follower)

        with patch('bookwyrm.models.user.set_remote_server.delay'):
            follower = models.User.objects.create_user(
                'rat', 'rat@mouse.mouse', 'ratword', local=False,
                remote_id='http://example.com/u/1',
                outbox='http://example.com/u/1/o',
                shared_inbox='http://example.com/inbox',
                inbox='http://example.com/u/1/inbox')
            self.user.followers.add(follower)

            no_inbox_follower = models.User.objects.create_user(
                'hamster', 'hamster@mouse.mouse', 'hamword',
                shared_inbox=None, local=False,
                remote_id='http://example.com/u/2',
                outbox='http://example.com/u/2/o',
                inbox='http://example.com/u/2/inbox')
            self.user.followers.add(no_inbox_follower)

            non_fr_follower = models.User.objects.create_user(
                'gerbil', 'gerb@mouse.mouse', 'gerbword',
                remote_id='http://example.com/u/3',
                outbox='http://example2.com/u/3/o',
                inbox='http://example2.com/u/3/inbox',
                shared_inbox='http://example2.com/inbox',
                bookwyrm_user=False, local=False)
            self.user.followers.add(non_fr_follower)

            models.User.objects.create_user(
                'nutria', 'nutria@mouse.mouse', 'nuword',
                remote_id='http://example.com/u/4',
                outbox='http://example.com/u/4/o',
                shared_inbox='http://example.com/inbox',
                inbox='http://example.com/u/4/inbox',
                local=False)


    def test_get_public_recipients(self):
        expected = [
            'http://example2.com/inbox',
            'http://example.com/inbox',
            'http://example.com/u/2/inbox',
        ]

        recipients = broadcast.get_public_recipients(self.user)
        self.assertEqual(recipients, expected)


    def test_get_public_recipients_software(self):
        expected = [
            'http://example.com/inbox',
            'http://example.com/u/2/inbox',
        ]

        recipients = broadcast.get_public_recipients(self.user, software='bookwyrm')
        self.assertEqual(recipients, expected)


    def test_get_public_recipients_software_other(self):
        expected = [
            'http://example2.com/inbox',
        ]

        recipients = broadcast.get_public_recipients(self.user, software='mastodon')
        self.assertEqual(recipients, expected)