moviewyrm/bookwyrm/tests/connectors/test_abstract_connector.py

115 lines
4.1 KiB
Python
Raw Normal View History

2020-05-11 15:34:25 +00:00
''' testing book data connectors '''
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
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):
''' generic code for connecting to outside data sources '''
2020-05-11 15:34:25 +00:00
def setUp(self):
''' 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 '''
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 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):
''' 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
)
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)