vdirsyncer/tests/system/cli/test_repair.py
2017-02-11 20:24:55 +01:00

73 lines
2 KiB
Python

# encoding: utf-8
from textwrap import dedent
import pytest
@pytest.fixture
def storage(tmpdir, runner):
runner.write_with_general(dedent('''
[storage foo]
type = "filesystem"
path = "{base}/foo/"
fileext = ".txt"
''').format(base=str(tmpdir)))
return tmpdir.mkdir('foo')
@pytest.mark.parametrize('collection', [None, "foocoll"])
def test_basic(storage, runner, collection):
if collection is not None:
storage = storage.mkdir(collection)
collection_arg = 'foo/{}'.format(collection)
else:
collection_arg = 'foo'
argv = ['repair', collection_arg]
result = runner.invoke(argv, input='y')
assert not result.exception
storage.join('item.txt').write('BEGIN:VCARD\nEND:VCARD')
storage.join('toobroken.txt').write('')
result = runner.invoke(argv, input='y')
assert not result.exception
assert 'No UID' in result.output
assert '\'toobroken.txt\' is malformed beyond repair' \
in result.output
new_fname, = [x for x in storage.listdir() if 'toobroken' not in str(x)]
assert 'UID:' in new_fname.read()
@pytest.mark.parametrize('repair_uids', [None, True, False])
def test_repair_uids(storage, runner, repair_uids):
f = storage.join('baduid.txt')
orig_f = 'BEGIN:VCARD\nUID:!!!!!\nEND:VCARD'
f.write(orig_f)
if repair_uids is None:
opt = []
elif repair_uids:
opt = ['--repair-unsafe-uid']
else:
opt = ['--no-repair-unsafe-uid']
result = runner.invoke(['repair'] + opt + ['foo'], input='y')
assert not result.exception
if repair_uids:
assert 'UID or href is unsafe, assigning random UID' in result.output
assert not f.exists()
new_f, = storage.listdir()
s = new_f.read()
assert s.startswith('BEGIN:VCARD')
assert s.endswith('END:VCARD')
assert s != orig_f
else:
assert 'UID may cause problems, add --repair-unsafe-uid to repair.' \
in result.output
assert f.read() == orig_f