Example #1
0
def test_deprecated_filtered(example_ledger: FavaLedger) -> None:
    assert example_ledger.all_entries == example_ledger.entries
    assert example_ledger.all_root_account == example_ledger.root_account
    assert example_ledger.root_tree
    assert not example_ledger.filters.time
    assert not example_ledger.account_is_closed("test")
    assert example_ledger.end_date is None
    assert example_ledger.interval_ends(Interval.MONTH)
    assert example_ledger.documents == []
    assert example_ledger.events()
    assert example_ledger.events("test") == []
Example #2
0
def test_ingest_file_import_info():
    ingest_ledger = FavaLedger(FILE_PATH)
    importer = next(iter(ingest_ledger.ingest.importers.values()))
    assert importer

    info = file_import_info(EXAMPLE, importer)
    assert info.account == "Assets:Checking"
Example #3
0
def test_linechart_data(example_ledger: FavaLedger,
                        snapshot: SnapshotFunc) -> None:
    filtered = example_ledger.get_filtered()
    for conversion in ["at_cost", "units", "at_value", "USD"]:
        data = example_ledger.charts.linechart(
            filtered, "Assets:Testing:MultipleCommodities", conversion)
        snapshot(dumps(data))
Example #4
0
def test_interval_totals(small_example_ledger: FavaLedger,
                         snapshot: SnapshotFunc) -> None:
    filtered = small_example_ledger.get_filtered()
    for conversion in ["at_cost", "USD"]:
        data = small_example_ledger.charts.interval_totals(
            filtered, Interval.MONTH, "Expenses", conversion)
        snapshot(dumps(data))
Example #5
0
def test_render_entries(example_ledger: FavaLedger, snapshot) -> None:
    entry1 = example_ledger.get_entry("4af0865b1371c1b5576e9ff7f7d20dc9")
    entry2 = example_ledger.get_entry("85f3ba57bf52dc1bd6c77ef3510223ae")
    postings = [
        Posting("Expenses:Food", A("10.00 USD"), None, None, None, None),
    ]
    transaction = Transaction(
        {},
        date(2016, 1, 1),
        "*",
        "new payee",
        "narr",
        None,
        None,
        postings,
    )
    entries = example_ledger.file.render_entries([entry1, entry2, transaction])
    snapshot("\n".join(entries))

    file_content = dedent("""\
        2016-04-09 * "Uncle Boons" "" #trip-new-york-2016
          Liabilities:US:Chase:Slate                       -52.22 USD
          Expenses:Food:Restaurant                          52.22 USD

        2016-05-04 * "BANK FEES" "Monthly bank fee"
          Assets:US:BofA:Checking                           -4.00 USD
          Expenses:Financial:Fees                            4.00 USD
        """)

    assert file_content == "\n".join(
        example_ledger.file.render_entries([entry1, entry2]))
Example #6
0
def test_report_page_globals() -> None:
    """Extensions can register reports."""
    extension_report_ledger = FavaLedger(
        data_file("extension-report-example.beancount"))
    result = extension_report_ledger.extensions.reports
    assert result == [("PortfolioList", "Portfolio List")]

    extension_report_ledger.extensions.after_write_source("test", "test")
Example #7
0
def load_file():
    """Load Beancount files. """
    for filepath in app.config['BEANCOUNT_FILES']:
        ledger = FavaLedger(filepath)
        slug = slugify(ledger.options['title'])
        if not slug:
            slug = slugify(filepath)
        app.config['LEDGERS'][slug] = ledger
    app.config['FILE_SLUGS'] = list(app.config['LEDGERS'].keys())
Example #8
0
def _load_file() -> None:
    """Load Beancount files.

    This is run automatically on the first request.
    """
    ledgers = [
        FavaLedger(filepath) for filepath in app.config["BEANCOUNT_FILES"]
    ]
    update_ledger_slugs(ledgers)
Example #9
0
def test_paths_to_watch(example_ledger: FavaLedger) -> None:
    assert example_ledger.paths_to_watch() == (
        [example_ledger.beancount_file_path],
        [],
    )
    example_ledger.options["documents"] = ["folder"]
    base = Path(example_ledger.beancount_file_path).parent / "folder"
    assert example_ledger.paths_to_watch() == (
        [example_ledger.beancount_file_path],
        [
            str(base / account) for account in [
                "Assets",
                "Liabilities",
                "Equity",
                "Income",
                "Expenses",
            ]
        ],
    )
Example #10
0
def test_hierarchy(example_ledger: FavaLedger) -> None:
    filtered = example_ledger.get_filtered()
    data = example_ledger.charts.hierarchy(filtered, "Assets", "at_cost")
    assert data.balance_children == {
        "IRAUSD": D("7200.00"),
        "USD": D("94320.27840"),
        "VACHR": D("-82"),
    }
    assert data.balance == {}
    # Assets:US:ETrade
    etrade = data.children[0].children[2]
    assert etrade.children[4].balance == {"USD": D("4899.98")}
    assert etrade.balance_children == {"USD": D("23137.54")}
Example #11
0
def _load_file():
    """Load Beancount files.

    This is run automatically on the first request.
    """
    app.config["LEDGERS"] = {}
    for filepath in app.config["BEANCOUNT_FILES"]:
        ledger = FavaLedger(filepath)
        slug = slugify(ledger.options["title"])
        if not slug:
            slug = slugify(filepath)
        app.config["LEDGERS"][slug] = ledger
    app.config["FILE_SLUGS"] = list(app.config["LEDGERS"].keys())
Example #12
0
def _load_file():
    """Load Beancount files.

    This is run automatically on the first request.
    """
    app.config['LEDGERS'] = {}
    for filepath in app.config['BEANCOUNT_FILES']:
        ledger = FavaLedger(filepath)
        slug = slugify(ledger.options['title'])
        if not slug:
            slug = slugify(filepath)
        app.config['LEDGERS'][slug] = ledger
    # actually contains ledger instances, wtf is slug?
    app.config['FILE_SLUGS'] = list(app.config['LEDGERS'].keys())
Example #13
0
def test_paths_to_watch(example_ledger: FavaLedger,
                        monkeypatch: MonkeyPatch) -> None:
    assert example_ledger.paths_to_watch() == (
        [example_ledger.beancount_file_path],
        [],
    )
    monkeypatch.setitem(
        example_ledger.options,
        "documents",
        ["folder"]  # type: ignore
    )
    base = Path(example_ledger.beancount_file_path).parent / "folder"
    assert example_ledger.paths_to_watch() == (
        [example_ledger.beancount_file_path],
        [
            str(base / account) for account in [
                "Assets",
                "Liabilities",
                "Equity",
                "Income",
                "Expenses",
            ]
        ],
    )
Example #14
0
def test_group_entries(example_ledger: FavaLedger, load_doc) -> None:
    """
    2010-11-12 * "test"
        Assets:T   4.00 USD
        Expenses:T
    2010-11-12 * "test"
        Assets:T   4.00 USD
        Expenses:T
    2012-12-12 note Expenses:T "test"
    """

    entries, _, __ = load_doc
    assert len(entries) == 3
    data = example_ledger.group_entries_by_type(entries)
    assert data == [("Note", [entries[2]]), ("Transaction", entries[0:2])]
Example #15
0
def test_ingest_examplefile():
    ingest_ledger = FavaLedger(FILE_PATH)

    entries = ingest_ledger.ingest.extract(EXAMPLE, "<run_path>.TestImporter")
    assert len(entries) == 4
    assert entries[0].date == datetime.date(2017, 2, 12)
    assert entries[0].comment == "Hinweis: Zinssatz auf 0,15% geändert"
    assert entries[1].date == datetime.date(2017, 2, 13)
    assert (entries[1].narration ==
            "Payment to Company XYZ REF: 31000161205-6944556-0000463")
    assert entries[1].postings[0].account == ""
    assert entries[1].postings[0].units.number == 50.00
    assert entries[1].postings[0].units.currency == "EUR"
    assert entries[1].postings[1].account == "Assets:Checking"
    assert entries[1].postings[1].units.number == -50.00
    assert entries[1].postings[1].units.currency == "EUR"
    assert "__duplicate__" not in entries[1].meta
    assert "__duplicate__" in entries[2].meta
Example #16
0
def test_ingest_examplefile():
    ingest_ledger = FavaLedger(FILE_PATH)
    identify_dir = list(ingest_ledger.ingest.identify_directory("."))
    assert len(identify_dir) == 1

    filename, importers = identify_dir[0]
    importer_name = importers[0].name()
    entries = ingest_ledger.ingest.extract(filename, importer_name)
    assert len(entries) == 4
    assert entries[0].date == datetime.date(2017, 2, 12)
    assert entries[0].comment == "Hinweis: Zinssatz auf 0,15% geändert"
    assert entries[1].date == datetime.date(2017, 2, 13)
    assert (entries[1].narration ==
            "Payment to Company XYZ REF: 31000161205-6944556-0000463")
    assert entries[1].postings[0].account == ""
    assert entries[1].postings[0].units.number == 50.00
    assert entries[1].postings[0].units.currency == "EUR"
    assert entries[1].postings[1].account == "Assets:Checking"
    assert entries[1].postings[1].units.number == -50.00
    assert entries[1].postings[1].units.currency == "EUR"
Example #17
0
def is_document_or_import_file(filename: str, ledger: FavaLedger) -> bool:
    """Check whether the filename is a document or in an import directory.

    Args:
        filename: The filename to check.
        ledger: The FavaLedger.

    Returns:
        Whether this is one of the documents or a path in an import dir.
    """
    filenames = [
        document.filename for document in ledger.all_entries_by_type.Document
    ]
    import_directories = [
        ledger.join_path(d) for d in ledger.fava_options.import_dirs
    ]
    if filename in filenames:
        return True
    file_path = path.abspath(filename)
    if any(file_path.startswith(d) for d in import_directories):
        return True
    return False
Example #18
0
def test_prices(example_ledger: FavaLedger, snapshot: SnapshotFunc) -> None:
    data = example_ledger.charts.prices(example_ledger.get_filtered())
    assert all(price[1] for price in data)
    snapshot(data)
Example #19
0
def test_net_worth(example_ledger: FavaLedger, snapshot: SnapshotFunc) -> None:
    filtered = example_ledger.get_filtered()
    data = example_ledger.charts.net_worth(filtered, Interval.MONTH, "USD")
    snapshot(dumps(data))
Example #20
0
def create_app(bfile):
    key = "BEANCOUNT_FILES"
    if (key not in fava_app.config) or (fava_app.config[key] != [bfile]):
        fava_app.config[key] = [bfile]
        _load_file()


def data_file(filename):
    return os.path.join(os.path.dirname(__file__), "data", filename)


EXAMPLE_FILE = data_file("long-example.beancount")
EXTENSION_REPORT_EXAMPLE_FILE = data_file("extension-report-example.beancount")

API = FavaLedger(EXAMPLE_FILE)

fava_app.testing = True
TEST_CLIENT = fava_app.test_client()
create_app(EXAMPLE_FILE)


SNAPSHOT_UPDATE = bool(os.environ.get("SNAPSHOT_UPDATE"))
MSG = "Maybe snapshots need to be updated with `SNAPSHOT_UPDATE=1 make test`?"


@pytest.fixture
def snapshot(request):
    file_path = Path(request.fspath)
    fn_name = request.function.__name__
    snap_dir = file_path.parent / "__snapshots__"
Example #21
0
def small_example_ledger() -> FavaLedger:
    return FavaLedger(data_file("example.beancount"))
Example #22
0
from fava.core.budgets import parse_budgets

if TYPE_CHECKING:
    from fava.util.typing import LoaderResult

TESTS_DIR = Path(__file__).parent


def data_file(filename: str) -> str:
    return str(TESTS_DIR / "data" / filename)


LONG_EXAMPLE_FILE = data_file("long-example.beancount")
EXAMPLE_FILE = data_file("example.beancount")

EXAMPLE_LEDGER = FavaLedger(LONG_EXAMPLE_FILE)

fava_app.testing = True
TEST_CLIENT = fava_app.test_client()

fava_app.config["BEANCOUNT_FILES"] = [
    LONG_EXAMPLE_FILE,
    EXAMPLE_FILE,
    data_file("extension-report-example.beancount"),
    data_file("import.beancount"),
    data_file("query-example.beancount"),
]
_load_file()

SNAPSHOT_UPDATE = bool(os.environ.get("SNAPSHOT_UPDATE"))
MSG = "Maybe snapshots need to be updated with `SNAPSHOT_UPDATE=1 make test`?"
Example #23
0
def ingest_ledger():
    ledger = FavaLedger(FILE_PATH)
    return ledger
Example #24
0
# pylint: disable=missing-docstring
from __future__ import annotations

from typing import Any

import pytest
from beancount.query.query import run_query

from .conftest import data_file
from .conftest import SnapshotFunc
from fava.core import FavaLedger
from fava.helpers import FavaAPIException

LEDGER = FavaLedger(data_file("query-example.beancount"))
QUERY = LEDGER.query_shell


def run(query_string: str) -> Any:
    return QUERY.execute_query(query_string)


def run_text(query_string: str) -> str:
    """Run a query that should only return string contents."""
    contents, types, result = run(query_string)
    assert types is None
    assert result is None
    assert isinstance(contents, str)
    return contents


def test_query() -> None:
Example #25
0
def extension_report_ledger():
    return FavaLedger(EXTENSION_REPORT_EXAMPLE_FILE)
Example #26
0
from beancount.loader import load_string

from fava.application import _load_file
from fava.application import app as fava_app
from fava.core import FavaLedger
from fava.core.budgets import parse_budgets


def data_file(filename: str) -> str:
    return str(Path(__file__).parent / "data" / filename)


EXAMPLE_FILE = data_file("long-example.beancount")
EXTENSION_REPORT_EXAMPLE_FILE = data_file("extension-report-example.beancount")

EXAMPLE_LEDGER = FavaLedger(EXAMPLE_FILE)
EXAMPLE_LEDGER_OPTIONS = deepcopy(EXAMPLE_LEDGER.options)
EXAMPLE_LEDGER_FAVA_OPTIONS = deepcopy(EXAMPLE_LEDGER.fava_options)

fava_app.testing = True
TEST_CLIENT = fava_app.test_client()

fava_app.config["BEANCOUNT_FILES"] = [
    EXAMPLE_FILE,
    EXTENSION_REPORT_EXAMPLE_FILE,
]
_load_file()

SNAPSHOT_UPDATE = bool(os.environ.get("SNAPSHOT_UPDATE"))
MSG = "Maybe snapshots need to be updated with `SNAPSHOT_UPDATE=1 make test`?"
Example #27
0
def small_example_ledger():
    return FavaLedger(data_file('example.beancount'))