From c1e1bdac4bc3b9443a95e2a338ea4970c97c6720 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Thu, 31 Dec 2020 09:19:39 -0800 Subject: [PATCH] Fixes url formatting in openlibrary connector --- bookwyrm/connectors/openlibrary.py | 8 +-- .../connectors/test_openlibrary_connector.py | 59 +++++++++++++++++-- 2 files changed, 59 insertions(+), 8 deletions(-) diff --git a/bookwyrm/connectors/openlibrary.py b/bookwyrm/connectors/openlibrary.py index c59829d6..3106c8bc 100644 --- a/bookwyrm/connectors/openlibrary.py +++ b/bookwyrm/connectors/openlibrary.py @@ -68,7 +68,7 @@ class Connector(AbstractConnector): key = data['key'] except KeyError: raise ConnectorException('Invalid book data') - return '%s/%s' % (self.books_url, key) + return '%s%s' % (self.books_url, key) def is_work_data(self, data): @@ -80,7 +80,7 @@ class Connector(AbstractConnector): key = data['key'] except KeyError: raise ConnectorException('Invalid book data') - url = '%s/%s/editions' % (self.books_url, key) + url = '%s%s/editions' % (self.books_url, key) data = get_data(url) return pick_default_edition(data['entries']) @@ -90,7 +90,7 @@ class Connector(AbstractConnector): key = data['works'][0]['key'] except (IndexError, KeyError): raise ConnectorException('No work found for edition') - url = '%s/%s' % (self.books_url, key) + url = '%s%s' % (self.books_url, key) return get_data(url) @@ -100,7 +100,7 @@ class Connector(AbstractConnector): author_blob = author_blob.get('author', author_blob) # this id is "/authors/OL1234567A" author_id = author_blob['key'] - url = '%s/%s.json' % (self.base_url, author_id) + url = '%s%s.json' % (self.base_url, author_id) yield self.get_or_create_author(url) diff --git a/bookwyrm/tests/connectors/test_openlibrary_connector.py b/bookwyrm/tests/connectors/test_openlibrary_connector.py index e2d54cd3..6f076bea 100644 --- a/bookwyrm/tests/connectors/test_openlibrary_connector.py +++ b/bookwyrm/tests/connectors/test_openlibrary_connector.py @@ -1,9 +1,10 @@ ''' testing book data connectors ''' import json import pathlib -from dateutil import parser +from unittest.mock import patch + from django.test import TestCase -import pytz +import responses from bookwyrm import models from bookwyrm.connectors.openlibrary import Connector @@ -11,10 +12,13 @@ from bookwyrm.connectors.openlibrary import get_languages, get_description from bookwyrm.connectors.openlibrary import pick_default_edition, \ get_openlibrary_key from bookwyrm.connectors.abstract_connector import SearchResult +from bookwyrm.connectors.abstract_connector import ConnectorException class Openlibrary(TestCase): + ''' test loading data from openlibrary.org ''' def setUp(self): + ''' creates the connector we'll use ''' models.Connector.objects.create( identifier='openlibrary.org', name='OpenLibrary', @@ -37,19 +41,61 @@ class Openlibrary(TestCase): self.edition_list_data = json.loads(edition_list_file.read_bytes()) + def test_get_remote_id_from_data(self): + ''' format the remote id from the data ''' + data = {'key': '/work/OL1234W'} + result = self.connector.get_remote_id_from_data(data) + self.assertEqual(result, 'https://openlibrary.org/work/OL1234W') + # error handlding + with self.assertRaises(ConnectorException): + self.connector.get_remote_id_from_data({}) + + def test_is_work_data(self): + ''' detect if the loaded json is a work ''' self.assertEqual(self.connector.is_work_data(self.work_data), True) self.assertEqual(self.connector.is_work_data(self.edition_data), False) + @responses.activate + def test_get_edition_from_work_data(self): + ''' loads a list of editions ''' + data = {'key': '/work/OL1234W'} + responses.add( + responses.GET, + 'https://openlibrary.org/work/OL1234W/editions', + json={'entries': []}, + status=200) + with patch('bookwyrm.connectors.openlibrary.pick_default_edition') \ + as pick_edition: + pick_edition.return_value = 'hi' + result = self.connector.get_edition_from_work_data(data) + self.assertEqual(result, 'hi') + + + @responses.activate + def test_get_work_from_edition_data(self): + ''' loads a list of editions ''' + data = {'works': [{'key': '/work/OL1234W'}]} + responses.add( + responses.GET, + 'https://openlibrary.org/work/OL1234W', + json={'hi': 'there'}, + status=200) + result = self.connector.get_work_from_edition_data(data) + self.assertEqual(result, {'hi': 'there'}) + + def test_pick_default_edition(self): + ''' detect if the loaded json is an edition ''' edition = pick_default_edition(self.edition_list_data['entries']) self.assertEqual(edition['key'], '/books/OL9788823M') def test_format_search_result(self): ''' translate json from openlibrary into SearchResult ''' - datafile = pathlib.Path(__file__).parent.joinpath('../data/ol_search.json') + datafile = pathlib.Path(__file__).parent.joinpath( + '../data/ol_search.json') search_data = json.loads(datafile.read_bytes()) results = self.connector.parse_search_data(search_data) self.assertIsInstance(results, list) @@ -57,22 +103,27 @@ class Openlibrary(TestCase): result = self.connector.format_search_result(results[0]) self.assertIsInstance(result, SearchResult) self.assertEqual(result.title, 'This Is How You Lose the Time War') - self.assertEqual(result.key, 'https://openlibrary.org/works/OL20639540W') + self.assertEqual( + result.key, 'https://openlibrary.org/works/OL20639540W') self.assertEqual(result.author, 'Amal El-Mohtar, Max Gladstone') self.assertEqual(result.year, 2019) + self.assertEqual(result.connector, self.connector) def test_get_description(self): + ''' should do some cleanup on the description data ''' description = get_description(self.work_data['description']) expected = 'First in the Old Kingdom/Abhorsen series.' self.assertEqual(description, expected) def test_get_languages(self): + ''' looks up languages from a list ''' languages = get_languages(self.edition_data['languages']) self.assertEqual(languages, ['English']) def test_get_ol_key(self): + ''' extracts the uuid ''' key = get_openlibrary_key('/books/OL27320736M') self.assertEqual(key, 'OL27320736M')