bookwyrm-mastodon/bookwyrm/tests/connectors/test_abstract_connector.py

105 lines
4.0 KiB
Python
Raw Normal View History

2020-05-11 11:34:25 -04:00
''' testing book data connectors '''
from django.test import TestCase
2020-12-30 12:48:37 -05:00
import responses
2020-05-11 11:34:25 -04:00
from bookwyrm import models
2020-12-30 12:48:37 -05:00
from bookwyrm.connectors import abstract_connector
from bookwyrm.connectors.abstract_connector import Mapping, SearchResult
2020-05-11 11:34:25 -04:00
2020-09-21 13:25:26 -04:00
class AbstractConnector(TestCase):
''' generic code for connecting to outside data sources '''
2020-05-11 11:34:25 -04:00
def setUp(self):
''' we need an example connector '''
2020-12-30 12:48:37 -05:00
self.connector_info = models.Connector.objects.create(
2020-05-11 13:40:48 -04:00
identifier='example.com',
2020-12-03 16:22:50 -05:00
connector_file='openlibrary',
2020-05-11 13:40:48 -04:00
base_url='https://example.com',
2020-12-30 12:48:37 -05:00
books_url='https://example.com/books',
covers_url='https://example.com/covers',
2020-05-11 13:40:48 -04:00
search_url='https://example.com/search?q=',
)
2020-05-11 11:34:25 -04:00
2020-12-30 12:48:37 -05:00
class TestConnector(abstract_connector.AbstractMinimalConnector):
''' nothing added here '''
def format_search_result(self, search_result):
return search_result
def get_or_create_book(self, remote_id):
2020-12-30 12:48:37 -05:00
pass
def parse_search_data(self, data):
return data
self.test_connector = TestConnector('example.com')
2020-12-30 12:48:37 -05:00
def test_abstract_minimal_connector_init(self):
''' barebones connector for search with defaults '''
connector = self.test_connector
2020-12-30 12:48:37 -05:00
self.assertEqual(connector.connector, self.connector_info)
self.assertEqual(connector.base_url, 'https://example.com')
self.assertEqual(connector.books_url, 'https://example.com/books')
self.assertEqual(connector.covers_url, 'https://example.com/covers')
self.assertEqual(connector.search_url, 'https://example.com/search?q=')
self.assertIsNone(connector.name)
self.assertEqual(connector.identifier, 'example.com')
2020-12-30 12:48:37 -05:00
self.assertIsNone(connector.max_query_count)
self.assertFalse(connector.local)
@responses.activate
def test_search(self):
2020-12-30 12:48:37 -05:00
''' makes an http request to the outside service '''
responses.add(
responses.GET,
'https://example.com/search?q=a%20book%20title',
json=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'],
status=200)
results = self.test_connector.search('a book title')
2020-12-30 12:48:37 -05:00
self.assertEqual(len(results), 10)
self.assertEqual(results[0], 'a')
self.assertEqual(results[1], 'b')
self.assertEqual(results[2], 'c')
def test_is_available(self):
''' is the connector usable '''
2020-12-30 12:48:37 -05:00
def test_search_result(self):
''' a class that stores info about a search result '''
result = SearchResult(
title='Title',
key='https://example.com/book/1',
author='Author Name',
year='1850',
connector=self.test_connector,
2020-12-30 12:48:37 -05:00
)
# there's really not much to test here, it's just a dataclass
self.assertEqual(result.confidence, 1)
self.assertEqual(result.title, 'Title')
2020-05-11 11:34:25 -04:00
def test_create_mapping(self):
''' maps remote fields for book data to bookwyrm activitypub fields '''
2020-05-11 11:34:25 -04:00
mapping = Mapping('isbn')
self.assertEqual(mapping.local_field, 'isbn')
self.assertEqual(mapping.remote_field, 'isbn')
self.assertEqual(mapping.formatter('bb'), 'bb')
def test_create_mapping_with_remote(self):
''' the remote field is different than the local field '''
2020-05-11 11:34:25 -04:00
mapping = Mapping('isbn', remote_field='isbn13')
self.assertEqual(mapping.local_field, 'isbn')
self.assertEqual(mapping.remote_field, 'isbn13')
self.assertEqual(mapping.formatter('bb'), 'bb')
def test_create_mapping_with_formatter(self):
''' a function is provided to modify the data '''
2020-05-11 11:34:25 -04:00
formatter = lambda x: 'aa' + x
mapping = Mapping('isbn', formatter=formatter)
self.assertEqual(mapping.local_field, 'isbn')
self.assertEqual(mapping.remote_field, 'isbn')
self.assertEqual(mapping.formatter, formatter)
self.assertEqual(mapping.formatter('bb'), 'aabb')