pelican/tests/test_webassets.py
Simon f413a8da79 Change webassets configuration for relative urls.
Set the ASSET_URL to be relative to the 'theme/' url, which requires to use
{{ SITEURL }}/{{ ASSET_URL }} in the template and make it works with both
relative and absolute urls.
2012-11-20 23:42:52 +01:00

102 lines
3.7 KiB
Python

# -*- coding: utf-8 -*-
import hashlib
import os
from codecs import open
from tempfile import mkdtemp
from shutil import rmtree
from pelican import Pelican
from pelican.settings import read_settings
from .support import unittest, skipIfNoExecutable, module_exists
CUR_DIR = os.path.dirname(__file__)
@unittest.skipUnless(module_exists('webassets'), "webassets isn't installed")
@skipIfNoExecutable(['scss', '-v'])
@skipIfNoExecutable(['cssmin', '--version'])
class TestWebAssets(unittest.TestCase):
def setUp(self):
"""Run pelican with two settings (absolute and relative urls)."""
self.theme_dir = os.path.join(CUR_DIR, 'themes', 'assets')
self.temp_path = mkdtemp()
self.settings = read_settings(override={
'PATH': os.path.join(CUR_DIR, 'content', 'TestCategory'),
'OUTPUT_PATH': self.temp_path,
'PLUGINS': ['pelican.plugins.assets', ],
'THEME': self.theme_dir,
})
pelican = Pelican(settings=self.settings)
pelican.run()
# run Pelican a second time with absolute urls
self.temp_path2 = mkdtemp()
self.settings2 = read_settings(override={
'PATH': os.path.join(CUR_DIR, 'content', 'TestCategory'),
'OUTPUT_PATH': self.temp_path2,
'PLUGINS': ['pelican.plugins.assets', ],
'THEME': self.theme_dir,
'RELATIVE_URLS': False,
'SITEURL': 'http://localhost'
})
pelican2 = Pelican(settings=self.settings2)
pelican2.run()
self.css_ref = open(os.path.join(self.theme_dir, 'static', 'css',
'style.min.css')).read()
self.version = hashlib.md5(self.css_ref).hexdigest()[0:8]
def tearDown(self):
rmtree(self.temp_path)
rmtree(self.temp_path2)
def test_jinja2_ext(self):
"""Test that the Jinja2 extension was correctly added."""
from webassets.ext.jinja2 import AssetsExtension
self.assertIn(AssetsExtension, self.settings['JINJA_EXTENSIONS'])
def test_compilation(self):
"""Compare the compiled css with the reference."""
gen_file = os.path.join(self.temp_path, 'theme', 'gen',
'style.{0}.min.css'.format(self.version))
self.assertTrue(os.path.isfile(gen_file))
css_new = open(gen_file).read()
self.assertEqual(css_new, self.css_ref)
def check_link_tag(self, css_file, html_file):
"""Check the presence of `css_file` in `html_file`."""
link_tag = '<link rel="stylesheet" href="{css_file}">'.\
format(css_file=css_file)
html = open(html_file).read()
self.assertRegexpMatches(html, link_tag)
def test_template(self):
"""Look in the output index.html file for the link tag."""
css_file = './theme/gen/style.{0}.min.css'.format(self.version)
html_files = ['index.html', 'archives.html',
'this-is-an-article-with-category.html']
for f in html_files:
self.check_link_tag(css_file, os.path.join(self.temp_path, f))
self.check_link_tag(
'.././theme/gen/style.{0}.min.css'.format(self.version),
os.path.join(self.temp_path, 'category/misc.html'))
def test_absolute_url(self):
"""Look in the output index.html file for the link tag with abs url."""
css_file = 'http://localhost/theme/gen/style.{0}.min.css'.\
format(self.version)
html_files = ['index.html', 'archives.html',
'this-is-an-article-with-category.html']
for f in html_files:
self.check_link_tag(css_file, os.path.join(self.temp_path2, f))