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.
pull/162/head
Tim Byrne 5 years ago
parent 2aa1710214
commit fb1181c8a9
No known key found for this signature in database
GPG Key ID: 14DB4FC2465A4B12

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

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

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

Loading…
Cancel
Save