Add book search test cases for author aliases

This commit is contained in:
Bart Schuurmans 2024-03-22 21:43:28 +01:00
parent 36222afa79
commit 769d9726e5

View file

@ -14,6 +14,13 @@ class BookSearch(TestCase):
@classmethod @classmethod
def setUpTestData(self): # pylint: disable=bad-classmethod-argument def setUpTestData(self): # pylint: disable=bad-classmethod-argument
"""we need basic test data and mocks""" """we need basic test data and mocks"""
self.first_author = models.Author.objects.create(
name="Author One", aliases=["The First"]
)
self.second_author = models.Author.objects.create(
name="Author Two", aliases=["The Second"]
)
self.work = models.Work.objects.create(title="Example Work") self.work = models.Work.objects.create(title="Example Work")
self.first_edition = models.Edition.objects.create( self.first_edition = models.Edition.objects.create(
@ -23,6 +30,8 @@ class BookSearch(TestCase):
physical_format="Paperback", physical_format="Paperback",
published_date=datetime.datetime(2019, 4, 9, 0, 0, tzinfo=timezone.utc), published_date=datetime.datetime(2019, 4, 9, 0, 0, tzinfo=timezone.utc),
) )
self.first_edition.authors.add(self.first_author)
self.second_edition = models.Edition.objects.create( self.second_edition = models.Edition.objects.create(
title="Another Edition", title="Another Edition",
parent_work=self.work, parent_work=self.work,
@ -30,19 +39,34 @@ class BookSearch(TestCase):
openlibrary_key="hello", openlibrary_key="hello",
pages=150, pages=150,
) )
self.second_edition.authors.add(self.first_author)
self.second_edition.authors.add(self.second_author)
self.third_edition = models.Edition.objects.create( self.third_edition = models.Edition.objects.create(
title="Another Edition with annoying ISBN", title="Another Edition with annoying ISBN",
parent_work=self.work, parent_work=self.work,
isbn_10="022222222X", isbn_10="022222222X",
) )
self.third_edition.authors.add(self.first_author)
self.third_edition.authors.add(self.second_author)
def test_search(self): def test_search(self):
"""search for a book in the db""" """search for a book in the db"""
# title/author # title
results = book_search.search("Example") results = book_search.search("Example")
self.assertEqual(len(results), 1) self.assertEqual(len(results), 1)
self.assertEqual(results[0], self.first_edition) self.assertEqual(results[0], self.first_edition)
# author
results = book_search.search("One")
self.assertEqual(len(results), 1)
self.assertEqual(results[0], self.first_edition)
# author alias
results = book_search.search("First")
self.assertEqual(len(results), 1)
self.assertEqual(results[0], self.first_edition)
# isbn # isbn
results = book_search.search("0000000000") results = book_search.search("0000000000")
self.assertEqual(len(results), 1) self.assertEqual(len(results), 1)
@ -155,8 +179,17 @@ class SearchVectorTest(TestCase):
"""search vector with subtitle and series""" """search vector with subtitle and series"""
# for a book like this we call `to_tsvector("Book Long Mary Bunch")`, hence the # for a book like this we call `to_tsvector("Book Long Mary Bunch")`, hence the
# indexes in the search vector. (priority "D" is the default, and never shown.) # indexes in the search vector. (priority "D" is the default, and never shown.)
book = self._create_book("Book", "Mary", subtitle="Long", series="Bunch") book = self._create_book(
self.assertEqual(book.search_vector, "'book':1A 'bunch':4 'long':2B 'mary':3C") "Book",
"Mary",
subtitle="Long",
series="Bunch",
author_alias=["Maria", "Mary Ann"],
)
self.assertEqual(
book.search_vector,
"'ann':6C 'book':1A 'bunch':7 'long':2B 'maria':4C 'mary':3C,5C",
)
def test_search_vector_parse_book(self): def test_search_vector_parse_book(self):
"""book parts are parsed in english""" """book parts are parsed in english"""
@ -170,8 +203,8 @@ class SearchVectorTest(TestCase):
def test_search_vector_parse_author(self): def test_search_vector_parse_author(self):
"""author name is not stem'd or affected by stop words""" """author name is not stem'd or affected by stop words"""
book = self._create_book("Writing", "Writes") book = self._create_book("Writing", "Writes", author_alias=["Reads"])
self.assertEqual(book.search_vector, "'write':1A 'writes':2C") self.assertEqual(book.search_vector, "'reads':3C 'write':1A 'writes':2C")
book = self._create_book("She Is Writing", "She Writes") book = self._create_book("She Is Writing", "She Writes")
self.assertEqual(book.search_vector, "'she':4C 'write':3A 'writes':5C") self.assertEqual(book.search_vector, "'she':4C 'write':3A 'writes':5C")
@ -218,6 +251,13 @@ class SearchVectorTest(TestCase):
book.refresh_from_db() book.refresh_from_db()
self.assertEqual(book.search_vector, "'goodby':3A 'jeremy':4C 'long':2A") self.assertEqual(book.search_vector, "'goodby':3A 'jeremy':4C 'long':2A")
author.aliases = ["Example"]
author.save(broadcast=False)
book.refresh_from_db()
self.assertEqual(
book.search_vector, "'example':5C 'goodby':3A 'jeremy':4C 'long':2A"
)
def test_search_vector_on_author_delete(self): def test_search_vector_on_author_delete(self):
"""update search when an author is deleted""" """update search when an author is deleted"""
book = self._create_book("The Long Goodbye", "The Rays") book = self._create_book("The Long Goodbye", "The Rays")
@ -274,7 +314,7 @@ class SearchVectorUpdates(TestCase):
def setUp(self): def setUp(self):
"""we need basic test data and mocks""" """we need basic test data and mocks"""
self.work = models.Work.objects.create(title="This Work") self.work = models.Work.objects.create(title="This Work")
self.author = models.Author.objects.create(name="Name") self.author = models.Author.objects.create(name="Name", aliases=["Alias"])
self.edition = models.Edition.objects.create( self.edition = models.Edition.objects.create(
title="First Edition of Work", title="First Edition of Work",
subtitle="Some Extra Words Are Good", subtitle="Some Extra Words Are Good",
@ -363,13 +403,18 @@ class SearchVectorUpdates(TestCase):
def test_search_after_updated_author_name(self): def test_search_after_updated_author_name(self):
"""book found under new author name""" """book found under new author name"""
self.assertEqual(self.edition, self._search_first("Name")) self.assertEqual(self.edition, self._search_first("Name"))
self.assertEqual(self.edition, self._search_first("Alias"))
self.assertFalse(self._search("Identifier")) self.assertFalse(self._search("Identifier"))
self.assertFalse(self._search("Another"))
self.author.name = "Identifier" self.author.name = "Identifier"
self.author.aliases = ["Another"]
self.author.save(broadcast=False) self.author.save(broadcast=False)
self.assertFalse(self._search("Name")) self.assertFalse(self._search("Name"))
self.assertFalse(self._search("Aliases"))
self.assertEqual(self.edition, self._search_first("Identifier")) self.assertEqual(self.edition, self._search_first("Identifier"))
self.assertEqual(self.edition, self._search_first("Another"))
self.assertEqual(self.edition, self._search_first("Work")) self.assertEqual(self.edition, self._search_first("Work"))
def _search_first(self, query): def _search_first(self, query):