moviewyrm/bookwyrm/tests/connectors/test_connector_manager.py

110 lines
4.3 KiB
Python
Raw Normal View History

2021-03-08 16:49:10 +00:00
""" interface between the app and various connectors """
2020-05-12 17:01:36 +00:00
from django.test import TestCase
import responses
2020-05-12 17:01:36 +00:00
2021-01-02 16:14:28 +00:00
from bookwyrm import models
from bookwyrm.connectors import connector_manager
2021-03-08 16:49:10 +00:00
from bookwyrm.connectors.bookwyrm_connector import Connector as BookWyrmConnector
2020-05-12 17:01:36 +00:00
2021-01-02 16:14:28 +00:00
class ConnectorManager(TestCase):
2021-04-26 16:15:42 +00:00
"""interface between the app and various connectors"""
2021-03-08 16:49:10 +00:00
2020-05-12 17:01:36 +00:00
def setUp(self):
2021-04-26 16:15:42 +00:00
"""we'll need some books and a connector info entry"""
2021-08-02 23:05:40 +00:00
self.work = models.Work.objects.create(title="Example Work")
2020-05-12 17:01:36 +00:00
2021-09-30 20:03:04 +00:00
models.Edition.objects.create(
2021-08-02 23:05:40 +00:00
title="Example Edition", parent_work=self.work, isbn_10="0000000000"
)
self.edition = models.Edition.objects.create(
title="Another Edition", parent_work=self.work, isbn_10="1111111111"
)
2020-05-12 17:01:36 +00:00
self.remote_connector = models.Connector.objects.create(
identifier="test_connector_remote",
priority=1,
connector_file="bookwyrm_connector",
base_url="http://fake.ciom/",
books_url="http://fake.ciom/",
search_url="http://fake.ciom/search/",
covers_url="http://covers.fake.ciom/",
isbn_search_url="http://fake.ciom/isbn/",
)
2020-05-12 17:01:36 +00:00
def test_get_or_create_connector(self):
2021-04-26 16:15:42 +00:00
"""loads a connector if the data source is known or creates one"""
2021-03-08 16:49:10 +00:00
remote_id = "https://example.com/object/1"
2021-01-02 16:14:28 +00:00
connector = connector_manager.get_or_create_connector(remote_id)
self.assertIsInstance(connector, BookWyrmConnector)
2021-03-08 16:49:10 +00:00
self.assertEqual(connector.identifier, "example.com")
self.assertEqual(connector.base_url, "https://example.com")
2020-05-12 17:01:36 +00:00
2021-01-02 16:14:28 +00:00
same_connector = connector_manager.get_or_create_connector(remote_id)
2020-05-12 17:01:36 +00:00
self.assertEqual(connector.identifier, same_connector.identifier)
def test_get_connectors(self):
2021-04-26 16:15:42 +00:00
"""load all connectors"""
2021-01-02 16:14:28 +00:00
connectors = list(connector_manager.get_connectors())
2021-09-17 18:29:10 +00:00
self.assertEqual(len(connectors), 1)
self.assertIsInstance(connectors[0], BookWyrmConnector)
@responses.activate
2021-09-30 18:33:04 +00:00
def test_search_plaintext(self):
2021-04-26 16:15:42 +00:00
"""search all connectors"""
responses.add(
responses.GET,
"http://fake.ciom/search/Example?min_confidence=0.1",
2021-09-30 18:33:04 +00:00
json=[{"title": "Hello", "key": "https://www.example.com/search/1"}],
)
2021-03-08 16:49:10 +00:00
results = connector_manager.search("Example")
self.assertEqual(len(results), 1)
self.assertEqual(len(results[0]["results"]), 1)
2021-09-30 18:33:04 +00:00
self.assertEqual(results[0]["connector"].identifier, "test_connector_remote")
self.assertEqual(results[0]["results"][0].title, "Hello")
def test_search_empty_query(self):
"""don't panic on empty queries"""
results = connector_manager.search("")
self.assertEqual(results, [])
@responses.activate
def test_search_isbn(self):
2021-04-26 16:15:42 +00:00
"""special handling if a query resembles an isbn"""
responses.add(
responses.GET,
"http://fake.ciom/isbn/0000000000",
2021-09-30 18:33:04 +00:00
json=[{"title": "Hello", "key": "https://www.example.com/search/1"}],
)
results = connector_manager.search("0000000000")
self.assertEqual(len(results), 1)
2021-03-08 16:49:10 +00:00
self.assertEqual(len(results[0]["results"]), 1)
2021-09-30 18:33:04 +00:00
self.assertEqual(results[0]["connector"].identifier, "test_connector_remote")
self.assertEqual(results[0]["results"][0].title, "Hello")
def test_first_search_result(self):
2021-04-26 16:15:42 +00:00
"""only get one search result"""
2021-03-08 16:49:10 +00:00
result = connector_manager.first_search_result("Example")
self.assertEqual(result.title, "Example Edition")
def test_first_search_result_empty_query(self):
"""only get one search result"""
result = connector_manager.first_search_result("")
self.assertIsNone(result)
@responses.activate
def test_first_search_result_no_results(self):
"""only get one search result"""
responses.add(
responses.GET,
"http://fake.ciom/search/dkjfhg?min_confidence=0.1",
json={},
)
result = connector_manager.first_search_result("dkjfhg")
self.assertIsNone(result)
def test_load_connector(self):
2021-04-26 16:15:42 +00:00
"""load a connector object from the database entry"""
2021-09-17 18:29:10 +00:00
connector = connector_manager.load_connector(self.remote_connector)
self.assertEqual(connector.identifier, "test_connector_remote")