63 lines
2.4 KiB
Python
63 lines
2.4 KiB
Python
from app.services.openalex.matching import find_best_match
|
|
from app.services.openalex.types import OpenAlexWork
|
|
|
|
|
|
def test_find_best_match_exact_title():
|
|
cand1 = OpenAlexWork.from_api_dict({"id": "W1", "title": "Exact Title of the Paper"})
|
|
cand2 = OpenAlexWork.from_api_dict({"id": "W2", "title": "Totally Different Paper"})
|
|
|
|
match = find_best_match("Exact Title of the Paper", 2020, "Author A", [cand1, cand2])
|
|
assert match is not None
|
|
assert match.openalex_id == "W1"
|
|
|
|
|
|
def test_find_best_match_fuzzy_title():
|
|
# Only differences are punctuation or minor phrasing (e.g., matching a preprint title vs published)
|
|
cand1 = OpenAlexWork.from_api_dict({"id": "W1", "title": "Fuzzier Title: A Study on OpenAlex"})
|
|
cand2 = OpenAlexWork.from_api_dict({"id": "W2", "title": "Some completely unrelated work"})
|
|
|
|
match = find_best_match("Fuzzier Title A Study on OpenAlex", 2021, "Author B", [cand1, cand2])
|
|
assert match is not None
|
|
assert match.openalex_id == "W1"
|
|
|
|
|
|
def test_find_best_match_rejects_low_score():
|
|
cand1 = OpenAlexWork.from_api_dict({"id": "W1", "title": "Cats in hats"})
|
|
|
|
match = find_best_match("Dogs with logs", 2020, "Author A", [cand1])
|
|
assert match is None
|
|
|
|
|
|
def test_find_best_match_year_tiebreaker():
|
|
# Both titles are very similar, one has exact year.
|
|
cand1 = OpenAlexWork.from_api_dict({"id": "W1", "title": "The exact same title", "publication_year": 2018})
|
|
cand2 = OpenAlexWork.from_api_dict({"id": "W2", "title": "The exact same title", "publication_year": 2020})
|
|
|
|
match = find_best_match("The exact same title", 2020, "Author A", [cand1, cand2])
|
|
assert match is not None
|
|
assert match.openalex_id == "W2"
|
|
|
|
|
|
def test_find_best_match_author_tiebreaker():
|
|
# Titles and years match exactly. Author overlap decides it.
|
|
cand1 = OpenAlexWork.from_api_dict(
|
|
{
|
|
"id": "W1",
|
|
"title": "A popular title",
|
|
"publication_year": 2020,
|
|
"authorships": [{"author": {"display_name": "Smith, J"}}],
|
|
}
|
|
)
|
|
cand2 = OpenAlexWork.from_api_dict(
|
|
{
|
|
"id": "W2",
|
|
"title": "A popular title",
|
|
"publication_year": 2020,
|
|
"authorships": [{"author": {"display_name": "Doe, J"}}],
|
|
}
|
|
)
|
|
|
|
# Target authors contains "Doe"
|
|
match = find_best_match("A popular title", 2020, "A Einstein, J Doe", [cand1, cand2])
|
|
assert match is not None
|
|
assert match.openalex_id == "W2"
|