205 lines
8.8 KiB
Python
205 lines
8.8 KiB
Python
from django.test import TestCase
|
|
from catalog.book.models import *
|
|
from catalog.common import *
|
|
|
|
|
|
class BookTestCase(TestCase):
|
|
def setUp(self):
|
|
hyperion = Edition.objects.create(title="Hyperion")
|
|
hyperion.pages = 500
|
|
hyperion.isbn = '9780553283686'
|
|
hyperion.save()
|
|
# hyperion.isbn10 = '0553283685'
|
|
|
|
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):
|
|
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')
|
|
|
|
def test_work(self):
|
|
hyperion_print = Edition.objects.get(title="Hyperion")
|
|
hyperion_ebook = Edition(title="Hyperion")
|
|
hyperion_ebook.save()
|
|
hyperion_ebook.asin = 'B0043M6780'
|
|
hyperion = Work(title="Hyperion")
|
|
hyperion.save()
|
|
hyperion.editions.add(hyperion_print)
|
|
hyperion.editions.add(hyperion_ebook)
|
|
# andymion = Edition(title="Andymion", pages=42)
|
|
# serie = Serie(title="Hyperion Cantos")
|
|
|
|
|
|
class GoodreadsTestCase(TestCase):
|
|
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 = SiteList.get_site_by_id_type(t_type)
|
|
p2 = SiteList.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 = SiteList.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.metadata.get('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.title, 'Hyperion')
|
|
|
|
edition.delete()
|
|
site = SiteList.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_asin(self):
|
|
t_url = 'https://www.goodreads.com/book/show/45064996-hyperion'
|
|
site = SiteList.get_site_by_url(t_url)
|
|
site.get_resource_ready()
|
|
self.assertEqual(site.resource.item.title, 'Hyperion')
|
|
self.assertEqual(site.resource.item.asin, 'B004G60EHS')
|
|
|
|
@use_local_response
|
|
def test_work(self):
|
|
url = 'https://www.goodreads.com/work/editions/153313'
|
|
p = SiteList.get_site_by_url(url).get_resource_ready()
|
|
self.assertEqual(p.item.title, '1984')
|
|
url1 = 'https://www.goodreads.com/book/show/3597767-rok-1984'
|
|
url2 = 'https://www.goodreads.com/book/show/40961427-1984'
|
|
p1 = SiteList.get_site_by_url(url1).get_resource_ready()
|
|
p2 = SiteList.get_site_by_url(url2).get_resource_ready()
|
|
w1 = p1.item.works.all().first()
|
|
w2 = p2.item.works.all().first()
|
|
self.assertEqual(w1, w2)
|
|
|
|
|
|
class DoubanBookTestCase(TestCase):
|
|
def setUp(self):
|
|
pass
|
|
|
|
def test_parse(self):
|
|
t_type = IdType.DoubanBook
|
|
t_id = '35902899'
|
|
t_url = 'https://m.douban.com/book/subject/35902899/'
|
|
t_url2 = 'https://book.douban.com/subject/35902899/'
|
|
p1 = SiteList.get_site_by_url(t_url)
|
|
p2 = SiteList.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.douban.com/subject/35902899/'
|
|
site = SiteList.get_site_by_url(t_url)
|
|
self.assertEqual(site.ready, False)
|
|
site.get_resource_ready()
|
|
self.assertEqual(site.ready, True)
|
|
self.assertEqual(site.resource.metadata.get('title'), '1984 Nineteen Eighty-Four')
|
|
self.assertEqual(site.resource.metadata.get('isbn'), '9781847498571')
|
|
self.assertEqual(site.resource.id_type, IdType.DoubanBook)
|
|
self.assertEqual(site.resource.id_value, '35902899')
|
|
self.assertEqual(site.resource.item.isbn, '9781847498571')
|
|
self.assertEqual(site.resource.item.title, '1984 Nineteen Eighty-Four')
|
|
|
|
@use_local_response
|
|
def test_work(self):
|
|
# url = 'https://www.goodreads.com/work/editions/153313'
|
|
url1 = 'https://book.douban.com/subject/1089243/'
|
|
url2 = 'https://book.douban.com/subject/2037260/'
|
|
p1 = SiteList.get_site_by_url(url1).get_resource_ready()
|
|
p2 = SiteList.get_site_by_url(url2).get_resource_ready()
|
|
w1 = p1.item.works.all().first()
|
|
w2 = p2.item.works.all().first()
|
|
self.assertEqual(w1.title, '黄金时代')
|
|
self.assertEqual(w2.title, '黄金时代')
|
|
self.assertEqual(w1, w2)
|
|
editions = w1.editions.all().order_by('title')
|
|
self.assertEqual(editions.count(), 2)
|
|
self.assertEqual(editions[0].title, 'Wang in Love and Bondage')
|
|
self.assertEqual(editions[1].title, '黄金时代')
|
|
|
|
|
|
class MultiBookSitesTestCase(TestCase):
|
|
@use_local_response
|
|
def test_editions(self):
|
|
# isbn = '9781847498571'
|
|
url1 = 'https://www.goodreads.com/book/show/56821625-1984'
|
|
url2 = 'https://book.douban.com/subject/35902899/'
|
|
p1 = SiteList.get_site_by_url(url1).get_resource_ready()
|
|
p2 = SiteList.get_site_by_url(url2).get_resource_ready()
|
|
self.assertEqual(p1.item.id, p2.item.id)
|
|
|
|
@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
|
|
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 = SiteList.get_site_by_url(url1).get_resource_ready() # lxml bug may break this
|
|
w1 = p1.item.works.all().first()
|
|
p2 = SiteList.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 = SiteList.get_site_by_url(url3).get_resource_ready()
|
|
w3 = p3.item.works.all().first()
|
|
self.assertNotEqual(w3, w2)
|
|
p4 = SiteList.get_site_by_url(url4).get_resource_ready()
|
|
self.assertEqual(p4.item.works.all().count(), 2)
|
|
self.assertEqual(p1.item.works.all().count(), 2)
|
|
w2e = w2.editions.all().order_by('title')
|
|
self.assertEqual(w2e.count(), 2)
|
|
self.assertEqual(w2e[0].title, 'Wang in Love and Bondage')
|
|
self.assertEqual(w2e[1].title, '黄金时代')
|
|
w3e = w3.editions.all().order_by('title')
|
|
self.assertEqual(w3e.count(), 2)
|
|
self.assertEqual(w3e[0].title, 'Golden Age: A Novel')
|
|
self.assertEqual(w3e[1].title, '黄金时代')
|
|
e = Edition.objects.get(primary_lookup_id_value=9781662601217)
|
|
self.assertEqual(e.title, 'Golden Age: A Novel')
|