1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
import base64
import hashlib
from pathlib import Path
import pytest
import sphinx
from sphinx.testing.path import path
from sphinx.testing.util import SphinxTestApp
from sphinxcontrib.jquery import _FILES, _ROOT_DIR # NoQA
def run_blank_app(srcdir, **kwargs):
Path(srcdir, "conf.py").write_text("", encoding="ascii")
if sphinx.version_info[:2] >= (2, 0):
Path(srcdir, "index.rst").touch()
else:
Path(srcdir, "contents.rst").touch()
for _ in range(2): # build twice to test re-builds
app = SphinxTestApp(**kwargs, srcdir=srcdir)
app.builder.build_all()
app.cleanup()
return Path(srcdir, "_build", "html")
@pytest.fixture(scope="function")
def blank_app(tmpdir, monkeypatch):
if sphinx.version_info >= (7, 2):
def inner(**kwargs):
return run_blank_app(Path(tmpdir), **kwargs)
else:
def inner(**kwargs):
return run_blank_app(path(tmpdir), **kwargs)
monkeypatch.setattr("sphinx.application.abspath", lambda x: x)
yield inner
@pytest.mark.skipif(sphinx.version_info[:2] < (6, 0),
reason="Requires Sphinx 6.0 or greater")
def test_jquery_installed_sphinx_ge_60_use_sri(blank_app):
out_dir = blank_app(confoverrides={"extensions": ["sphinxcontrib.jquery"], "jquery_use_sri": True})
text = out_dir.joinpath("index.html").read_text(encoding="utf-8")
checksum = '?v=2cd50e6c' if sphinx.version_info[:2] >= (7, 1) else ''
assert ('<script '
'integrity="sha384-lSZeSIVKp9myfKbDQ3GkN/KHjUc+mzg17VKDN4Y2kUeBSJioB9QSM639vM9fuY//" '
f'src="_static/_sphinx_javascript_frameworks_compat.js{checksum}"></script>') in text
static_dir = out_dir / '_static'
assert static_dir.joinpath('jquery.js').is_file()
assert static_dir.joinpath('_sphinx_javascript_frameworks_compat.js').is_file()
@pytest.mark.skipif(sphinx.version_info[:2] < (6, 0),
reason="Requires Sphinx 6.0 or greater")
def test_jquery_installed_sphinx_ge_60(blank_app):
out_dir = blank_app(confoverrides={"extensions": ["sphinxcontrib.jquery"]})
text = out_dir.joinpath("index.html").read_text(encoding="utf-8")
checksum = '?v=2cd50e6c' if sphinx.version_info[:2] >= (7, 1) else ''
assert ('<script '
f'src="_static/_sphinx_javascript_frameworks_compat.js{checksum}"></script>') in text
static_dir = out_dir / '_static'
assert static_dir.joinpath('jquery.js').is_file()
assert static_dir.joinpath('_sphinx_javascript_frameworks_compat.js').is_file()
@pytest.mark.skipif(sphinx.version_info[:2] >= (6, 0),
reason="Requires Sphinx older than 6.0")
def test_jquery_installed_sphinx_lt_60(blank_app):
out_dir = blank_app(confoverrides={"extensions": ["sphinxcontrib.jquery"]})
if sphinx.version_info[:2] >= (2, 0):
text = out_dir.joinpath("index.html").read_text(encoding="utf-8")
assert '<script src="_static/jquery.js"></script>' in text
else:
text = out_dir.joinpath("contents.html").read_text(encoding="utf-8")
assert '<script type="text/javascript" src="_static/jquery.js"></script>' in text
if sphinx.version_info[:1] == (5,):
assert '<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>' in text
static_dir = out_dir / '_static'
assert static_dir.joinpath('jquery.js').is_file()
if sphinx.version_info[:1] == (5,):
assert static_dir.joinpath('_sphinx_javascript_frameworks_compat.js').is_file()
@pytest.mark.parametrize(('filename', 'integrity'), _FILES[1:], ids=[*dict(_FILES[1:])])
def test_integrity(filename, integrity):
checksum = hashlib.sha384(Path(_ROOT_DIR, filename).read_bytes())
encoded = base64.b64encode(checksum.digest()).decode(encoding='ascii')
assert f"sha384-{encoded}" == integrity
|