""" django configuration of postgres  """
from unittest.mock import patch
from django.test import TestCase

from bookwyrm import models


@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
class PostgresTriggers(TestCase):
    """special migrations, fancy stuff ya know"""

    def test_search_vector_on_create(self, _):
        """make sure that search_vector is being set correctly on create"""
        book = models.Edition.objects.create(title="The Long Goodbye")
        book.refresh_from_db()
        self.assertEqual(book.search_vector, "'goodby':3A 'long':2A")

    def test_search_vector_on_update(self, _):
        """make sure that search_vector is being set correctly on edit"""
        book = models.Edition.objects.create(title="The Long Goodbye")
        book.title = "The Even Longer Goodbye"
        book.save(broadcast=False)
        book.refresh_from_db()
        self.assertEqual(book.search_vector, "'even':2A 'goodby':4A 'longer':3A")

    def test_search_vector_fields(self, _):
        """use multiple fields to create search vector"""
        author = models.Author.objects.create(name="The Rays")
        book = models.Edition.objects.create(
            title="The Long Goodbye",
            subtitle="wow cool",
            series="series name",
            languages=["irrelevant"],
        )
        book.authors.add(author)
        book.refresh_from_db()
        # pylint: disable=line-too-long
        self.assertEqual(
            book.search_vector,
            "'cool':5B 'goodby':3A 'long':2A 'name':9 'rays':7C 'seri':8 'the':6C 'wow':4B",
        )

    def test_search_vector_on_author_update(self, _):
        """update search when an author name changes"""
        author = models.Author.objects.create(name="The Rays")
        book = models.Edition.objects.create(
            title="The Long Goodbye",
        )
        book.authors.add(author)
        author.name = "Jeremy"
        author.save(broadcast=False)
        book.refresh_from_db()

        self.assertEqual(book.search_vector, "'goodby':3A 'jeremy':4C 'long':2A")

    def test_search_vector_on_author_delete(self, _):
        """update search when an author name changes"""
        author = models.Author.objects.create(name="Jeremy")
        book = models.Edition.objects.create(
            title="The Long Goodbye",
        )

        book.authors.add(author)
        book.refresh_from_db()
        self.assertEqual(book.search_vector, "'goodby':3A 'jeremy':4C 'long':2A")

        book.authors.remove(author)
        book.refresh_from_db()
        self.assertEqual(book.search_vector, "'goodby':3A 'long':2A")

    def test_search_vector_stop_word_fallback(self, _):
        """use a fallback when removing stop words leads to an empty vector"""
        book = models.Edition.objects.create(
            title="there there",
        )
        book.refresh_from_db()
        self.assertEqual(book.search_vector, "'there':1A,2A")
