Add tests for directory alternates

While this feature was added back in version 1.05, tests were never
added for it. These tests have identified bugs in the directory
alternates.
This commit is contained in:
Tim Byrne 2019-04-04 18:01:27 -05:00
parent 2aa1710214
commit fb1181c8a9
No known key found for this signature in database
GPG Key ID: 14DB4FC2465A4B12
3 changed files with 102 additions and 43 deletions

View File

@ -3,9 +3,12 @@ good-names=pytestmark
[DESIGN] [DESIGN]
max-args=14 max-args=14
max-locals=26 max-locals=27
max-attributes=8 max-attributes=8
max-statements=65 max-statements=65
[MESSAGES CONTROL] [MESSAGES CONTROL]
disable=redefined-outer-name disable=redefined-outer-name
[TYPECHECK]
ignored-modules=py

View File

@ -3,6 +3,7 @@
import os import os
import re import re
import string import string
import py
import pytest import pytest
import utils import utils
@ -33,6 +34,8 @@ WILD_TEMPLATES = [
'##$tst_class.$tst_sys.$tst_host.$tst_user', '##$tst_class.$tst_sys.$tst_host.$tst_user',
] ]
TEST_PATHS = [utils.ALT_FILE1, utils.ALT_FILE2, utils.ALT_DIR]
WILD_TESTED = set() WILD_TESTED = set()
@ -90,12 +93,18 @@ def test_alt(runner, yadm_y, paths,
linked = linked_list(run.out) linked = linked_list(run.out)
# assert the proper linking has occurred # assert the proper linking has occurred
for file_path in (utils.ALT_FILE1, utils.ALT_FILE2): for file_path in TEST_PATHS:
source_file = file_path + precedence[precedence_index] source_file = file_path + precedence[precedence_index]
if tracked or (encrypt and not exclude): if tracked or (encrypt and not exclude):
assert paths.work.join(file_path).islink() assert paths.work.join(file_path).islink()
assert paths.work.join(file_path).read() == source_file target = py.path.local(paths.work.join(file_path).readlink())
assert str(paths.work.join(source_file)) in linked if target.isfile():
assert paths.work.join(file_path).read() == source_file
assert str(paths.work.join(source_file)) in linked
else:
assert paths.work.join(file_path).join(
utils.CONTAINED).read() == source_file
assert str(paths.work.join(source_file)) in linked
else: else:
assert not paths.work.join(file_path).exists() assert not paths.work.join(file_path).exists()
assert str(paths.work.join(source_file)) not in linked assert str(paths.work.join(source_file)) not in linked
@ -169,8 +178,7 @@ def test_wild(request, runner, yadm_y, paths,
test_key = f'{tracked}{encrypt}{wild_suffix}{std_suffix}' test_key = f'{tracked}{encrypt}{wild_suffix}{std_suffix}'
if test_key in WILD_TESTED: if test_key in WILD_TESTED:
return return
else: WILD_TESTED.add(test_key)
WILD_TESTED.add(test_key)
# set the class # set the class
utils.set_local(paths, 'class', tst_class) utils.set_local(paths, 'class', tst_class)
@ -186,11 +194,17 @@ def test_wild(request, runner, yadm_y, paths,
linked = linked_list(run.out) linked = linked_list(run.out)
# assert the proper linking has occurred # assert the proper linking has occurred
for file_path in (utils.ALT_FILE1, utils.ALT_FILE2): for file_path in TEST_PATHS:
source_file = file_path + wild_suffix source_file = file_path + wild_suffix
assert paths.work.join(file_path).islink() assert paths.work.join(file_path).islink()
assert paths.work.join(file_path).read() == source_file target = py.path.local(paths.work.join(file_path).readlink())
assert str(paths.work.join(source_file)) in linked if target.isfile():
assert paths.work.join(file_path).read() == source_file
assert str(paths.work.join(source_file)) in linked
else:
assert paths.work.join(file_path).join(
utils.CONTAINED).read() == source_file
assert str(paths.work.join(source_file)) in linked
# create files using the standard suffix # create files using the standard suffix
utils.create_alt_files(paths, std_suffix, tracked=tracked, utils.create_alt_files(paths, std_suffix, tracked=tracked,
@ -203,11 +217,17 @@ def test_wild(request, runner, yadm_y, paths,
linked = linked_list(run.out) linked = linked_list(run.out)
# assert the proper linking has occurred # assert the proper linking has occurred
for file_path in (utils.ALT_FILE1, utils.ALT_FILE2): for file_path in TEST_PATHS:
source_file = file_path + std_suffix source_file = file_path + std_suffix
assert paths.work.join(file_path).islink() assert paths.work.join(file_path).islink()
assert paths.work.join(file_path).read() == source_file target = py.path.local(paths.work.join(file_path).readlink())
assert str(paths.work.join(source_file)) in linked if target.isfile():
assert paths.work.join(file_path).read() == source_file
assert str(paths.work.join(source_file)) in linked
else:
assert paths.work.join(file_path).join(
utils.CONTAINED).read() == source_file
assert str(paths.work.join(source_file)) in linked
@pytest.mark.usefixtures('ds1_copy') @pytest.mark.usefixtures('ds1_copy')
@ -235,11 +255,17 @@ def test_local_override(runner, yadm_y, paths,
linked = linked_list(run.out) linked = linked_list(run.out)
# assert the proper linking has occurred # assert the proper linking has occurred
for file_path in (utils.ALT_FILE1, utils.ALT_FILE2): for file_path in TEST_PATHS:
source_file = file_path + '##or-class.or-os.or-hostname.or-user' source_file = file_path + '##or-class.or-os.or-hostname.or-user'
assert paths.work.join(file_path).islink() assert paths.work.join(file_path).islink()
assert paths.work.join(file_path).read() == source_file target = py.path.local(paths.work.join(file_path).readlink())
assert str(paths.work.join(source_file)) in linked if target.isfile():
assert paths.work.join(file_path).read() == source_file
assert str(paths.work.join(source_file)) in linked
else:
assert paths.work.join(file_path).join(
utils.CONTAINED).read() == source_file
assert str(paths.work.join(source_file)) in linked
@pytest.mark.parametrize('suffix', ['AAA', 'ZZZ', 'aaa', 'zzz']) @pytest.mark.parametrize('suffix', ['AAA', 'ZZZ', 'aaa', 'zzz'])
@ -267,11 +293,17 @@ def test_class_case(runner, yadm_y, paths, tst_sys, suffix):
linked = linked_list(run.out) linked = linked_list(run.out)
# assert the proper linking has occurred # assert the proper linking has occurred
for file_path in (utils.ALT_FILE1, utils.ALT_FILE2): for file_path in TEST_PATHS:
source_file = file_path + f'##{suffix}' source_file = file_path + f'##{suffix}'
assert paths.work.join(file_path).islink() assert paths.work.join(file_path).islink()
assert paths.work.join(file_path).read() == source_file target = py.path.local(paths.work.join(file_path).readlink())
assert str(paths.work.join(source_file)) in linked if target.isfile():
assert paths.work.join(file_path).read() == source_file
assert str(paths.work.join(source_file)) in linked
else:
assert paths.work.join(file_path).join(
utils.CONTAINED).read() == source_file
assert str(paths.work.join(source_file)) in linked
@pytest.mark.parametrize('autoalt', [None, 'true', 'false']) @pytest.mark.parametrize('autoalt', [None, 'true', 'false'])
@ -294,15 +326,22 @@ def test_auto_alt(runner, yadm_y, paths, autoalt):
linked = linked_list(run.out) linked = linked_list(run.out)
# assert the proper linking has occurred # assert the proper linking has occurred
for file_path in (utils.ALT_FILE1, utils.ALT_FILE2): for file_path in TEST_PATHS:
source_file = file_path + suffix source_file = file_path + suffix
if autoalt == 'false': if autoalt == 'false':
assert not paths.work.join(file_path).exists() assert not paths.work.join(file_path).exists()
else: else:
assert paths.work.join(file_path).islink() assert paths.work.join(file_path).islink()
assert paths.work.join(file_path).read() == source_file target = py.path.local(paths.work.join(file_path).readlink())
# no linking output when run via auto-alt if target.isfile():
assert str(paths.work.join(source_file)) not in linked assert paths.work.join(file_path).read() == source_file
# no linking output when run via auto-alt
assert str(paths.work.join(source_file)) not in linked
else:
assert paths.work.join(file_path).join(
utils.CONTAINED).read() == source_file
# no linking output when run via auto-alt
assert str(paths.work.join(source_file)) not in linked
@pytest.mark.parametrize('delimiter', ['.', '_']) @pytest.mark.parametrize('delimiter', ['.', '_'])
@ -324,12 +363,18 @@ def test_delimiter(runner, yadm_y, paths,
# assert the proper linking has occurred # assert the proper linking has occurred
# only a delimiter of '.' is valid # only a delimiter of '.' is valid
for file_path in (utils.ALT_FILE1, utils.ALT_FILE2): for file_path in TEST_PATHS:
source_file = file_path + suffix source_file = file_path + suffix
if delimiter == '.': if delimiter == '.':
assert paths.work.join(file_path).islink() assert paths.work.join(file_path).islink()
assert paths.work.join(file_path).read() == source_file target = py.path.local(paths.work.join(file_path).readlink())
assert str(paths.work.join(source_file)) in linked if target.isfile():
assert paths.work.join(file_path).read() == source_file
assert str(paths.work.join(source_file)) in linked
else:
assert paths.work.join(file_path).join(
utils.CONTAINED).read() == source_file
assert str(paths.work.join(source_file)) in linked
else: else:
assert not paths.work.join(file_path).exists() assert not paths.work.join(file_path).exists()
assert str(paths.work.join(source_file)) not in linked assert str(paths.work.join(source_file)) not in linked

View File

@ -7,6 +7,11 @@ import os
ALT_FILE1 = 'test_alt' ALT_FILE1 = 'test_alt'
ALT_FILE2 = 'test alt/test alt' ALT_FILE2 = 'test alt/test alt'
ALT_DIR = 'test alt/test alt dir'
# Directory based alternates must have a tracked contained file.
# This will be the test contained file name
CONTAINED = 'contained_file'
def set_local(paths, variable, value): def set_local(paths, variable, value):
@ -29,31 +34,37 @@ def create_alt_files(paths, suffix,
""" """
if not preserve: if not preserve:
if paths.work.join(ALT_FILE1).exists(): for remove_path in (ALT_FILE1, ALT_FILE2, ALT_DIR):
paths.work.join(ALT_FILE1).remove(rec=1, ignore_errors=True) if paths.work.join(remove_path).exists():
assert not paths.work.join(ALT_FILE1).exists() paths.work.join(remove_path).remove(rec=1, ignore_errors=True)
if paths.work.join(ALT_FILE2).exists(): assert not paths.work.join(remove_path).exists()
paths.work.join(ALT_FILE2).remove(rec=1, ignore_errors=True)
assert not paths.work.join(ALT_FILE2).exists()
new_file1 = paths.work.join(ALT_FILE1 + suffix) new_file1 = paths.work.join(ALT_FILE1 + suffix)
new_file1.write(ALT_FILE1 + suffix, ensure=True) new_file1.write(ALT_FILE1 + suffix, ensure=True)
new_file2 = paths.work.join(ALT_FILE2 + suffix) new_file2 = paths.work.join(ALT_FILE2 + suffix)
new_file2.write(ALT_FILE2 + suffix, ensure=True) new_file2.write(ALT_FILE2 + suffix, ensure=True)
if content: new_dir = paths.work.join(ALT_DIR + suffix).join(CONTAINED)
new_file1.write('\n' + content, mode='a', ensure=True) new_dir.write(ALT_DIR + suffix, ensure=True)
new_file2.write('\n' + content, mode='a', ensure=True)
assert new_file1.exists() # Do not test directory support for jinja alternates
assert new_file2.exists() test_paths = [new_file1, new_file2]
test_names = [ALT_FILE1, ALT_FILE2]
if suffix != '##yadm.j2':
test_paths += [new_dir]
test_names += [ALT_DIR]
for test_path in test_paths:
if content:
test_path.write('\n' + content, mode='a', ensure=True)
assert test_path.exists()
if tracked: if tracked:
for path in (new_file1, new_file2): for track_path in test_paths:
os.system(f'GIT_DIR={str(paths.repo)} git add "{path}"') os.system(f'GIT_DIR={str(paths.repo)} git add "{track_path}"')
os.system(f'GIT_DIR={str(paths.repo)} git commit -m "Add test files"') os.system(f'GIT_DIR={str(paths.repo)} git commit -m "Add test files"')
if encrypt: if encrypt:
paths.encrypt.write(f'{ALT_FILE1 + suffix}\n', mode='a') for encrypt_name in test_names:
paths.encrypt.write(f'{ALT_FILE2 + suffix}\n', mode='a') paths.encrypt.write(f'{encrypt_name + suffix}\n', mode='a')
if exclude: if exclude:
paths.encrypt.write(f'!{ALT_FILE1 + suffix}\n', mode='a') paths.encrypt.write(f'!{encrypt_name + suffix}\n', mode='a')
paths.encrypt.write(f'!{ALT_FILE2 + suffix}\n', mode='a')