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:
Ryan de Kleer 2022-09-15 16:51:34 -07:00
commit b10c7c699b
2 changed files with 42 additions and 26 deletions

View file

@ -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."""

View file

@ -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