2014-07-24 07:16:50 -04:00
|
|
|
from difflib import unified_diff
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
from conf import hook
|
|
|
|
from exc.test_failed import TestFailed
|
|
|
|
|
2014-08-08 01:54:08 -04:00
|
|
|
""" Post-Test Hook: ExpectedFiles
|
|
|
|
This is a Post-Test hook that checks the test directory for the files it
|
|
|
|
contains. A dictionary object is passed to it, which contains a mapping of
|
|
|
|
filenames and contents of all the files that the directory is expected to
|
|
|
|
contain.
|
|
|
|
Raises a TestFailed exception if the expected files are not found or if extra
|
|
|
|
files are found, else returns gracefully.
|
|
|
|
"""
|
|
|
|
|
2014-07-24 07:16:50 -04:00
|
|
|
|
|
|
|
@hook()
|
|
|
|
class ExpectedFiles:
|
|
|
|
def __init__(self, expected_fs):
|
|
|
|
self.expected_fs = expected_fs
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def gen_local_fs_snapshot():
|
|
|
|
snapshot = {}
|
|
|
|
for parent, dirs, files in os.walk('.'):
|
|
|
|
for name in files:
|
|
|
|
f = {'content': ''}
|
|
|
|
file_path = os.path.join(parent, name)
|
|
|
|
with open(file_path) as fp:
|
|
|
|
f['content'] = fp.read()
|
|
|
|
snapshot[file_path[2:]] = f
|
|
|
|
|
|
|
|
return snapshot
|
|
|
|
|
|
|
|
def __call__(self, test_obj):
|
|
|
|
local_fs = self.gen_local_fs_snapshot()
|
|
|
|
for file in self.expected_fs:
|
|
|
|
if file.name in local_fs:
|
|
|
|
local_file = local_fs.pop(file.name)
|
|
|
|
if file.content != local_file['content']:
|
|
|
|
for line in unified_diff(local_file['content'],
|
|
|
|
file.content,
|
|
|
|
fromfile='Actual',
|
|
|
|
tofile='Expected'):
|
|
|
|
print(line, file=sys.stderr)
|
2014-08-08 01:54:08 -04:00
|
|
|
raise TestFailed('Contents of %s do not match' % file.name)
|
2014-07-24 07:16:50 -04:00
|
|
|
else:
|
|
|
|
raise TestFailed('Expected file %s not found.' % file.name)
|
|
|
|
if local_fs:
|
|
|
|
print(local_fs)
|
|
|
|
raise TestFailed('Extra files downloaded.')
|