2022-12-07 19:09:05 -05:00
|
|
|
from django.test import TestCase
|
2023-08-10 11:27:31 -04:00
|
|
|
|
2022-12-16 07:58:34 -05:00
|
|
|
from catalog.book.utils import *
|
2022-12-07 19:09:05 -05:00
|
|
|
from catalog.common import *
|
2025-01-18 11:47:05 -05:00
|
|
|
from catalog.models import *
|
2022-12-07 19:09:05 -05:00
|
|
|
|
|
|
|
|
|
|
|
class BookTestCase(TestCase):
|
2024-04-08 20:25:14 -04:00
|
|
|
databases = "__all__"
|
|
|
|
|
2022-12-07 19:09:05 -05:00
|
|
|
def setUp(self):
|
2025-01-18 11:47:05 -05:00
|
|
|
hyperion = Edition.objects.create(
|
|
|
|
title="Hyperion", localized_title=[{"lang": "en", "text": "Hyperion"}]
|
|
|
|
)
|
2022-12-07 19:09:05 -05:00
|
|
|
hyperion.pages = 500
|
2022-12-29 23:57:02 -05:00
|
|
|
hyperion.isbn = "9780553283686"
|
2022-12-07 19:09:05 -05:00
|
|
|
hyperion.save()
|
|
|
|
# hyperion.isbn10 = '0553283685'
|
2025-01-18 11:47:05 -05:00
|
|
|
self.hbla = ExternalResource.objects.create(
|
|
|
|
item=hyperion,
|
|
|
|
id_type=IdType.Goodreads,
|
|
|
|
id_value="77566",
|
|
|
|
metadata={
|
|
|
|
"localized_title": [
|
|
|
|
{"lang": "en", "text": "Hyperion"},
|
|
|
|
{"lang": "zh", "text": "海伯利安"},
|
|
|
|
]
|
|
|
|
},
|
|
|
|
)
|
2022-12-07 19:09:05 -05:00
|
|
|
|
2022-12-11 23:20:28 +00:00
|
|
|
def test_url(self):
|
|
|
|
hyperion = Edition.objects.get(title="Hyperion")
|
|
|
|
hyperion2 = Edition.get_by_url(hyperion.url)
|
|
|
|
self.assertEqual(hyperion, hyperion2)
|
2023-01-10 11:22:42 -05:00
|
|
|
hyperion2 = Edition.get_by_url(hyperion.uuid)
|
|
|
|
self.assertEqual(hyperion, hyperion2)
|
|
|
|
hyperion2 = Edition.get_by_url("test/" + hyperion.uuid + "/test")
|
|
|
|
self.assertEqual(hyperion, hyperion2)
|
2022-12-11 23:20:28 +00:00
|
|
|
|
2022-12-07 19:09:05 -05:00
|
|
|
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)
|
2022-12-29 23:57:02 -05:00
|
|
|
self.assertEqual(hyperion.primary_lookup_id_value, "9780553283686")
|
2022-12-07 19:09:05 -05:00
|
|
|
andymion = Edition(title="Andymion", pages=42)
|
|
|
|
self.assertEqual(andymion.pages, 42)
|
|
|
|
|
|
|
|
def test_lookupids(self):
|
|
|
|
hyperion = Edition.objects.get(title="Hyperion")
|
2022-12-29 23:57:02 -05:00
|
|
|
hyperion.asin = "B004G60EHS"
|
2022-12-07 19:09:05 -05:00
|
|
|
self.assertEqual(hyperion.primary_lookup_id_type, IdType.ASIN)
|
2022-12-29 23:57:02 -05:00
|
|
|
self.assertEqual(hyperion.primary_lookup_id_value, "B004G60EHS")
|
2022-12-07 19:09:05 -05:00
|
|
|
self.assertEqual(hyperion.isbn, None)
|
|
|
|
self.assertEqual(hyperion.isbn10, None)
|
|
|
|
|
|
|
|
def test_isbn(self):
|
2022-12-29 23:57:02 -05:00
|
|
|
t, n = detect_isbn_asin("0553283685")
|
2022-12-16 07:58:34 -05:00
|
|
|
self.assertEqual(t, IdType.ISBN)
|
2022-12-29 23:57:02 -05:00
|
|
|
self.assertEqual(n, "9780553283686")
|
|
|
|
t, n = detect_isbn_asin("9780553283686")
|
2022-12-16 07:58:34 -05:00
|
|
|
self.assertEqual(t, IdType.ISBN)
|
2022-12-29 23:57:02 -05:00
|
|
|
t, n = detect_isbn_asin(" b0043M6780")
|
2022-12-16 07:58:34 -05:00
|
|
|
self.assertEqual(t, IdType.ASIN)
|
|
|
|
|
2022-12-07 19:09:05 -05:00
|
|
|
hyperion = Edition.objects.get(title="Hyperion")
|
2022-12-29 23:57:02 -05:00
|
|
|
self.assertEqual(hyperion.isbn, "9780553283686")
|
|
|
|
self.assertEqual(hyperion.isbn10, "0553283685")
|
|
|
|
hyperion.isbn10 = "0575099437"
|
|
|
|
self.assertEqual(hyperion.isbn, "9780575099432")
|
|
|
|
self.assertEqual(hyperion.isbn10, "0575099437")
|
2022-12-07 19:09:05 -05:00
|
|
|
|
2025-01-18 11:47:05 -05:00
|
|
|
def test_merge_external_resources(self):
|
|
|
|
hyperion = Edition.objects.get(title="Hyperion")
|
|
|
|
hyperion.merge_data_from_external_resource(self.hbla)
|
|
|
|
self.assertEqual(hyperion.localized_title, [{"lang": "en", "text": "Hyperion"}])
|
|
|
|
self.assertEqual(hyperion.other_title, ["海伯利安"])
|
|
|
|
|
2024-04-08 20:25:14 -04:00
|
|
|
|
|
|
|
class WorkTestCase(TestCase):
|
|
|
|
databases = "__all__"
|
|
|
|
|
|
|
|
def setUp(self):
|
2024-07-13 18:14:40 -04:00
|
|
|
self.hyperion_hardcover = Edition.objects.create(
|
|
|
|
localized_title=[{"lang": "en", "text": "Hyperion"}]
|
|
|
|
)
|
2024-04-08 20:25:14 -04:00
|
|
|
self.hyperion_hardcover.pages = 481
|
|
|
|
self.hyperion_hardcover.isbn = "9780385249492"
|
|
|
|
self.hyperion_hardcover.save()
|
2024-07-13 18:14:40 -04:00
|
|
|
self.hyperion_print = Edition.objects.create(
|
|
|
|
localized_title=[{"lang": "en", "text": "Hyperion"}]
|
|
|
|
)
|
2024-04-08 20:25:14 -04:00
|
|
|
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()
|
2024-07-13 18:14:40 -04:00
|
|
|
self.andymion_print = Edition.objects.create(
|
|
|
|
localized_title=[{"lang": "en", "text": "Andymion"}], pages=42
|
|
|
|
)
|
2022-12-07 19:09:05 -05:00
|
|
|
# serie = Serie(title="Hyperion Cantos")
|
2024-07-13 18:14:40 -04:00
|
|
|
self.hyperion = Work(localized_title=[{"lang": "en", "text": "Hyperion"}])
|
2024-04-08 20:25:14 -04:00
|
|
|
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())
|
|
|
|
|
2024-04-09 15:47:27 -04:00
|
|
|
def test_merge(self):
|
2024-07-13 01:36:18 -04:00
|
|
|
title1 = [{"lang": "zh", "text": "z"}]
|
|
|
|
title2 = [{"lang": "en", "text": "e"}]
|
2024-07-13 18:14:40 -04:00
|
|
|
w1 = Work.objects.create(localized_title=title1)
|
|
|
|
w2 = Work.objects.create(localized_title=title2)
|
2024-04-09 15:47:27 -04:00
|
|
|
w2.merge_to(w1)
|
2024-07-13 01:36:18 -04:00
|
|
|
self.assertEqual(len(w1.localized_title), 2)
|
2024-04-09 15:47:27 -04:00
|
|
|
|
2024-04-08 20:25:14 -04:00
|
|
|
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(
|
2024-07-13 18:14:40 -04:00
|
|
|
self.hyperion_print.works.first().display_title,
|
|
|
|
self.hyperion_print.display_title,
|
2024-04-08 20:25:14 -04:00
|
|
|
)
|
|
|
|
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
|
|
|
|
)
|
2022-12-07 19:09:05 -05:00
|
|
|
|
|
|
|
|
|
|
|
class GoodreadsTestCase(TestCase):
|
2024-04-08 20:25:14 -04:00
|
|
|
databases = "__all__"
|
|
|
|
|
2022-12-07 19:09:05 -05:00
|
|
|
def setUp(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def test_parse(self):
|
|
|
|
t_type = IdType.Goodreads
|
2022-12-29 23:57:02 -05:00
|
|
|
t_id = "77566"
|
|
|
|
t_url = "https://www.goodreads.com/zh/book/show/77566.Hyperion"
|
|
|
|
t_url2 = "https://www.goodreads.com/book/show/77566"
|
2023-06-05 10:06:16 -04:00
|
|
|
p1 = SiteManager.get_site_cls_by_id_type(t_type)
|
2022-12-15 17:29:35 -05:00
|
|
|
p2 = SiteManager.get_site_by_url(t_url)
|
2022-12-07 19:09:05 -05:00
|
|
|
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):
|
2022-12-29 23:57:02 -05:00
|
|
|
t_url = "https://www.goodreads.com/book/show/77566.Hyperion"
|
|
|
|
t_url2 = "https://www.goodreads.com/book/show/77566"
|
|
|
|
isbn = "9780553283686"
|
2025-02-28 06:19:35 -05:00
|
|
|
site = SiteManager.get_site_by_url(t_url, False)
|
|
|
|
self.assertIsNotNone(site)
|
2022-12-07 19:09:05 -05:00
|
|
|
self.assertEqual(site.ready, False)
|
|
|
|
self.assertEqual(site.url, t_url2)
|
2022-12-08 16:08:59 +00:00
|
|
|
site.get_resource()
|
2022-12-07 19:09:05 -05:00
|
|
|
self.assertEqual(site.ready, False)
|
2022-12-08 16:08:59 +00:00
|
|
|
self.assertIsNotNone(site.resource)
|
|
|
|
site.get_resource_ready()
|
2022-12-07 19:09:05 -05:00
|
|
|
self.assertEqual(site.ready, True)
|
2022-12-29 23:57:02 -05:00
|
|
|
self.assertEqual(site.resource.metadata.get("title"), "Hyperion")
|
2022-12-16 07:58:34 -05:00
|
|
|
self.assertEqual(site.resource.get_all_lookup_ids().get(IdType.ISBN), isbn)
|
2022-12-29 23:57:02 -05:00
|
|
|
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
|
|
|
|
)
|
2022-12-08 16:08:59 +00:00
|
|
|
resource = edition.external_resources.all().first()
|
|
|
|
self.assertEqual(resource.id_type, IdType.Goodreads)
|
2022-12-29 23:57:02 -05:00
|
|
|
self.assertEqual(resource.id_value, "77566")
|
|
|
|
self.assertNotEqual(resource.cover, "/media/item/default.svg")
|
|
|
|
self.assertEqual(edition.isbn, "9780553283686")
|
2024-07-28 16:15:02 -04:00
|
|
|
self.assertEqual(edition.format, "paperback")
|
2024-07-13 18:14:40 -04:00
|
|
|
self.assertEqual(edition.display_title, "Hyperion")
|
2022-12-07 19:09:05 -05:00
|
|
|
|
|
|
|
edition.delete()
|
2022-12-15 17:29:35 -05:00
|
|
|
site = SiteManager.get_site_by_url(t_url)
|
2022-12-07 19:09:05 -05:00
|
|
|
self.assertEqual(site.ready, False)
|
|
|
|
self.assertEqual(site.url, t_url2)
|
2022-12-08 16:08:59 +00:00
|
|
|
site.get_resource()
|
2022-12-29 23:57:02 -05:00
|
|
|
self.assertEqual(
|
|
|
|
site.ready, True, "previous resource should still exist with data"
|
|
|
|
)
|
2022-12-07 19:09:05 -05:00
|
|
|
|
2024-01-20 23:27:54 -05:00
|
|
|
@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("<br", site.resource.metadata.get("brief"))
|
|
|
|
|
2022-12-07 19:09:05 -05:00
|
|
|
@use_local_response
|
|
|
|
def test_asin(self):
|
2022-12-29 23:57:02 -05:00
|
|
|
t_url = "https://www.goodreads.com/book/show/45064996-hyperion"
|
2022-12-15 17:29:35 -05:00
|
|
|
site = SiteManager.get_site_by_url(t_url)
|
2022-12-08 16:08:59 +00:00
|
|
|
site.get_resource_ready()
|
2024-07-13 18:14:40 -04:00
|
|
|
self.assertEqual(site.resource.item.display_title, "Hyperion")
|
2022-12-29 23:57:02 -05:00
|
|
|
self.assertEqual(site.resource.item.asin, "B004G60EHS")
|
2022-12-07 19:09:05 -05:00
|
|
|
|
|
|
|
@use_local_response
|
|
|
|
def test_work(self):
|
2022-12-29 23:57:02 -05:00
|
|
|
url = "https://www.goodreads.com/work/editions/153313"
|
2022-12-15 17:29:35 -05:00
|
|
|
p = SiteManager.get_site_by_url(url).get_resource_ready()
|
2024-07-13 18:14:40 -04:00
|
|
|
self.assertEqual(p.item.display_title, "1984")
|
2022-12-29 23:57:02 -05:00
|
|
|
url1 = "https://www.goodreads.com/book/show/3597767-rok-1984"
|
|
|
|
url2 = "https://www.goodreads.com/book/show/40961427-1984"
|
2022-12-15 17:29:35 -05:00
|
|
|
p1 = SiteManager.get_site_by_url(url1).get_resource_ready()
|
|
|
|
p2 = SiteManager.get_site_by_url(url2).get_resource_ready()
|
2022-12-07 19:09:05 -05:00
|
|
|
w1 = p1.item.works.all().first()
|
|
|
|
w2 = p2.item.works.all().first()
|
|
|
|
self.assertEqual(w1, w2)
|
|
|
|
|
|
|
|
|
2022-12-09 02:35:21 +00:00
|
|
|
class GoogleBooksTestCase(TestCase):
|
2024-04-08 20:25:14 -04:00
|
|
|
databases = "__all__"
|
|
|
|
|
2022-12-09 02:35:21 +00:00
|
|
|
def test_parse(self):
|
|
|
|
t_type = IdType.GoogleBooks
|
2022-12-29 23:57:02 -05:00
|
|
|
t_id = "hV--zQEACAAJ"
|
|
|
|
t_url = "https://books.google.com.bn/books?id=hV--zQEACAAJ&hl=ms"
|
|
|
|
t_url2 = "https://books.google.com/books?id=hV--zQEACAAJ"
|
2022-12-15 17:29:35 -05:00
|
|
|
p1 = SiteManager.get_site_by_url(t_url)
|
|
|
|
p2 = SiteManager.get_site_by_url(t_url2)
|
2022-12-09 02:35:21 +00:00
|
|
|
self.assertIsNotNone(p1)
|
|
|
|
self.assertEqual(p1.url, t_url2)
|
|
|
|
self.assertEqual(p1.ID_TYPE, t_type)
|
|
|
|
self.assertEqual(p1.id_value, t_id)
|
|
|
|
self.assertEqual(p2.url, t_url2)
|
|
|
|
|
|
|
|
@use_local_response
|
|
|
|
def test_scrape(self):
|
2022-12-29 23:57:02 -05:00
|
|
|
t_url = "https://books.google.com.bn/books?id=hV--zQEACAAJ"
|
2022-12-15 17:29:35 -05:00
|
|
|
site = SiteManager.get_site_by_url(t_url)
|
2022-12-09 02:35:21 +00:00
|
|
|
self.assertEqual(site.ready, False)
|
|
|
|
site.get_resource_ready()
|
|
|
|
self.assertEqual(site.ready, True)
|
2022-12-29 23:57:02 -05:00
|
|
|
self.assertEqual(
|
|
|
|
site.resource.metadata.get("title"), "1984 Nineteen Eighty-Four"
|
|
|
|
)
|
|
|
|
self.assertEqual(site.resource.metadata.get("isbn"), "9781847498571")
|
2022-12-09 02:35:21 +00:00
|
|
|
self.assertEqual(site.resource.id_type, IdType.GoogleBooks)
|
2022-12-29 23:57:02 -05:00
|
|
|
self.assertEqual(site.resource.id_value, "hV--zQEACAAJ")
|
|
|
|
self.assertEqual(site.resource.item.isbn, "9781847498571")
|
2024-07-14 22:21:06 -04:00
|
|
|
self.assertEqual(
|
|
|
|
site.resource.item.localized_title,
|
|
|
|
[{"lang": "en", "text": "1984 Nineteen Eighty-Four"}],
|
|
|
|
)
|
2024-07-13 18:14:40 -04:00
|
|
|
self.assertEqual(site.resource.item.display_title, "1984 Nineteen Eighty-Four")
|
2022-12-09 02:35:21 +00:00
|
|
|
|
|
|
|
|
2023-04-25 19:04:57 -04:00
|
|
|
class BooksTWTestCase(TestCase):
|
2024-04-08 20:25:14 -04:00
|
|
|
databases = "__all__"
|
|
|
|
|
2023-04-25 19:04:57 -04:00
|
|
|
def test_parse(self):
|
|
|
|
t_type = IdType.BooksTW
|
|
|
|
t_id = "0010947886"
|
|
|
|
t_url = "https://www.books.com.tw/products/0010947886?loc=P_br_60nq68yhb_D_2aabdc_B_1"
|
|
|
|
t_url2 = "https://www.books.com.tw/products/0010947886"
|
|
|
|
p1 = SiteManager.get_site_by_url(t_url)
|
|
|
|
p2 = SiteManager.get_site_by_url(t_url2)
|
|
|
|
self.assertIsNotNone(p1)
|
|
|
|
self.assertEqual(p1.url, t_url2)
|
|
|
|
self.assertEqual(p1.ID_TYPE, t_type)
|
|
|
|
self.assertEqual(p1.id_value, t_id)
|
|
|
|
self.assertEqual(p2.url, t_url2)
|
|
|
|
|
|
|
|
@use_local_response
|
|
|
|
def test_scrape(self):
|
|
|
|
t_url = "https://www.books.com.tw/products/0010947886"
|
|
|
|
site = SiteManager.get_site_by_url(t_url)
|
|
|
|
self.assertIsNotNone(site)
|
|
|
|
self.assertEqual(site.ready, False)
|
|
|
|
site.get_resource_ready()
|
|
|
|
self.assertEqual(site.ready, True)
|
|
|
|
self.assertEqual(
|
|
|
|
site.resource.metadata.get("title"),
|
|
|
|
"阿拉伯人三千年:從民族、部落、語言、文化、宗教到帝國,綜覽阿拉伯世界的崛起、衰落與再興",
|
|
|
|
)
|
|
|
|
self.assertEqual(
|
|
|
|
site.resource.metadata.get("orig_title"),
|
|
|
|
"Arabs: A 3000-Year History of Peoples, Tribes and Empires",
|
|
|
|
)
|
|
|
|
self.assertEqual(site.resource.metadata.get("isbn"), "9786263152236")
|
|
|
|
self.assertEqual(site.resource.metadata.get("author"), ["Tim Mackintosh-Smith"])
|
|
|
|
self.assertEqual(site.resource.metadata.get("translator"), ["吳莉君"])
|
2024-07-13 18:14:40 -04:00
|
|
|
self.assertEqual(site.resource.metadata.get("language"), ["繁體中文"])
|
2023-04-25 19:04:57 -04:00
|
|
|
self.assertEqual(site.resource.metadata.get("pub_house"), "臉譜")
|
|
|
|
self.assertEqual(site.resource.metadata.get("pub_year"), 2023)
|
|
|
|
self.assertEqual(site.resource.metadata.get("pub_month"), 2)
|
|
|
|
self.assertEqual(site.resource.metadata.get("binding"), "平裝")
|
|
|
|
self.assertEqual(site.resource.metadata.get("pages"), 792)
|
|
|
|
self.assertEqual(site.resource.metadata.get("price"), "1050 NTD")
|
|
|
|
self.assertEqual(site.resource.id_type, IdType.BooksTW)
|
|
|
|
self.assertEqual(site.resource.id_value, "0010947886")
|
|
|
|
self.assertEqual(site.resource.item.isbn, "9786263152236")
|
2024-07-28 16:08:36 -04:00
|
|
|
self.assertEqual(site.resource.item.format, "paperback")
|
2023-04-25 19:04:57 -04:00
|
|
|
self.assertEqual(
|
2024-07-13 18:14:40 -04:00
|
|
|
site.resource.item.display_title,
|
2024-06-02 14:50:07 -04:00
|
|
|
"阿拉伯人三千年:從民族、部落、語言、文化、宗教到帝國,綜覽阿拉伯世界的崛起、衰落與再興",
|
2023-04-25 19:04:57 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
|
2022-12-08 05:53:00 +00:00
|
|
|
class DoubanBookTestCase(TestCase):
|
2024-04-08 20:25:14 -04:00
|
|
|
databases = "__all__"
|
|
|
|
|
2022-12-07 19:09:05 -05:00
|
|
|
def setUp(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def test_parse(self):
|
|
|
|
t_type = IdType.DoubanBook
|
2022-12-29 23:57:02 -05:00
|
|
|
t_id = "35902899"
|
|
|
|
t_url = "https://m.douban.com/book/subject/35902899/"
|
|
|
|
t_url2 = "https://book.douban.com/subject/35902899/"
|
2022-12-15 17:29:35 -05:00
|
|
|
p1 = SiteManager.get_site_by_url(t_url)
|
|
|
|
p2 = SiteManager.get_site_by_url(t_url2)
|
2022-12-07 19:09:05 -05:00
|
|
|
self.assertEqual(p1.url, t_url2)
|
|
|
|
self.assertEqual(p1.ID_TYPE, t_type)
|
|
|
|
self.assertEqual(p1.id_value, t_id)
|
|
|
|
self.assertEqual(p2.url, t_url2)
|
|
|
|
|
|
|
|
@use_local_response
|
|
|
|
def test_scrape(self):
|
2022-12-29 23:57:02 -05:00
|
|
|
t_url = "https://book.douban.com/subject/35902899/"
|
2022-12-15 17:29:35 -05:00
|
|
|
site = SiteManager.get_site_by_url(t_url)
|
2022-12-07 19:09:05 -05:00
|
|
|
self.assertEqual(site.ready, False)
|
2022-12-08 16:08:59 +00:00
|
|
|
site.get_resource_ready()
|
2022-12-07 19:09:05 -05:00
|
|
|
self.assertEqual(site.ready, True)
|
2022-12-15 17:29:35 -05:00
|
|
|
self.assertEqual(site.resource.site_name, SiteName.Douban)
|
2022-12-29 23:57:02 -05:00
|
|
|
self.assertEqual(
|
|
|
|
site.resource.metadata.get("title"), "1984 Nineteen Eighty-Four"
|
|
|
|
)
|
|
|
|
self.assertEqual(site.resource.metadata.get("isbn"), "9781847498571")
|
2022-12-08 16:08:59 +00:00
|
|
|
self.assertEqual(site.resource.id_type, IdType.DoubanBook)
|
2022-12-29 23:57:02 -05:00
|
|
|
self.assertEqual(site.resource.id_value, "35902899")
|
|
|
|
self.assertEqual(site.resource.item.isbn, "9781847498571")
|
2024-07-28 16:08:36 -04:00
|
|
|
self.assertEqual(site.resource.item.format, "paperback")
|
2024-07-13 18:14:40 -04:00
|
|
|
self.assertEqual(site.resource.item.display_title, "1984 Nineteen Eighty-Four")
|
2022-12-07 19:09:05 -05:00
|
|
|
|
2023-01-14 19:55:22 -05:00
|
|
|
@use_local_response
|
|
|
|
def test_publisher(self):
|
|
|
|
t_url = "https://book.douban.com/subject/35902899/"
|
|
|
|
site = SiteManager.get_site_by_url(t_url)
|
|
|
|
res = site.get_resource_ready()
|
|
|
|
self.assertEqual(res.metadata.get("pub_house"), "Alma Classics")
|
|
|
|
t_url = "https://book.douban.com/subject/1089243/"
|
|
|
|
site = SiteManager.get_site_by_url(t_url)
|
|
|
|
res = site.get_resource_ready()
|
|
|
|
self.assertEqual(res.metadata.get("pub_house"), "花城出版社")
|
|
|
|
|
2022-12-07 19:09:05 -05:00
|
|
|
@use_local_response
|
|
|
|
def test_work(self):
|
|
|
|
# url = 'https://www.goodreads.com/work/editions/153313'
|
2022-12-29 23:57:02 -05:00
|
|
|
url1 = "https://book.douban.com/subject/1089243/"
|
|
|
|
url2 = "https://book.douban.com/subject/2037260/"
|
2022-12-15 17:29:35 -05:00
|
|
|
p1 = SiteManager.get_site_by_url(url1).get_resource_ready()
|
|
|
|
p2 = SiteManager.get_site_by_url(url2).get_resource_ready()
|
2022-12-07 19:09:05 -05:00
|
|
|
w1 = p1.item.works.all().first()
|
|
|
|
w2 = p2.item.works.all().first()
|
2024-07-13 18:14:40 -04:00
|
|
|
self.assertEqual(w1.display_title, "黄金时代")
|
|
|
|
self.assertEqual(w2.display_title, "黄金时代")
|
2022-12-07 19:09:05 -05:00
|
|
|
self.assertEqual(w1, w2)
|
2024-07-13 18:14:40 -04:00
|
|
|
editions = sorted(list(w1.editions.all()), key=lambda e: e.display_title)
|
|
|
|
self.assertEqual(len(editions), 2)
|
|
|
|
self.assertEqual(editions[0].display_title, "Wang in Love and Bondage")
|
|
|
|
self.assertEqual(editions[1].display_title, "黄金时代")
|
2022-12-07 19:09:05 -05:00
|
|
|
|
|
|
|
|
2024-12-08 19:34:13 +00:00
|
|
|
class AO3TestCase(TestCase):
|
|
|
|
databases = "__all__"
|
|
|
|
|
|
|
|
def test_parse(self):
|
|
|
|
t_type = IdType.AO3
|
|
|
|
t_id = "2080878"
|
|
|
|
t_url = "https://archiveofourown.org/works/2080878"
|
|
|
|
t_url2 = "https://archiveofourown.org/works/2080878?test"
|
|
|
|
p1 = SiteManager.get_site_by_url(t_url)
|
|
|
|
p2 = SiteManager.get_site_by_url(t_url2)
|
|
|
|
self.assertEqual(p1.url, t_url)
|
|
|
|
self.assertEqual(p1.ID_TYPE, t_type)
|
|
|
|
self.assertEqual(p1.id_value, t_id)
|
|
|
|
self.assertEqual(p2.url, t_url)
|
|
|
|
self.assertEqual(p2.ID_TYPE, t_type)
|
|
|
|
self.assertEqual(p2.id_value, t_id)
|
|
|
|
|
|
|
|
@use_local_response
|
|
|
|
def test_scrape(self):
|
|
|
|
t_url = "https://archiveofourown.org/works/2080878"
|
|
|
|
site = SiteManager.get_site_by_url(t_url)
|
|
|
|
self.assertEqual(site.ready, False)
|
|
|
|
site.get_resource_ready()
|
|
|
|
self.assertEqual(site.ready, True)
|
|
|
|
self.assertEqual(site.resource.site_name, SiteName.AO3)
|
|
|
|
self.assertEqual(site.resource.id_type, IdType.AO3)
|
|
|
|
self.assertEqual(site.resource.id_value, "2080878")
|
|
|
|
self.assertEqual(site.resource.item.display_title, "I Am Groot")
|
|
|
|
self.assertEqual(site.resource.item.author[0], "sherlocksmyth")
|
|
|
|
|
|
|
|
|
2024-10-14 13:21:04 +00:00
|
|
|
class QidianTestCase(TestCase):
|
|
|
|
databases = "__all__"
|
|
|
|
|
|
|
|
def test_parse(self):
|
|
|
|
t_type = IdType.Qidian
|
|
|
|
t_id = "1010868264"
|
|
|
|
t_url = "https://www.qidian.com/book/1010868264/"
|
|
|
|
t_url2 = "https://book.qidian.com/info/1010868264/"
|
|
|
|
p1 = SiteManager.get_site_by_url(t_url)
|
|
|
|
p2 = SiteManager.get_site_by_url(t_url2)
|
|
|
|
self.assertEqual(p1.url, t_url2)
|
|
|
|
self.assertEqual(p1.ID_TYPE, t_type)
|
|
|
|
self.assertEqual(p1.id_value, t_id)
|
|
|
|
self.assertEqual(p2.url, t_url2)
|
|
|
|
|
|
|
|
@use_local_response
|
|
|
|
def test_scrape(self):
|
|
|
|
t_url = "https://book.qidian.com/info/1010868264/"
|
|
|
|
site = SiteManager.get_site_by_url(t_url)
|
|
|
|
self.assertEqual(site.ready, False)
|
|
|
|
site.get_resource_ready()
|
|
|
|
self.assertEqual(site.ready, True)
|
|
|
|
self.assertEqual(site.resource.site_name, SiteName.Qidian)
|
|
|
|
self.assertEqual(site.resource.id_type, IdType.Qidian)
|
|
|
|
self.assertEqual(site.resource.id_value, "1010868264")
|
|
|
|
self.assertEqual(site.resource.item.display_title, "诡秘之主")
|
|
|
|
self.assertEqual(site.resource.item.author[0], "爱潜水的乌贼")
|
|
|
|
|
|
|
|
|
2024-12-11 13:46:19 +00:00
|
|
|
class JinJiangTestCase(TestCase):
|
|
|
|
databases = "__all__"
|
|
|
|
|
|
|
|
@use_local_response
|
|
|
|
def test_scrape(self):
|
|
|
|
t_url = "https://www.jjwxc.net/onebook.php?novelid=5833245"
|
|
|
|
site = SiteManager.get_site_by_url(t_url)
|
|
|
|
self.assertEqual(site.ready, False)
|
|
|
|
site.get_resource_ready()
|
|
|
|
self.assertEqual(site.ready, True)
|
|
|
|
self.assertEqual(site.resource.site_name, SiteName.JJWXC)
|
|
|
|
self.assertEqual(site.resource.id_type, IdType.JJWXC)
|
|
|
|
self.assertEqual(site.resource.id_value, "5833245")
|
|
|
|
self.assertEqual(
|
|
|
|
site.resource.item.display_title, "穿进赛博游戏后干掉BOSS成功上位"
|
|
|
|
)
|
|
|
|
self.assertEqual(site.resource.item.author[0], "桉柏")
|
|
|
|
|
|
|
|
|
2024-10-14 13:21:04 +00:00
|
|
|
class YpshuoTestCase(TestCase):
|
|
|
|
databases = "__all__"
|
|
|
|
|
|
|
|
@use_local_response
|
|
|
|
def test_scrape(self):
|
|
|
|
t_url = "https://www.ypshuo.com/novel/1.html"
|
|
|
|
site = SiteManager.get_site_by_url(t_url)
|
|
|
|
self.assertEqual(site.ready, False)
|
|
|
|
site.get_resource_ready()
|
|
|
|
self.assertEqual(site.ready, True)
|
|
|
|
self.assertEqual(site.resource.site_name, SiteName.Ypshuo)
|
|
|
|
self.assertEqual(site.resource.id_type, IdType.Ypshuo)
|
|
|
|
self.assertEqual(site.resource.id_value, "1")
|
|
|
|
self.assertEqual(site.resource.item.display_title, "诡秘之主")
|
|
|
|
self.assertEqual(site.resource.item.author[0], "爱潜水的乌贼")
|
|
|
|
|
|
|
|
|
2024-12-09 13:59:17 +00:00
|
|
|
class BangumiTestCase(TestCase):
|
|
|
|
databases = "__all__"
|
|
|
|
|
|
|
|
@use_local_response
|
|
|
|
def test_scrape(self):
|
|
|
|
t_url = "https://bgm.tv/subject/342254"
|
|
|
|
site = SiteManager.get_site_by_url(t_url)
|
|
|
|
self.assertEqual(site.ready, False)
|
|
|
|
site.get_resource_ready()
|
|
|
|
self.assertEqual(site.ready, True)
|
|
|
|
self.assertEqual(site.resource.site_name, SiteName.Bangumi)
|
|
|
|
self.assertEqual(site.resource.id_type, IdType.Bangumi)
|
|
|
|
self.assertEqual(site.resource.id_value, "342254")
|
|
|
|
self.assertEqual(site.resource.item.localized_title[0]["text"], "蓦然回首")
|
|
|
|
self.assertEqual(site.resource.item.author[0], "藤本タツキ")
|
|
|
|
self.assertEqual(site.resource.item.isbn, "9784088827827")
|
|
|
|
self.assertEqual(site.resource.item.pages, "144")
|
|
|
|
self.assertEqual(site.resource.item.price, "¥484")
|
|
|
|
|
|
|
|
|
2022-12-07 19:09:05 -05:00
|
|
|
class MultiBookSitesTestCase(TestCase):
|
2024-04-08 20:25:14 -04:00
|
|
|
databases = "__all__"
|
|
|
|
|
2022-12-07 19:09:05 -05:00
|
|
|
@use_local_response
|
|
|
|
def test_editions(self):
|
|
|
|
# isbn = '9781847498571'
|
2022-12-29 23:57:02 -05:00
|
|
|
url1 = "https://www.goodreads.com/book/show/56821625-1984"
|
|
|
|
url2 = "https://book.douban.com/subject/35902899/"
|
|
|
|
url3 = "https://books.google.com/books?id=hV--zQEACAAJ"
|
2022-12-15 17:29:35 -05:00
|
|
|
p1 = SiteManager.get_site_by_url(url1).get_resource_ready()
|
|
|
|
p2 = SiteManager.get_site_by_url(url2).get_resource_ready()
|
|
|
|
p3 = SiteManager.get_site_by_url(url3).get_resource_ready()
|
2022-12-07 19:09:05 -05:00
|
|
|
self.assertEqual(p1.item.id, p2.item.id)
|
2022-12-09 02:35:21 +00:00
|
|
|
self.assertEqual(p2.item.id, p3.item.id)
|
2022-12-07 19:09:05 -05:00
|
|
|
|
|
|
|
@use_local_response
|
|
|
|
def test_works(self):
|
|
|
|
# url1 and url4 has same ISBN, hence they share same Edition instance, which belongs to 2 Work instances
|
2022-12-29 23:57:02 -05:00
|
|
|
url1 = "https://book.douban.com/subject/1089243/"
|
|
|
|
url2 = "https://book.douban.com/subject/2037260/"
|
|
|
|
url3 = "https://www.goodreads.com/book/show/59952545-golden-age"
|
|
|
|
url4 = "https://www.goodreads.com/book/show/11798823"
|
|
|
|
p1 = SiteManager.get_site_by_url(
|
|
|
|
url1
|
|
|
|
).get_resource_ready() # lxml bug may break this
|
2022-12-07 19:09:05 -05:00
|
|
|
w1 = p1.item.works.all().first()
|
2022-12-15 17:29:35 -05:00
|
|
|
p2 = SiteManager.get_site_by_url(url2).get_resource_ready()
|
2022-12-07 19:09:05 -05:00
|
|
|
w2 = p2.item.works.all().first()
|
|
|
|
self.assertEqual(w1, w2)
|
|
|
|
self.assertEqual(p1.item.works.all().count(), 1)
|
2022-12-15 17:29:35 -05:00
|
|
|
p3 = SiteManager.get_site_by_url(url3).get_resource_ready()
|
2022-12-07 19:09:05 -05:00
|
|
|
w3 = p3.item.works.all().first()
|
|
|
|
self.assertNotEqual(w3, w2)
|
2022-12-15 17:29:35 -05:00
|
|
|
p4 = SiteManager.get_site_by_url(url4).get_resource_ready()
|
2022-12-16 07:58:34 -05:00
|
|
|
self.assertEqual(p4.item.id, p1.item.id)
|
2022-12-07 19:09:05 -05:00
|
|
|
self.assertEqual(p4.item.works.all().count(), 2)
|
|
|
|
self.assertEqual(p1.item.works.all().count(), 2)
|
2024-07-13 18:14:40 -04:00
|
|
|
w2e = sorted(list(w2.editions.all()), key=lambda e: e.display_title)
|
|
|
|
self.assertEqual(len(w2e), 2)
|
|
|
|
self.assertEqual(w2e[0].display_title, "Wang in Love and Bondage")
|
|
|
|
self.assertEqual(w2e[1].display_title, "黄金时代")
|
|
|
|
w3e = sorted(list(w3.editions.all()), key=lambda e: e.display_title)
|
|
|
|
self.assertEqual(len(w3e), 2)
|
|
|
|
self.assertEqual(w3e[0].display_title, "Golden Age: A Novel")
|
|
|
|
self.assertEqual(w3e[1].display_title, "黄金时代")
|
2022-12-07 19:09:05 -05:00
|
|
|
e = Edition.objects.get(primary_lookup_id_value=9781662601217)
|
2024-07-13 18:14:40 -04:00
|
|
|
self.assertEqual(e.display_title, "Golden Age: A Novel")
|
2024-04-08 21:27:36 -04:00
|
|
|
|
|
|
|
@use_local_response
|
|
|
|
def test_works_merge(self):
|
|
|
|
# url1 and url4 has same ISBN, hence they share same Edition instance, which belongs to 2 Work instances
|
|
|
|
url1 = "https://book.douban.com/subject/1089243/"
|
|
|
|
url2 = "https://book.douban.com/subject/2037260/"
|
|
|
|
url3 = "https://www.goodreads.com/book/show/59952545-golden-age"
|
|
|
|
url4 = "https://www.goodreads.com/book/show/11798823"
|
|
|
|
p1 = SiteManager.get_site_by_url(
|
|
|
|
url1
|
|
|
|
).get_resource_ready() # lxml bug may break this
|
|
|
|
w1 = p1.item.works.all().first()
|
|
|
|
p2 = SiteManager.get_site_by_url(url2).get_resource_ready()
|
|
|
|
w2 = p2.item.works.all().first()
|
|
|
|
self.assertEqual(w1, w2)
|
|
|
|
self.assertEqual(p1.item.works.all().count(), 1)
|
|
|
|
p3 = SiteManager.get_site_by_url(url3).get_resource_ready()
|
|
|
|
w3 = p3.item.works.all().first()
|
|
|
|
self.assertNotEqual(w3, w2)
|
|
|
|
self.assertEqual(w2.external_resources.all().count(), 1)
|
|
|
|
self.assertEqual(w3.external_resources.all().count(), 1)
|
|
|
|
w3.merge_to(w2)
|
|
|
|
self.assertEqual(w2.external_resources.all().count(), 2)
|
|
|
|
self.assertEqual(w3.external_resources.all().count(), 0)
|
|
|
|
self.assertEqual(w2.editions.all().count(), 3)
|
|
|
|
self.assertEqual(w3.editions.all().count(), 0)
|
|
|
|
p4 = SiteManager.get_site_by_url(url4).get_resource_ready()
|
|
|
|
self.assertEqual(p4.item.id, p1.item.id)
|
|
|
|
self.assertEqual(p4.item.works.all().count(), 1)
|
|
|
|
self.assertEqual(p1.item.works.all().count(), 1)
|
2024-07-13 18:14:40 -04:00
|
|
|
w2e = sorted(list(w2.editions.all()), key=lambda e: e.display_title)
|
|
|
|
self.assertEqual(len(w2e), 3)
|
|
|
|
self.assertEqual(w2e[0].display_title, "Golden Age: A Novel")
|
|
|
|
self.assertEqual(w2e[1].display_title, "Wang in Love and Bondage")
|
|
|
|
self.assertEqual(w2e[2].display_title, "黄金时代")
|
2024-04-08 21:27:36 -04:00
|
|
|
w3e = w3.editions.all().order_by("title")
|
|
|
|
self.assertEqual(w3e.count(), 0)
|
|
|
|
e = Edition.objects.get(primary_lookup_id_value=9781662601217)
|
2024-07-13 18:14:40 -04:00
|
|
|
self.assertEqual(e.display_title, "Golden Age: A Novel")
|
2024-04-08 21:27:36 -04:00
|
|
|
w2e[1].delete()
|
|
|
|
self.assertEqual(w2.editions.all().count(), 2)
|
2024-07-13 18:14:40 -04:00
|
|
|
w2.editions.all().delete()
|
2024-04-08 21:27:36 -04:00
|
|
|
self.assertEqual(p1.item.works.all().count(), 0)
|