From 8a6ad410da49f76b312b5218cf003c9ee26844bb Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Thu, 25 Feb 2016 02:57:26 +0100 Subject: [PATCH] Tests for fetchparams --- tests/cli/test_fetchparams.py | 129 ++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/tests/cli/test_fetchparams.py b/tests/cli/test_fetchparams.py index 129aafb..c853e8d 100644 --- a/tests/cli/test_fetchparams.py +++ b/tests/cli/test_fetchparams.py @@ -2,6 +2,42 @@ from textwrap import dedent +from hypothesis import given +import hypothesis.strategies as st + +import pytest + +from vdirsyncer import exceptions +from vdirsyncer.cli.fetchparams import STRATEGIES, expand_fetch_params +from vdirsyncer.utils.compat import PY2 + + +@pytest.fixture +def mystrategy(monkeypatch): + def strategy(x): + calls.append(x) + return x + calls = [] + monkeypatch.setitem(STRATEGIES, 'mystrategy', strategy) + return calls + + +@pytest.fixture +def value_cache(monkeypatch): + _cache = {} + + class FakeContext(object): + fetched_params = _cache + + def find_object(self, _): + return self + + def get_context(*a, **kw): + return FakeContext() + + monkeypatch.setattr('click.get_current_context', get_context) + return _cache + def test_get_password_from_command(tmpdir, runner): runner.write_with_general(dedent(''' @@ -42,3 +78,96 @@ def test_get_password_from_command(tmpdir, runner): result = runner.invoke(['sync'], input='.asdf\n') assert not result.exception assert [x.basename for x in bar.join('a').listdir()] == ['foo.asdf'] + + +def test_key_conflict(monkeypatch, mystrategy): + with pytest.raises(ValueError) as excinfo: + expand_fetch_params({ + 'foo': 'bar', + 'foo.fetch': ['mystrategy', 'baz'] + }) + + assert 'Can\'t set foo.fetch and foo.' in str(excinfo.value) + + +@pytest.mark.skipif(PY2, reason='Don\'t care about Python 2') +@given(s=st.text(), t=st.text(min_size=1)) +def test_fuzzing(s, t, mystrategy): + config = expand_fetch_params({ + '{}.fetch'.format(s): ['mystrategy', t] + }) + + assert config[s] == t + + +@pytest.mark.parametrize('value', [ + [], + 'lol', + 42 +]) +def test_invalid_fetch_value(mystrategy, value): + with pytest.raises(ValueError) as excinfo: + expand_fetch_params({ + 'foo.fetch': value + }) + + assert 'Expected a list' in str(excinfo.value) or \ + 'Expected list of length > 0' in str(excinfo.value) + + +def test_unknown_strategy(): + with pytest.raises(exceptions.UserError) as excinfo: + expand_fetch_params({ + 'foo.fetch': ['unreal', 'asdf'] + }) + + assert 'Unknown strategy' in str(excinfo.value) + + +def test_caching(monkeypatch, mystrategy, value_cache): + orig_cfg = {'foo.fetch': ['mystrategy', 'asdf']} + + rv = expand_fetch_params(orig_cfg) + assert rv['foo'] == 'asdf' + assert mystrategy == ['asdf'] + assert len(value_cache) == 1 + + rv = expand_fetch_params(orig_cfg) + assert rv['foo'] == 'asdf' + assert mystrategy == ['asdf'] + assert len(value_cache) == 1 + + value_cache.clear() + rv = expand_fetch_params(orig_cfg) + assert rv['foo'] == 'asdf' + assert mystrategy == ['asdf'] * 2 + assert len(value_cache) == 1 + + +def test_failed_strategy(monkeypatch, value_cache): + calls = [] + + def strategy(x): + calls.append(x) + raise KeyboardInterrupt() + + monkeypatch.setitem(STRATEGIES, 'mystrategy', strategy) + + orig_cfg = {'foo.fetch': ['mystrategy', 'asdf']} + + for _ in range(2): + with pytest.raises(KeyboardInterrupt): + expand_fetch_params(orig_cfg) + + assert len(value_cache) == 1 + assert len(calls) == 1 + + +def test_empty_value(monkeypatch, mystrategy): + with pytest.raises(exceptions.UserError) as excinfo: + expand_fetch_params({ + 'foo.fetch': ['mystrategy', ''] + }) + + assert 'Empty value for foo.fetch, this most likely indicates an error' \ + in str(excinfo.value)