Files @ ea0e3d3a73b7
Branch filter:

Location: NPO-Accounting/import2ledger/tests/test_config.py

Brett Smith
dynload: Pre-configure objects and skip unconfigured ones.

Now that all importers and hooks receive the configuration object, they can
tell us at initialization time whether or not they actually have enough
configuration to be useful. Initialize them immediately on loading, and
only use importers and hooks that are actually configured.
import contextlib
import datetime
import itertools
import logging
import os
import pathlib

START_DATE = datetime.date.today()

from unittest import mock

import pytest
from import2ledger import config, errors

from . import DATA_DIR

def config_from_file(path, arglist=[], stdout=None, stderr=None):
    path = pathlib.Path(path)
    if not path.is_absolute():
        path = DATA_DIR / path
    arglist = ['-C', path.as_posix(), *arglist, os.devnull]
    return config.Configuration(arglist, stdout, stderr)

def test_get_section():
    config = config_from_file('test_config.ini', ['--date-format', '%m/%d/%Y'])
    section = config.get_section('Templates')
    assert section['output_path'] == 'Template.output'
    assert section['date_format'] == '%m/%d/%Y'
    assert section['signed_currencies'] == 'EUR'

def test_get_section_falls_back_to_default():
    config = config_from_file('test_config.ini', ['--date-format', '%m/%d/%Y'])
    section = config.get_section('Nonexistent Templates Section')
    assert 'one' not in section
    assert 'default date' not in section
    assert section['date_format'] == '%m/%d/%Y'
    assert section['signed_currencies'] == 'EUR'

@pytest.mark.parametrize('arg_s', [None, '-', 'output.ledger'])
def test_output_path(arg_s):
    arglist = [] if arg_s is None else ['-O', arg_s]
    config = config_from_file(os.devnull, arglist)
    output_path = config.get_output_path()
    if (arg_s is None) or (arg_s == '-'):
        assert output_path is None
    else:
        assert output_path == pathlib.Path(arg_s)

@pytest.mark.parametrize('range_s,date_fmt', [
    (range_s.replace('/', sep), sep.join(['%Y', '%m', '%d']))
    for range_s, sep in itertools.product([
            '-',
            '2016/06/01-2016/06/30',
            '2016/06/01-',
            '-2016/06/30',
            ], '/-')
])
def test_date_in_want_range(range_s, date_fmt):
    config = config_from_file(os.devnull, ['--date-range=' + range_s, '--date-format', date_fmt])
    assert config.date_in_want_range(datetime.date(2016, 5, 31)) == range_s.startswith('-')
    assert config.date_in_want_range(datetime.date(2016, 6, 1))
    assert config.date_in_want_range(datetime.date(2016, 6, 30))
    assert config.date_in_want_range(datetime.date(2016, 7, 1)) == range_s.endswith('-')

@pytest.mark.parametrize('arglist,expect_date', [
    ([], None),
    (['-d', '2017-10-12'], datetime.date(2017, 10, 12)),
    (['-c', 'Date'], datetime.date(2017, 10, 8)),
])
def test_default_date(arglist, expect_date):
    config = config_from_file('test_config.ini', arglist)
    default_date = config.get_default_date()
    if expect_date is None:
        assert START_DATE <= default_date <= datetime.date.today()
    else:
        assert default_date == expect_date
    assert config.get_default_date('Date') == datetime.date(2017, 10, 8)

@pytest.mark.parametrize('level_s,expect_level', [
    (s, getattr(logging, s.upper()))
    for s in ['critical', 'debug', 'error', 'info', 'warning']
])
def test_loglevel(level_s, expect_level):
    config = config_from_file(os.devnull, ['--loglevel', level_s])
    assert config.get_loglevel() == expect_level

@contextlib.contextmanager
def bad_config(expect_input):
    with pytest.raises(errors.UserInputConfigurationError) as exc_info:
        yield exc_info
    assert exc_info.value.user_input == expect_input

def test_bad_default_date():
    date_s = '2017-10-06'
    with bad_config(date_s):
        config = config_from_file(os.devnull, ['--date', date_s])
        config.get_default_date()

def test_bad_loglevel():
    with bad_config('wraning'):
        config = config_from_file('test_config.ini', ['-c', 'Bad Loglevel'])
        config.get_loglevel()