Files
@ 85b665200c60
Branch filter:
Location: NPO-Accounting/import2ledger/tests/test_hooks.py - annotation
85b665200c60
4.7 KiB
text/x-python
hooks: Hooks declare what order they run in.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe ab9c65d20dc5 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 85b665200c60 85b665200c60 85b665200c60 5c73c40bccfe fdcc214f9f83 fdcc214f9f83 fdcc214f9f83 fdcc214f9f83 fdcc214f9f83 fdcc214f9f83 fdcc214f9f83 fdcc214f9f83 fdcc214f9f83 fdcc214f9f83 fdcc214f9f83 fdcc214f9f83 fdcc214f9f83 fdcc214f9f83 fdcc214f9f83 fdcc214f9f83 e8bcbd5f99ec e8bcbd5f99ec e8bcbd5f99ec e8bcbd5f99ec e8bcbd5f99ec e8bcbd5f99ec e8bcbd5f99ec e8bcbd5f99ec e8bcbd5f99ec e8bcbd5f99ec 5c73c40bccfe fdcc214f9f83 fdcc214f9f83 5c73c40bccfe 5c73c40bccfe fdcc214f9f83 5c73c40bccfe 5c73c40bccfe ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 ab9c65d20dc5 18eebbc0ed28 ab9c65d20dc5 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe 5c73c40bccfe | import argparse
import datetime
import itertools
import pytest
from import2ledger import hooks
from import2ledger.hooks import add_entity, default_date, filter_by_date
def test_load_all():
all_hooks = list(hooks.load_all())
positions = {hook: index for index, hook in enumerate(all_hooks)}
assert positions[default_date.DefaultDateHook] < positions[add_entity.AddEntityHook]
assert positions[add_entity.AddEntityHook] < positions[filter_by_date.FilterByDateHook]
@pytest.mark.parametrize('in_key,payee,out_key,expected', [
('payee', 'Alex Smith', 'entity', 'Smith-Alex'),
('payee', 'Dakota D. Doe', 'entity', 'Doe-Dakota-D'),
('payee', 'Björk', 'entity', 'Bjork'),
('payee', 'Fran Doe-Smith', 'entity', 'Doe-Smith-Fran'),
('payee', 'Alex(Nickname) Smith', 'entity', 'Smith-Alex'),
('payee', '稲荷', 'entity', '稲荷'),
('payee', '稲(Jan)荷', 'entity', '稲荷'),
('payee', 'Pøweł', 'entity', 'Powel'),
('payee', 'Elyse Jan Smith', 'entity', 'Smith-Elyse-Jan'),
('payee', 'Jan van Smith', 'entity', 'van-Smith-Jan'),
('payee', 'Francis da Silva', 'entity', 'da-Silva-Francis'),
('payee', 'A van der B', 'entity', 'van-der-B-A'),
('payee', 'A de B de la C', 'entity', 'de-la-C-A-de-B'),
('corporation', 'Company A', 'corp_entity', 'Company-A'),
('corporation', 'Company A 99', 'corp_entity', 'Company-A-99'),
('corporation', 'DX Co.', 'corp_entity', 'DX'),
('corporation', 'DX Company', 'corp_entity', 'DX'),
('corporation', 'DX Company Inc.', 'corp_entity', 'DX'),
('corporation', 'DX Corp', 'corp_entity', 'DX'),
('corporation', 'DX Corp LLC', 'corp_entity', 'DX'),
('corporation', 'DX Corporation', 'corp_entity', 'DX'),
('corporation', 'DX, Inc.', 'corp_entity', 'DX'),
('corporation', 'DX Incorporated', 'corp_entity', 'DX'),
('payee', 'Poe Inc', 'entity', 'Inc-Poe'),
('corporation', 'Silly Van', 'corp_entity', 'Silly-Van'),
])
def test_add_entity(in_key, payee, out_key, expected):
data = {in_key: payee}
hook = add_entity.AddEntityHook(argparse.Namespace())
hook.run(data)
assert data[out_key] == expected
class DateRangeConfig:
def __init__(self, start_date=None, end_date=None):
self.start_date = start_date
self.end_date = end_date
def date_in_want_range(self, date):
return (
((self.start_date is None) or (date >= self.start_date))
and ((self.end_date is None) or (date <= self.end_date))
)
@pytest.mark.parametrize('entry_date,start_date,end_date,allowed', [
(datetime.date(2016, 5, 10), datetime.date(2016, 1, 1), datetime.date(2016, 12, 31), True),
(datetime.date(2016, 1, 1), datetime.date(2016, 1, 1), datetime.date(2016, 12, 31), True),
(datetime.date(2016, 12, 31), datetime.date(2016, 1, 1), datetime.date(2016, 12, 31), True),
(datetime.date(2016, 1, 1), datetime.date(2016, 1, 1), None, True),
(datetime.date(2016, 12, 31), None, datetime.date(2016, 12, 31), True),
(datetime.date(1999, 1, 2), None, None, True),
(datetime.date(2016, 1, 25), datetime.date(2016, 2, 1), datetime.date(2016, 12, 31), False),
(datetime.date(2016, 12, 26), datetime.date(2016, 1, 1), datetime.date(2016, 11, 30), False),
(datetime.date(2016, 1, 31), datetime.date(2016, 2, 1), None, False),
(datetime.date(2016, 12, 1), None, datetime.date(2016, 11, 30), False),
])
def test_filter_by_date(entry_date, start_date, end_date, allowed):
entry_data = {'date': entry_date}
hook = filter_by_date.FilterByDateHook(DateRangeConfig(start_date, end_date))
assert hook.run(entry_data) is (None if allowed else False)
class DefaultDateConfig:
ONE_DAY = datetime.timedelta(days=1)
def __init__(self, start_date=None):
if start_date is None:
start_date = datetime.date(2016, 3, 5)
self.date = start_date - self.ONE_DAY
def get_default_date(self, section_name=None):
self.date += self.ONE_DAY
return self.date
class TestDefaultDate:
def test_simple_case(self):
expect_date = datetime.date(2016, 2, 4)
config = DefaultDateConfig(expect_date)
data = {}
hook = default_date.DefaultDateHook(config)
hook.run(data)
assert data['date'] == expect_date
def test_no_caching(self):
config = DefaultDateConfig()
hook = default_date.DefaultDateHook(config)
d1 = {}
d2 = {}
hook.run(d1)
hook.run(d2)
assert d1['date'] != d2['date']
def test_no_override(self):
expect_date = datetime.date(2016, 2, 6)
config = DefaultDateConfig(expect_date + datetime.timedelta(days=300))
hook = default_date.DefaultDateHook(config)
data = {'date': expect_date}
hook.run(data)
assert data['date'] is expect_date
|