mirror of
https://github.com/TheLocehiliosan/yadm
synced 2024-10-27 20:34:27 +00:00
e7f9616b39
The new test system is written with py.test. These tests are more comprehensive, run faster by an order of magnitude, and are far more maintainable. The tests themselves conform to PEP8.
176 lines
5.2 KiB
Python
176 lines
5.2 KiB
Python
"""Unit tests: parse_encrypt"""
|
|
|
|
import pytest
|
|
|
|
|
|
def test_not_called(runner, paths):
|
|
"""Test parse_encrypt (not called)"""
|
|
run = run_parse_encrypt(runner, paths, skip_parse=True)
|
|
assert run.success
|
|
assert run.err == ''
|
|
assert 'EIF:unparsed' in run.out, 'EIF should be unparsed'
|
|
assert 'EIF_COUNT:1' in run.out, 'Only value of EIF should be unparsed'
|
|
|
|
|
|
def test_short_circuit(runner, paths):
|
|
"""Test parse_encrypt (short-circuit)"""
|
|
run = run_parse_encrypt(runner, paths, twice=True)
|
|
assert run.success
|
|
assert run.err == ''
|
|
assert 'PARSE_ENCRYPT_SHORT=parse_encrypt() not reprocessed' in run.out, (
|
|
'parse_encrypt() should short-circuit')
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
'encrypt', [
|
|
('missing'),
|
|
('empty'),
|
|
])
|
|
def test_empty(runner, paths, encrypt):
|
|
"""Test parse_encrypt (file missing/empty)"""
|
|
|
|
# write encrypt file
|
|
if encrypt == 'missing':
|
|
assert not paths.encrypt.exists(), 'Encrypt should be missing'
|
|
else:
|
|
paths.encrypt.write('')
|
|
assert paths.encrypt.exists(), 'Encrypt should exist'
|
|
assert paths.encrypt.size() == 0, 'Encrypt should be empty'
|
|
|
|
# run parse_encrypt
|
|
run = run_parse_encrypt(runner, paths)
|
|
assert run.success
|
|
assert run.err == ''
|
|
|
|
# validate parsing result
|
|
assert 'EIF_COUNT:0' in run.out, 'EIF should be empty'
|
|
|
|
|
|
@pytest.mark.usefixtures('ds1_repo_copy')
|
|
def test_file_parse_encrypt(runner, paths):
|
|
"""Test parse_encrypt
|
|
|
|
Test an array of supported features of the encrypt configuration.
|
|
"""
|
|
|
|
edata = ''
|
|
expected = set()
|
|
|
|
# empty line
|
|
edata += '\n'
|
|
|
|
# simple comments
|
|
edata += '# a simple comment\n'
|
|
edata += ' # a comment with leading space\n'
|
|
|
|
# unreferenced directory
|
|
paths.work.join('unreferenced').mkdir()
|
|
|
|
# simple files
|
|
edata += 'simple_file\n'
|
|
edata += 'simple.file\n'
|
|
paths.work.join('simple_file').write('')
|
|
paths.work.join('simple.file').write('')
|
|
paths.work.join('simple_file2').write('')
|
|
paths.work.join('simple.file2').write('')
|
|
expected.add('simple_file')
|
|
expected.add('simple.file')
|
|
|
|
# simple files in directories
|
|
edata += 'simple_dir/simple_file\n'
|
|
paths.work.join('simple_dir/simple_file').write('', ensure=True)
|
|
paths.work.join('simple_dir/simple_file2').write('', ensure=True)
|
|
expected.add('simple_dir/simple_file')
|
|
|
|
# paths with spaces
|
|
edata += 'with space/with space\n'
|
|
paths.work.join('with space/with space').write('', ensure=True)
|
|
paths.work.join('with space/with space2').write('', ensure=True)
|
|
expected.add('with space/with space')
|
|
|
|
# hidden files
|
|
edata += '.hidden\n'
|
|
paths.work.join('.hidden').write('')
|
|
expected.add('.hidden')
|
|
|
|
# hidden files in directories
|
|
edata += '.hidden_dir/.hidden_file\n'
|
|
paths.work.join('.hidden_dir/.hidden_file').write('', ensure=True)
|
|
expected.add('.hidden_dir/.hidden_file')
|
|
|
|
# wildcards
|
|
edata += 'wild*\n'
|
|
paths.work.join('wildcard1').write('', ensure=True)
|
|
paths.work.join('wildcard2').write('', ensure=True)
|
|
expected.add('wildcard1')
|
|
expected.add('wildcard2')
|
|
|
|
edata += 'dirwild*\n'
|
|
paths.work.join('dirwildcard/file1').write('', ensure=True)
|
|
paths.work.join('dirwildcard/file2').write('', ensure=True)
|
|
expected.add('dirwildcard')
|
|
|
|
# excludes
|
|
edata += 'exclude*\n'
|
|
edata += 'ex ex/*\n'
|
|
paths.work.join('exclude_file1').write('')
|
|
paths.work.join('exclude_file2.ex').write('')
|
|
paths.work.join('exclude_file3.ex3').write('')
|
|
expected.add('exclude_file1')
|
|
expected.add('exclude_file3.ex3')
|
|
edata += '!*.ex\n'
|
|
edata += '!ex ex/*.txt\n'
|
|
paths.work.join('ex ex/file4').write('', ensure=True)
|
|
paths.work.join('ex ex/file5.txt').write('', ensure=True)
|
|
paths.work.join('ex ex/file6.text').write('', ensure=True)
|
|
expected.add('ex ex/file4')
|
|
expected.add('ex ex/file6.text')
|
|
|
|
# write encrypt file
|
|
print(f'ENCRYPT:\n---\n{edata}---\n')
|
|
paths.encrypt.write(edata)
|
|
assert paths.encrypt.isfile()
|
|
|
|
# run parse_encrypt
|
|
run = run_parse_encrypt(runner, paths)
|
|
assert run.success
|
|
assert run.err == ''
|
|
|
|
assert f'EIF_COUNT:{len(expected)}' in run.out, 'EIF count wrong'
|
|
for expected_file in expected:
|
|
assert f'EIF:{expected_file}\n' in run.out
|
|
|
|
|
|
def run_parse_encrypt(
|
|
runner, paths,
|
|
skip_parse=False,
|
|
twice=False):
|
|
"""Run parse_encrypt
|
|
|
|
A count of ENCRYPT_INCLUDE_FILES will be reported as EIF_COUNT:X. All
|
|
values of ENCRYPT_INCLUDE_FILES will be reported as individual EIF:value
|
|
lines.
|
|
"""
|
|
parse_cmd = 'parse_encrypt'
|
|
if skip_parse:
|
|
parse_cmd = ''
|
|
if twice:
|
|
parse_cmd = 'parse_encrypt; parse_encrypt'
|
|
script = f"""
|
|
YADM_TEST=1 source {paths.pgm}
|
|
YADM_ENCRYPT={paths.encrypt}
|
|
export YADM_ENCRYPT
|
|
GIT_DIR={paths.repo}
|
|
export GIT_DIR
|
|
{parse_cmd}
|
|
export ENCRYPT_INCLUDE_FILES
|
|
export PARSE_ENCRYPT_SHORT
|
|
env
|
|
echo EIF_COUNT:${{#ENCRYPT_INCLUDE_FILES[@]}}
|
|
for value in "${{ENCRYPT_INCLUDE_FILES[@]}}"; do
|
|
echo "EIF:$value"
|
|
done
|
|
"""
|
|
run = runner(command=['bash'], inp=script)
|
|
return run
|