2020-05-11 15:34:25 +00:00
|
|
|
''' testing book data connectors '''
|
2021-01-02 17:08:37 +00:00
|
|
|
from unittest.mock import patch
|
2020-05-11 15:34:25 +00:00
|
|
|
from django.test import TestCase
|
2020-12-30 17:48:37 +00:00
|
|
|
import responses
|
2020-05-11 15:34:25 +00:00
|
|
|
|
2020-09-21 15:10:37 +00:00
|
|
|
from bookwyrm import models
|
2020-12-30 17:48:37 +00:00
|
|
|
from bookwyrm.connectors import abstract_connector
|
2020-12-31 20:22:00 +00:00
|
|
|
from bookwyrm.connectors.abstract_connector import Mapping
|
|
|
|
from bookwyrm.settings import DOMAIN
|
2020-05-11 15:34:25 +00:00
|
|
|
|
|
|
|
|
2020-09-21 17:25:26 +00:00
|
|
|
class AbstractConnector(TestCase):
|
2020-12-30 17:26:02 +00:00
|
|
|
''' generic code for connecting to outside data sources '''
|
2020-05-11 15:34:25 +00:00
|
|
|
def setUp(self):
|
2020-12-30 17:26:02 +00:00
|
|
|
''' we need an example connector '''
|
2020-12-30 17:48:37 +00:00
|
|
|
self.connector_info = models.Connector.objects.create(
|
2020-05-11 17:40:48 +00:00
|
|
|
identifier='example.com',
|
2020-12-03 21:22:50 +00:00
|
|
|
connector_file='openlibrary',
|
2020-05-11 17:40:48 +00:00
|
|
|
base_url='https://example.com',
|
2020-12-30 17:48:37 +00:00
|
|
|
books_url='https://example.com/books',
|
|
|
|
covers_url='https://example.com/covers',
|
2020-05-11 17:40:48 +00:00
|
|
|
search_url='https://example.com/search?q=',
|
|
|
|
)
|
2020-12-31 20:22:00 +00:00
|
|
|
work_data = {
|
|
|
|
'id': 'abc1',
|
|
|
|
'title': 'Test work',
|
|
|
|
'type': 'work',
|
|
|
|
'openlibraryKey': 'OL1234W',
|
|
|
|
}
|
|
|
|
self.work_data = work_data
|
|
|
|
edition_data = {
|
|
|
|
'id': 'abc2',
|
|
|
|
'title': 'Test edition',
|
|
|
|
'type': 'edition',
|
|
|
|
'openlibraryKey': 'OL1234M',
|
|
|
|
}
|
|
|
|
self.edition_data = edition_data
|
|
|
|
|
|
|
|
class TestConnector(abstract_connector.AbstractConnector):
|
2020-12-30 17:48:37 +00:00
|
|
|
''' nothing added here '''
|
2020-12-31 19:04:19 +00:00
|
|
|
def format_search_result(self, search_result):
|
|
|
|
return search_result
|
|
|
|
def parse_search_data(self, data):
|
|
|
|
return data
|
2020-12-31 20:22:00 +00:00
|
|
|
def is_work_data(self, data):
|
|
|
|
return data['type'] == 'work'
|
|
|
|
def get_edition_from_work_data(self, data):
|
|
|
|
return edition_data
|
|
|
|
def get_work_from_edition_data(self, data):
|
|
|
|
return work_data
|
|
|
|
def get_authors_from_data(self, data):
|
|
|
|
return []
|
|
|
|
def expand_book_data(self, book):
|
|
|
|
pass
|
|
|
|
self.connector = TestConnector('example.com')
|
|
|
|
self.connector.book_mappings = [
|
|
|
|
Mapping('id'),
|
|
|
|
Mapping('title'),
|
|
|
|
Mapping('openlibraryKey'),
|
|
|
|
]
|
2020-12-31 19:04:19 +00:00
|
|
|
|
2020-12-31 20:22:00 +00:00
|
|
|
self.book = models.Edition.objects.create(
|
|
|
|
title='Test Book', remote_id='https://example.com/book/1234',
|
|
|
|
openlibrary_key='OL1234M')
|
2020-12-30 17:48:37 +00:00
|
|
|
|
2020-12-31 20:22:00 +00:00
|
|
|
|
|
|
|
def test_abstract_connector_init(self):
|
2020-12-31 19:04:19 +00:00
|
|
|
''' barebones connector for search with defaults '''
|
2020-12-31 20:22:00 +00:00
|
|
|
self.assertIsInstance(self.connector.book_mappings, list)
|
2020-12-30 17:48:37 +00:00
|
|
|
|
|
|
|
|
2020-12-31 20:22:00 +00:00
|
|
|
def test_is_available(self):
|
|
|
|
''' this isn't used.... '''
|
|
|
|
self.assertTrue(self.connector.is_available())
|
|
|
|
self.connector.max_query_count = 1
|
|
|
|
self.connector.connector.query_count = 2
|
|
|
|
self.assertFalse(self.connector.is_available())
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_or_create_book_existing(self):
|
|
|
|
''' find an existing book by remote/origin id '''
|
|
|
|
self.assertEqual(models.Book.objects.count(), 1)
|
|
|
|
self.assertEqual(
|
|
|
|
self.book.remote_id, 'https://%s/book/%d' % (DOMAIN, self.book.id))
|
|
|
|
self.assertEqual(
|
|
|
|
self.book.origin_id, 'https://example.com/book/1234')
|
|
|
|
|
|
|
|
# dedupe by origin id
|
|
|
|
result = self.connector.get_or_create_book(
|
|
|
|
'https://example.com/book/1234')
|
|
|
|
self.assertEqual(models.Book.objects.count(), 1)
|
|
|
|
self.assertEqual(result, self.book)
|
|
|
|
|
|
|
|
# dedupe by remote id
|
|
|
|
result = self.connector.get_or_create_book(
|
|
|
|
'https://%s/book/%d' % (DOMAIN, self.book.id))
|
|
|
|
self.assertEqual(models.Book.objects.count(), 1)
|
|
|
|
self.assertEqual(result, self.book)
|
|
|
|
|
2020-12-30 17:48:37 +00:00
|
|
|
@responses.activate
|
2020-12-31 20:22:00 +00:00
|
|
|
def test_get_or_create_book_deduped(self):
|
|
|
|
''' load remote data and deduplicate '''
|
2020-12-30 17:48:37 +00:00
|
|
|
responses.add(
|
|
|
|
responses.GET,
|
2020-12-31 20:22:00 +00:00
|
|
|
'https://example.com/book/abcd',
|
|
|
|
json=self.edition_data
|
2020-12-30 17:48:37 +00:00
|
|
|
)
|
2021-01-02 17:08:37 +00:00
|
|
|
with patch(
|
|
|
|
'bookwyrm.connectors.abstract_connector.load_more_data.delay'):
|
|
|
|
result = self.connector.get_or_create_book(
|
|
|
|
'https://example.com/book/abcd')
|
2020-12-31 20:22:00 +00:00
|
|
|
self.assertEqual(result, self.book)
|
|
|
|
self.assertEqual(models.Edition.objects.count(), 1)
|
|
|
|
self.assertEqual(models.Edition.objects.count(), 1)
|