sphinx/tests/test_theming.py

122 lines
4.0 KiB
Python

# -*- coding: utf-8 -*-
"""
test_theming
~~~~~~~~~~~~
Test the Theme class.
:copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
import os
import zipfile
import sys
import subprocess
import tempfile
from path import path
from sphinx.theming import Theme, ThemeError
from sphinx.util.osutil import cd
from util import with_app, raises, TestApp, rootdir
@with_app(confoverrides={'html_theme': 'ziptheme',
'html_theme_options.testopt': 'foo'})
def test_theme_api(app, status, warning):
cfg = app.config
# test Theme class API
assert set(Theme.themes.keys()) == \
set(['basic', 'default', 'scrolls', 'agogo', 'sphinxdoc', 'haiku',
'traditional', 'testtheme', 'ziptheme', 'epub', 'nature',
'pyramid', 'bizstyle', 'classic'])
assert Theme.themes['testtheme'][1] is None
assert isinstance(Theme.themes['ziptheme'][1], zipfile.ZipFile)
# test Theme instance API
theme = app.builder.theme
assert theme.name == 'ziptheme'
assert theme.themedir_created
themedir = theme.themedir
assert theme.base.name == 'basic'
assert len(theme.get_dirchain()) == 2
# direct setting
assert theme.get_confstr('theme', 'stylesheet') == 'custom.css'
# inherited setting
assert theme.get_confstr('options', 'nosidebar') == 'false'
# nonexisting setting
assert theme.get_confstr('theme', 'foobar', 'def') == 'def'
raises(ThemeError, theme.get_confstr, 'theme', 'foobar')
# options API
raises(ThemeError, theme.get_options, {'nonexisting': 'foo'})
options = theme.get_options(cfg.html_theme_options)
assert options['testopt'] == 'foo'
assert options['nosidebar'] == 'false'
# cleanup temp directories
theme.cleanup()
assert not os.path.exists(themedir)
@with_app(testroot='tocdepth') # a minimal root
def test_js_source(app, status, warning):
# Now sphinx provides non-minified JS files for jquery.js and underscore.js
# to clarify the source of the minified files. see also #1434.
# If you update the version of the JS file, please update the source of the
# JS file and version number in this test.
app.builder.build(['contents'])
v = '1.11.1'
msg = 'jquery.js version does not match to {v}'.format(v=v)
jquery_min = (app.outdir / '_static' / 'jquery.js').text()
assert 'jQuery v{v}'.format(v=v) in jquery_min, msg
jquery_src = (app.outdir / '_static' / 'jquery-{v}.js'.format(v=v)).text()
assert 'jQuery JavaScript Library v{v}'.format(v=v) in jquery_src, msg
v = '1.3.1'
msg = 'underscore.js version does not match to {v}'.format(v=v)
underscore_min = (app.outdir / '_static' / 'underscore.js').text()
assert 'Underscore.js {v}'.format(v=v) in underscore_min, msg
underscore_src = (app.outdir / '_static' / 'underscore-{v}.js'.format(v=v)).text()
assert 'Underscore.js {v}'.format(v=v) in underscore_src, msg
def test_theme_plugin():
tempdir = path(tempfile.mkdtemp())
testrootdir = rootdir / 'roots' / ('test-theming')
pkgdir = tempdir / 'theming'
testrootdir.copytree(pkgdir)
with cd(pkgdir):
command = [sys.executable, 'setup.py', 'install']
try:
proc = subprocess.Popen(
command,
env=os.environ,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = proc.communicate()
print(out)
print(err)
assert proc.returncode == 0, 'expect zero status for setup.py'
finally:
pass
command = ['sphinx-build', '.', '_build/html']
try:
proc = subprocess.Popen(
command,
env=os.environ,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = proc.communicate()
print(out)
print(err)
assert proc.returncode == 0, 'expect zero status for setup.py'
finally:
tempdir.rmtree(ignore_errors=True)