diff --git a/tests/test_books_loader.py b/tests/test_books_loader.py new file mode 100644 index 0000000000000000000000000000000000000000..fb92e4ac1f68528d0d1eb95ec75453a952a88612 --- /dev/null +++ b/tests/test_books_loader.py @@ -0,0 +1,76 @@ +"""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 . + +from datetime import date +from pathlib import Path + +import pytest + +from . import testutil + +from conservancy_beancount import books + +books_path = testutil.test_path('booksroot') + +@pytest.fixture(scope='module') +def conservancy_loader(): + return books.Loader(books_path, books.FiscalYear(3)) + +def format_include(year, subdir=''): + path = Path(books_path, subdir, f'{year}.beancount') + return f'include "{path}"' + +def format_plugin(name, optstring=None): + if optstring is None: + return f'plugin "{name}"' + else: + return f'plugin "{name}" "{optstring}"' + +def expect_string(years, plugins={'conservancy_beancount.plugin': None}): + years = iter(years) + year1_s = format_include(next(years), 'books') + return '\n'.join([ + *(format_plugin(name, opts) for name, opts in plugins.items()), + year1_s, + *(format_include(year) for year in years), + ]) + +@pytest.mark.parametrize('range_start,range_stop,expect_years', [ + (2019, 2020, [2019, 2020]), + (-1, 2020, [2019, 2020]), + (date(2019, 1, 1), date(2020, 6, 1), range(2018, 2021)), + (-1, date(2020, 2, 1), [2018, 2019]), +]) +def test_fy_range_string(conservancy_loader, range_start, range_stop, expect_years): + expected = expect_string(expect_years) + assert conservancy_loader.fy_range_string(range_start, range_stop) == expected + +@pytest.mark.parametrize('year_offset', range(-3, 1)) +def test_fy_range_string_one_offset(conservancy_loader, year_offset): + this_year = date.today().year + expected = expect_string(range(this_year + year_offset, this_year + 1)) + assert conservancy_loader.fy_range_string(year_offset) == expected + +@pytest.mark.parametrize('plugins', [ + {}, + {'conservancy_beancount.plugin': '-all'}, +]) +def test_fy_range_string_plugins_override(conservancy_loader, plugins): + expected = expect_string([2019, 2020], plugins) + assert conservancy_loader.fy_range_string(2019, 2020, plugins) == expected + +def test_fy_range_string_empty_range(conservancy_loader): + assert conservancy_loader.fy_range_string(2020, 2019) == ''