Fixes url formatting in openlibrary connector

This commit is contained in:
Mouse Reeve 2020-12-31 09:19:39 -08:00
parent 12feecb9ea
commit c1e1bdac4b
2 changed files with 59 additions and 8 deletions

View file

@ -68,7 +68,7 @@ class Connector(AbstractConnector):
key = data['key'] key = data['key']
except KeyError: except KeyError:
raise ConnectorException('Invalid book data') 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): def is_work_data(self, data):
@ -80,7 +80,7 @@ class Connector(AbstractConnector):
key = data['key'] key = data['key']
except KeyError: except KeyError:
raise ConnectorException('Invalid book data') 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) data = get_data(url)
return pick_default_edition(data['entries']) return pick_default_edition(data['entries'])
@ -90,7 +90,7 @@ class Connector(AbstractConnector):
key = data['works'][0]['key'] key = data['works'][0]['key']
except (IndexError, KeyError): except (IndexError, KeyError):
raise ConnectorException('No work found for edition') 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) return get_data(url)
@ -100,7 +100,7 @@ class Connector(AbstractConnector):
author_blob = author_blob.get('author', author_blob) author_blob = author_blob.get('author', author_blob)
# this id is "/authors/OL1234567A" # this id is "/authors/OL1234567A"
author_id = author_blob['key'] 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) yield self.get_or_create_author(url)

View file

@ -1,9 +1,10 @@
''' testing book data connectors ''' ''' testing book data connectors '''
import json import json
import pathlib import pathlib
from dateutil import parser from unittest.mock import patch
from django.test import TestCase from django.test import TestCase
import pytz import responses
from bookwyrm import models from bookwyrm import models
from bookwyrm.connectors.openlibrary import Connector 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, \ from bookwyrm.connectors.openlibrary import pick_default_edition, \
get_openlibrary_key get_openlibrary_key
from bookwyrm.connectors.abstract_connector import SearchResult from bookwyrm.connectors.abstract_connector import SearchResult
from bookwyrm.connectors.abstract_connector import ConnectorException
class Openlibrary(TestCase): class Openlibrary(TestCase):
''' test loading data from openlibrary.org '''
def setUp(self): def setUp(self):
''' creates the connector we'll use '''
models.Connector.objects.create( models.Connector.objects.create(
identifier='openlibrary.org', identifier='openlibrary.org',
name='OpenLibrary', name='OpenLibrary',
@ -37,19 +41,61 @@ class Openlibrary(TestCase):
self.edition_list_data = json.loads(edition_list_file.read_bytes()) 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): 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.work_data), True)
self.assertEqual(self.connector.is_work_data(self.edition_data), False) 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): def test_pick_default_edition(self):
''' detect if the loaded json is an edition '''
edition = pick_default_edition(self.edition_list_data['entries']) edition = pick_default_edition(self.edition_list_data['entries'])
self.assertEqual(edition['key'], '/books/OL9788823M') self.assertEqual(edition['key'], '/books/OL9788823M')
def test_format_search_result(self): def test_format_search_result(self):
''' translate json from openlibrary into SearchResult ''' ''' 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()) search_data = json.loads(datafile.read_bytes())
results = self.connector.parse_search_data(search_data) results = self.connector.parse_search_data(search_data)
self.assertIsInstance(results, list) self.assertIsInstance(results, list)
@ -57,22 +103,27 @@ class Openlibrary(TestCase):
result = self.connector.format_search_result(results[0]) result = self.connector.format_search_result(results[0])
self.assertIsInstance(result, SearchResult) self.assertIsInstance(result, SearchResult)
self.assertEqual(result.title, 'This Is How You Lose the Time War') 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.author, 'Amal El-Mohtar, Max Gladstone')
self.assertEqual(result.year, 2019) self.assertEqual(result.year, 2019)
self.assertEqual(result.connector, self.connector)
def test_get_description(self): def test_get_description(self):
''' should do some cleanup on the description data '''
description = get_description(self.work_data['description']) description = get_description(self.work_data['description'])
expected = 'First in the Old Kingdom/Abhorsen series.' expected = 'First in the Old Kingdom/Abhorsen series.'
self.assertEqual(description, expected) self.assertEqual(description, expected)
def test_get_languages(self): def test_get_languages(self):
''' looks up languages from a list '''
languages = get_languages(self.edition_data['languages']) languages = get_languages(self.edition_data['languages'])
self.assertEqual(languages, ['English']) self.assertEqual(languages, ['English'])
def test_get_ol_key(self): def test_get_ol_key(self):
''' extracts the uuid '''
key = get_openlibrary_key('/books/OL27320736M') key = get_openlibrary_key('/books/OL27320736M')
self.assertEqual(key, 'OL27320736M') self.assertEqual(key, 'OL27320736M')