3
3
import os
4
4
from pkg_resources import parse_version
5
5
6
+ from urllib .request import Request , urlopen
7
+ from urllib .parse import urlparse , urlunparse
8
+ from warnings import warn
9
+
6
10
import pytest
7
11
8
12
from doi import (
11
15
)
12
16
13
17
18
+ def simplify_url (u ):
19
+ return urlparse (u )._replace (query = '' , fragment = '' )
20
+
21
+
22
+ def resolve_redirects (u ):
23
+ # Unconditionally upgrade to https, since some resolvers seem to require it
24
+ # If removed, it'd make sense to canonicalize in simplify_url instead to
25
+ # prevent spurious test failures
26
+ u = urlunparse (urlparse (u )._replace (scheme = 'https' ))
27
+ req = Request (u , headers = {'User-Agent' : 'Mozilla/5.0' })
28
+ with urlopen (req ) as r :
29
+ return simplify_url (r .url )
30
+
31
+
32
+ def normalize_eq (u , v ):
33
+ if u == v :
34
+ return True
35
+ warn (f"{ u } textually differs from { v } , please update the relevant case.\n "
36
+ "Attempting to recover by resolving redirects" )
37
+ return (simplify_url (u ) == simplify_url (v )
38
+ or resolve_redirects (u ) == resolve_redirects (v )
39
+ )
40
+
41
+
14
42
def test_valid_version () -> None :
15
43
"""Check that the package defines a valid __version__"""
16
44
assert parse_version (__version__ ) >= parse_version ("0.1.0" )
@@ -32,7 +60,7 @@ def test_validate_doi() -> None:
32
60
'https://linkinghub.elsevier.com/retrieve/pii/S0009261497040141' ),
33
61
]
34
62
for doi , url in data :
35
- assert url == validate_doi (doi )
63
+ assert normalize_eq ( url , validate_doi (doi ) )
36
64
37
65
for doi in ['' , 'asdf' ]:
38
66
try :
@@ -49,7 +77,7 @@ def test_get_real_url_from_doi() -> None:
49
77
'article/abs/pii/S0009261497040141' ),
50
78
]
51
79
for doi , url in data :
52
- assert url == get_real_url_from_doi (doi )
80
+ assert normalize_eq ( url , get_real_url_from_doi (doi ) )
53
81
54
82
55
83
def test_find_doi_in_line () -> None :
0 commit comments