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") == []
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"
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))
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))
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]))
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")
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())
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)
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", ] ], )
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")}
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())
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())
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", ] ], )
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])]
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
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"
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
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)
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))
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__"
def small_example_ledger() -> FavaLedger: return FavaLedger(data_file("example.beancount"))
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`?"
def ingest_ledger(): ledger = FavaLedger(FILE_PATH) return ledger
# 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:
def extension_report_ledger(): return FavaLedger(EXTENSION_REPORT_EXAMPLE_FILE)
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`?"
def small_example_ledger(): return FavaLedger(data_file('example.beancount'))