mirror of
https://github.com/getpelican/pelican.git
synced 2025-10-15 20:28:56 +02:00
Fix false-positive in content gen. test failures
Assert equal dirs by return value of diff subprocess, rather than its output. This prevents tests from failing when file contents are the same but the file modes are different. Fix #3042
This commit is contained in:
parent
f015ab89d9
commit
b10c7c699b
2 changed files with 42 additions and 26 deletions
|
|
@ -218,6 +218,23 @@ class LogCountHandler(BufferingHandler):
|
|||
])
|
||||
|
||||
|
||||
def diff_subproc(first, second):
|
||||
"""
|
||||
Return a subprocess that runs a diff on the two paths.
|
||||
|
||||
Check results with::
|
||||
|
||||
>>> out_stream, err_stream = proc.communicate()
|
||||
>>> didCheckFail = proc.returnCode != 0
|
||||
"""
|
||||
return subprocess.Popen(
|
||||
['git', '--no-pager', 'diff', '--no-ext-diff', '--exit-code',
|
||||
'-w', first, second],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE
|
||||
)
|
||||
|
||||
|
||||
class LoggedTestCase(unittest.TestCase):
|
||||
"""A test case that captures log messages."""
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import logging
|
|||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import unittest
|
||||
from collections.abc import Sequence
|
||||
from shutil import rmtree
|
||||
from tempfile import mkdtemp
|
||||
|
|
@ -10,8 +11,12 @@ from tempfile import mkdtemp
|
|||
from pelican import Pelican
|
||||
from pelican.generators import StaticGenerator
|
||||
from pelican.settings import read_settings
|
||||
from pelican.tests.support import (LoggedTestCase, locale_available,
|
||||
mute, unittest)
|
||||
from pelican.tests.support import (
|
||||
LoggedTestCase,
|
||||
diff_subproc,
|
||||
locale_available,
|
||||
mute
|
||||
)
|
||||
|
||||
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
SAMPLES_PATH = os.path.abspath(os.path.join(
|
||||
|
|
@ -54,28 +59,19 @@ class TestPelican(LoggedTestCase):
|
|||
locale.setlocale(locale.LC_ALL, self.old_locale)
|
||||
super().tearDown()
|
||||
|
||||
def assertDirsEqual(self, left_path, right_path):
|
||||
out, err = subprocess.Popen(
|
||||
['git', '--no-pager', 'diff', '--no-ext-diff', '--exit-code',
|
||||
'-w', left_path, right_path],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE
|
||||
).communicate()
|
||||
def assertDirsEqual(self, left_path, right_path, msg=None):
|
||||
"""
|
||||
Check if the files are the same (ignoring whitespace) below both paths.
|
||||
"""
|
||||
proc = diff_subproc(left_path, right_path)
|
||||
|
||||
def ignorable_git_crlf_errors(line):
|
||||
# Work around for running tests on Windows
|
||||
for msg in [
|
||||
"LF will be replaced by CRLF",
|
||||
"CRLF will be replaced by LF",
|
||||
"The file will have its original line endings"]:
|
||||
if msg in line:
|
||||
return True
|
||||
return False
|
||||
if err:
|
||||
err = '\n'.join([line for line in err.decode('utf8').splitlines()
|
||||
if not ignorable_git_crlf_errors(line)])
|
||||
assert not out, out
|
||||
assert not err, err
|
||||
out, err = proc.communicate()
|
||||
if proc.returncode != 0:
|
||||
msg = self._formatMessage(
|
||||
msg,
|
||||
"%s and %s differ:\n%s" % (left_path, right_path, err)
|
||||
)
|
||||
raise self.failureException(msg)
|
||||
|
||||
def test_order_of_generators(self):
|
||||
# StaticGenerator must run last, so it can identify files that
|
||||
|
|
@ -104,7 +100,8 @@ class TestPelican(LoggedTestCase):
|
|||
pelican = Pelican(settings=settings)
|
||||
mute(True)(pelican.run)()
|
||||
self.assertDirsEqual(
|
||||
self.temp_path, os.path.join(OUTPUT_PATH, 'basic'))
|
||||
self.temp_path, os.path.join(OUTPUT_PATH, 'basic')
|
||||
)
|
||||
self.assertLogCountEqual(
|
||||
count=1,
|
||||
msg="Unable to find.*skipping url replacement",
|
||||
|
|
@ -121,7 +118,8 @@ class TestPelican(LoggedTestCase):
|
|||
pelican = Pelican(settings=settings)
|
||||
mute(True)(pelican.run)()
|
||||
self.assertDirsEqual(
|
||||
self.temp_path, os.path.join(OUTPUT_PATH, 'custom'))
|
||||
self.temp_path, os.path.join(OUTPUT_PATH, 'custom')
|
||||
)
|
||||
|
||||
@unittest.skipUnless(locale_available('fr_FR.UTF-8') or
|
||||
locale_available('French'), 'French locale needed')
|
||||
|
|
@ -141,7 +139,8 @@ class TestPelican(LoggedTestCase):
|
|||
pelican = Pelican(settings=settings)
|
||||
mute(True)(pelican.run)()
|
||||
self.assertDirsEqual(
|
||||
self.temp_path, os.path.join(OUTPUT_PATH, 'custom_locale'))
|
||||
self.temp_path, os.path.join(OUTPUT_PATH, 'custom_locale')
|
||||
)
|
||||
|
||||
def test_theme_static_paths_copy(self):
|
||||
# the same thing with a specified set of settings should work
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue