from django.test import TestCase from catalog.book.models import * from catalog.book.utils import * from catalog.common import * class BookTestCase(TestCase): databases = "__all__" def setUp(self): hyperion = Edition.objects.create(title="Hyperion") hyperion.pages = 500 hyperion.isbn = "9780553283686" hyperion.save() # hyperion.isbn10 = '0553283685' def test_url(self): hyperion = Edition.objects.get(title="Hyperion") hyperion2 = Edition.get_by_url(hyperion.url) self.assertEqual(hyperion, hyperion2) hyperion2 = Edition.get_by_url(hyperion.uuid) self.assertEqual(hyperion, hyperion2) hyperion2 = Edition.get_by_url("test/" + hyperion.uuid + "/test") self.assertEqual(hyperion, hyperion2) def test_properties(self): hyperion = Edition.objects.get(title="Hyperion") self.assertEqual(hyperion.title, "Hyperion") self.assertEqual(hyperion.pages, 500) self.assertEqual(hyperion.primary_lookup_id_type, IdType.ISBN) self.assertEqual(hyperion.primary_lookup_id_value, "9780553283686") andymion = Edition(title="Andymion", pages=42) self.assertEqual(andymion.pages, 42) def test_lookupids(self): hyperion = Edition.objects.get(title="Hyperion") hyperion.asin = "B004G60EHS" self.assertEqual(hyperion.primary_lookup_id_type, IdType.ASIN) self.assertEqual(hyperion.primary_lookup_id_value, "B004G60EHS") self.assertEqual(hyperion.isbn, None) self.assertEqual(hyperion.isbn10, None) def test_isbn(self): t, n = detect_isbn_asin("0553283685") self.assertEqual(t, IdType.ISBN) self.assertEqual(n, "9780553283686") t, n = detect_isbn_asin("9780553283686") self.assertEqual(t, IdType.ISBN) t, n = detect_isbn_asin(" b0043M6780") self.assertEqual(t, IdType.ASIN) hyperion = Edition.objects.get(title="Hyperion") self.assertEqual(hyperion.isbn, "9780553283686") self.assertEqual(hyperion.isbn10, "0553283685") hyperion.isbn10 = "0575099437" self.assertEqual(hyperion.isbn, "9780575099432") self.assertEqual(hyperion.isbn10, "0575099437") class WorkTestCase(TestCase): databases = "__all__" def setUp(self): self.hyperion_hardcover = Edition.objects.create( localized_title=[{"lang": "en", "text": "Hyperion"}] ) self.hyperion_hardcover.pages = 481 self.hyperion_hardcover.isbn = "9780385249492" self.hyperion_hardcover.save() self.hyperion_print = Edition.objects.create( localized_title=[{"lang": "en", "text": "Hyperion"}] ) self.hyperion_print.pages = 500 self.hyperion_print.isbn = "9780553283686" self.hyperion_print.save() self.hyperion_ebook = Edition(title="Hyperion") self.hyperion_ebook.asin = "B0043M6780" self.hyperion_ebook.save() self.andymion_print = Edition.objects.create( localized_title=[{"lang": "en", "text": "Andymion"}], pages=42 ) # serie = Serie(title="Hyperion Cantos") self.hyperion = Work(localized_title=[{"lang": "en", "text": "Hyperion"}]) self.hyperion.save() def test_work(self): self.assertFalse(self.hyperion_print.has_related_books()) self.hyperion.editions.add(self.hyperion_print) self.assertFalse(self.hyperion_print.has_related_books()) def test_merge(self): title1 = [{"lang": "zh", "text": "z"}] title2 = [{"lang": "en", "text": "e"}] w1 = Work.objects.create(localized_title=title1) w2 = Work.objects.create(localized_title=title2) w2.merge_to(w1) self.assertEqual(len(w1.localized_title), 2) def test_link(self): self.hyperion_print.link_to_related_book(self.hyperion_ebook) self.assertTrue(self.hyperion_print.has_related_books()) self.assertTrue(self.hyperion_ebook.has_related_books()) self.assertTrue(self.hyperion_print.has_works()) self.assertEqual( self.hyperion_print.works.first().display_title, self.hyperion_print.display_title, ) self.hyperion_print.unlink_from_all_works() self.assertFalse(self.hyperion_print.has_related_books()) self.assertFalse(self.hyperion_ebook.has_related_books()) self.hyperion_print.link_to_related_book(self.hyperion_ebook) self.assertTrue(self.hyperion_print.has_related_books()) self.assertTrue(self.hyperion_ebook.has_related_books()) self.hyperion_ebook.unlink_from_all_works() self.assertFalse(self.hyperion_print.has_related_books()) self.assertFalse(self.hyperion_ebook.has_related_books()) def test_link3(self): self.hyperion_print.link_to_related_book(self.hyperion_ebook) self.hyperion_ebook.link_to_related_book(self.hyperion_hardcover) self.hyperion_print.link_to_related_book(self.hyperion_hardcover) self.assertTrue(self.hyperion_print.has_works()) self.assertEqual(self.hyperion_print.works.all().count(), 1) self.assertEqual( self.hyperion_ebook.works.all().first().editions.all().count(), 3 ) class GoodreadsTestCase(TestCase): databases = "__all__" def setUp(self): pass def test_parse(self): t_type = IdType.Goodreads t_id = "77566" t_url = "https://www.goodreads.com/zh/book/show/77566.Hyperion" t_url2 = "https://www.goodreads.com/book/show/77566" p1 = SiteManager.get_site_cls_by_id_type(t_type) p2 = SiteManager.get_site_by_url(t_url) self.assertEqual(p1.id_to_url(t_id), t_url2) self.assertEqual(p2.url_to_id(t_url), t_id) @use_local_response def test_scrape(self): t_url = "https://www.goodreads.com/book/show/77566.Hyperion" t_url2 = "https://www.goodreads.com/book/show/77566" isbn = "9780553283686" site = SiteManager.get_site_by_url(t_url) self.assertEqual(site.ready, False) self.assertEqual(site.url, t_url2) site.get_resource() self.assertEqual(site.ready, False) self.assertIsNotNone(site.resource) site.get_resource_ready() self.assertEqual(site.ready, True) self.assertEqual(site.resource.metadata.get("title"), "Hyperion") self.assertEqual(site.resource.get_all_lookup_ids().get(IdType.ISBN), isbn) self.assertEqual(site.resource.required_resources[0]["id_value"], "1383900") edition = Edition.objects.get( primary_lookup_id_type=IdType.ISBN, primary_lookup_id_value=isbn ) resource = edition.external_resources.all().first() self.assertEqual(resource.id_type, IdType.Goodreads) self.assertEqual(resource.id_value, "77566") self.assertNotEqual(resource.cover, "/media/item/default.svg") self.assertEqual(edition.isbn, "9780553283686") self.assertEqual(edition.format, "paperback") self.assertEqual(edition.display_title, "Hyperion") edition.delete() site = SiteManager.get_site_by_url(t_url) self.assertEqual(site.ready, False) self.assertEqual(site.url, t_url2) site.get_resource() self.assertEqual( site.ready, True, "previous resource should still exist with data" ) @use_local_response def test_scrape2(self): site = SiteManager.get_site_by_url( "https://www.goodreads.com/book/show/13079982-fahrenheit-451" ) site.get_resource_ready() self.assertNotIn("