Files @ c9ff4ab74617
Branch filter:

Location: NPO-Accounting/conservancy_beancount/tests/test_plugin_run.py

Brett Smith
plugin: Settle on words-with-dashes metadata keys.
"""Test main plugin run loop"""
# Copyright © 2020  Brett Smith
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

import pytest

from . import testutil

from conservancy_beancount import plugin

CONFIG_MAP = {}
HOOK_REGISTRY = plugin.HookRegistry()

@HOOK_REGISTRY.add_hook
class TransactionCounter:
    HOOK_GROUPS = frozenset(['Transaction', 'counter'])

    def run(self, txn):
        return ['txn:{}'.format(id(txn))]


@HOOK_REGISTRY.add_hook
class PostingCounter(TransactionCounter):
    HOOK_GROUPS = frozenset(['Posting', 'counter'])

    def run(self, txn, post, post_index):
        return ['post:{}'.format(id(post))]


def map_errors(errors):
    retval = {}
    for errkey in errors:
        key, _, errid = errkey.partition(':')
        retval.setdefault(key, set()).add(errid)
    return retval

def test_with_multiple_hooks():
    in_entries = [
        testutil.Transaction(postings=[
            ('Income:Donations', -25),
            ('Assets:Cash', 25),
        ]),
        testutil.Transaction(postings=[
            ('Expenses:General', 10),
            ('Liabilites:CreditCard', -10),
        ]),
    ]
    out_entries, errors = plugin.run(in_entries, CONFIG_MAP, '', HOOK_REGISTRY)
    assert len(out_entries) == 2
    errmap = map_errors(errors)
    assert len(errmap.get('txn', '')) == 2
    assert len(errmap.get('post', '')) == 4

def test_with_posting_hooks_only():
    in_entries = [
        testutil.Transaction(postings=[
            ('Income:Donations', -25),
            ('Assets:Cash', 25),
        ]),
        testutil.Transaction(postings=[
            ('Expenses:General', 10),
            ('Liabilites:CreditCard', -10),
        ]),
    ]
    out_entries, errors = plugin.run(in_entries, CONFIG_MAP, 'Posting', HOOK_REGISTRY)
    assert len(out_entries) == 2
    errmap = map_errors(errors)
    assert len(errmap.get('txn', '')) == 0
    assert len(errmap.get('post', '')) == 4