Skip to content

Commit 32d32d2

Browse files
AryaPRajkpsherva
authored andcommitted
literature: improve ISBN extraction
* BETTER Handles ISBN from multiple metadata sources with priority. Signed-off-by: Arya <[email protected]>
1 parent ef3bb46 commit 32d32d2

File tree

2 files changed

+171
-1
lines changed

2 files changed

+171
-1
lines changed

invenio_app_ils/literature/covers_builder.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,19 @@
1313
def build_ils_demo_cover_urls(metadata):
1414
"""Build working ulrs for demo data."""
1515
cover_metadata = metadata.get("cover_metadata", {})
16-
isbn = cover_metadata.get("ISBN", "")
16+
17+
isbn = (
18+
cover_metadata.get("ISBN", "")
19+
or cover_metadata.get("isbn", "")
20+
or metadata.get("isbn", "")
21+
or ""
22+
)
23+
identifiers = metadata.get("identifiers", [])
24+
if not isbn and identifiers:
25+
for identifier in identifiers:
26+
if identifier.get("scheme") == "ISBN":
27+
isbn = identifier.get("value", "")
28+
break
1729
if isbn:
1830
return build_openlibrary_urls(isbn)
1931
return build_placeholder_urls()

tests/api/test_covers_builder.py

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
# -*- coding: utf-8 -*-
2+
#
3+
# Copyright (C) 2018-2020 CERN.
4+
#
5+
# invenio-app-ils is free software; you can redistribute it and/or modify it
6+
# under the terms of the MIT License; see LICENSE file for more details.
7+
8+
"""Tests for covers_builder module."""
9+
10+
import pytest
11+
from unittest.mock import patch
12+
from invenio_app_ils.literature.covers_builder import (
13+
build_ils_demo_cover_urls,
14+
build_openlibrary_urls,
15+
build_placeholder_urls,
16+
)
17+
18+
19+
def test_build_openlibrary_urls():
20+
"""Test Open Library URL generation."""
21+
isbn = "9780306406157"
22+
result = build_openlibrary_urls(isbn)
23+
24+
assert result["is_placeholder"] is False
25+
assert isbn in result["small"]
26+
assert isbn in result["medium"]
27+
assert isbn in result["large"]
28+
assert "covers.openlibrary.org" in result["small"]
29+
assert result["small"] == f"https://covers.openlibrary.org/b/isbn/{isbn}-S.jpg"
30+
assert result["medium"] == f"https://covers.openlibrary.org/b/isbn/{isbn}-M.jpg"
31+
assert result["large"] == f"https://covers.openlibrary.org/b/isbn/{isbn}-L.jpg"
32+
33+
34+
@patch("invenio_app_ils.literature.covers_builder.url_for")
35+
def test_build_placeholder_urls(mock_url_for):
36+
"""Test placeholder URL generation."""
37+
mock_url_for.return_value = "https://example.com/static/images/placeholder.png"
38+
39+
result = build_placeholder_urls()
40+
41+
assert result["is_placeholder"] is True
42+
assert "placeholder.png" in result["small"]
43+
assert result["small"] == result["medium"] == result["large"]
44+
mock_url_for.assert_called_once()
45+
46+
47+
def test_build_ils_demo_cover_urls_with_isbn_in_cover_metadata():
48+
"""Test with ISBN in cover_metadata (uppercase)."""
49+
metadata = {"cover_metadata": {"ISBN": "9780306406157"}}
50+
result = build_ils_demo_cover_urls(metadata)
51+
52+
assert result["is_placeholder"] is False
53+
assert "9780306406157" in result["small"]
54+
55+
56+
def test_build_ils_demo_cover_urls_with_isbn_lowercase():
57+
"""Test with isbn in cover_metadata (lowercase)."""
58+
metadata = {"cover_metadata": {"isbn": "9780306406157"}}
59+
result = build_ils_demo_cover_urls(metadata)
60+
61+
assert result["is_placeholder"] is False
62+
assert "9780306406157" in result["small"]
63+
64+
65+
def test_build_ils_demo_cover_urls_with_isbn_in_root():
66+
"""Test with isbn directly in metadata root."""
67+
metadata = {"isbn": "9780306406157"}
68+
result = build_ils_demo_cover_urls(metadata)
69+
70+
assert result["is_placeholder"] is False
71+
assert "9780306406157" in result["small"]
72+
73+
74+
def test_build_ils_demo_cover_urls_with_isbn_in_identifiers():
75+
"""Test with ISBN in identifiers array."""
76+
metadata = {
77+
"identifiers": [
78+
{"scheme": "DOI", "value": "10.1234/example"},
79+
{"scheme": "ISBN", "value": "9780306406157"},
80+
]
81+
}
82+
result = build_ils_demo_cover_urls(metadata)
83+
84+
assert result["is_placeholder"] is False
85+
assert "9780306406157" in result["small"]
86+
87+
88+
@patch("invenio_app_ils.literature.covers_builder.url_for")
89+
def test_build_ils_demo_cover_urls_no_isbn(mock_url_for):
90+
"""Test fallback to placeholder when no ISBN found."""
91+
mock_url_for.return_value = "https://example.com/static/images/placeholder.png"
92+
93+
metadata = {
94+
"title": "Some Book",
95+
"identifiers": [{"scheme": "DOI", "value": "10.1234/example"}],
96+
}
97+
result = build_ils_demo_cover_urls(metadata)
98+
99+
assert result["is_placeholder"] is True
100+
assert "placeholder.png" in result["small"]
101+
102+
103+
@patch("invenio_app_ils.literature.covers_builder.url_for")
104+
def test_build_ils_demo_cover_urls_empty_metadata(mock_url_for):
105+
"""Test with empty metadata."""
106+
mock_url_for.return_value = "https://example.com/static/images/placeholder.png"
107+
108+
metadata = {}
109+
result = build_ils_demo_cover_urls(metadata)
110+
111+
assert result["is_placeholder"] is True
112+
113+
114+
def test_build_ils_demo_cover_urls_priority_order():
115+
"""Test ISBN priority: cover_metadata.ISBN > cover_metadata.isbn > metadata.isbn > identifiers."""
116+
# cover_metadata.ISBN should take priority
117+
metadata = {
118+
"cover_metadata": {"ISBN": "1111111111"},
119+
"isbn": "2222222222",
120+
"identifiers": [{"scheme": "ISBN", "value": "3333333333"}],
121+
}
122+
result = build_ils_demo_cover_urls(metadata)
123+
assert "1111111111" in result["small"]
124+
125+
# cover_metadata.isbn should be second priority
126+
metadata = {
127+
"cover_metadata": {"isbn": "4444444444"},
128+
"isbn": "2222222222",
129+
"identifiers": [{"scheme": "ISBN", "value": "3333333333"}],
130+
}
131+
result = build_ils_demo_cover_urls(metadata)
132+
assert "4444444444" in result["small"]
133+
134+
# metadata.isbn should be third priority
135+
metadata = {
136+
"isbn": "5555555555",
137+
"identifiers": [{"scheme": "ISBN", "value": "3333333333"}],
138+
}
139+
result = build_ils_demo_cover_urls(metadata)
140+
assert "5555555555" in result["small"]
141+
142+
# identifiers should be last priority
143+
metadata = {"identifiers": [{"scheme": "ISBN", "value": "6666666666"}]}
144+
result = build_ils_demo_cover_urls(metadata)
145+
assert "6666666666" in result["small"]
146+
147+
148+
def test_build_ils_demo_cover_urls_empty_isbn_strings():
149+
"""Test that empty ISBN strings are handled correctly."""
150+
metadata = {
151+
"cover_metadata": {"ISBN": "", "isbn": ""},
152+
"isbn": "",
153+
"identifiers": [{"scheme": "ISBN", "value": "9780306406157"}],
154+
}
155+
result = build_ils_demo_cover_urls(metadata)
156+
157+
assert result["is_placeholder"] is False
158+
assert "9780306406157" in result["small"]

0 commit comments

Comments
 (0)