Files @ b7aae7b3c02b
Branch filter:

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

Brett Smith
reports.accrual: Exclude payments from default output. RT#11294.

This makes the output more useful for broad searches like on an
entity. Invoices that cross FY boundaries will appear to be paid
without being accrued, and so would appear when we were just
filtering zeroed-out invoices.

If we integrate the aging report into this module in the future,
that'll need to follow different logic, and just filter out
zeroed-out invoices. But the basic balance report and outgoing
report are more workaday tools, where more filtering makes them
more useful.
"""test_books_loader - Unit tests for books Loader class"""
# 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 hashlib
import re

from datetime import date
from pathlib import Path

import pytest

from . import testutil

from conservancy_beancount import books

books_path = testutil.test_path('books')

@pytest.fixture(scope='module')
def conservancy_loader():
    return books.Loader(books_path, books.FiscalYear(3))

@pytest.mark.parametrize('from_fy,to_fy,expect_years', [
    (2019, 2019, range(2019, 2020)),
    (0, 2019, range(2019, 2020)),
    (2018, 2019, range(2018, 2020)),
    (1, 2018, range(2018, 2020)),
    (-1, 2019, range(2018, 2020)),
    (2019, 2020, range(2019, 2021)),
    (1, 2019, range(2019, 2021)),
    (-1, 2020, range(2019, 2021)),
    (2010, 2030, range(2018, 2021)),
    (20, 2010, range(2018, 2021)),
    (-20, 2030, range(2018, 2021)),
])
def test_load_fy_range(conservancy_loader, from_fy, to_fy, expect_years):
    entries, errors, options_map = conservancy_loader.load_fy_range(from_fy, to_fy)
    assert not errors
    narrations = {getattr(entry, 'narration', None) for entry in entries}
    assert ('2018 donation' in narrations) == (2018 in expect_years)
    assert ('2019 donation' in narrations) == (2019 in expect_years)
    assert ('2020 donation' in narrations) == (2020 in expect_years)

def test_load_fy_range_does_not_duplicate_openings(conservancy_loader):
    entries, errors, options_map = conservancy_loader.load_fy_range(2010, 2030)
    openings = []
    open_accounts = set()
    for entry in entries:
        try:
            open_accounts.add(entry.account)
        except AttributeError:
            pass
        else:
            openings.append(entry)
    assert len(openings) == len(open_accounts)

def test_load_fy_range_empty(conservancy_loader):
    entries, errors, options_map = conservancy_loader.load_fy_range(2020, 2019)
    assert not errors
    assert not entries
    assert not options_map