1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
"""Fava's budget syntax."""
from __future__ import annotations
from datetime import date
from decimal import Decimal
from typing import TYPE_CHECKING
from fava.core.budgets import calculate_budget
from fava.core.budgets import calculate_budget_children
from fava.core.budgets import parse_budgets
if TYPE_CHECKING: # pragma: no cover
from fava.beans.abc import Custom
from fava.core.budgets import BudgetDict
def test_budgets(load_doc_custom_entries: list[Custom]) -> None:
"""
2016-01-01 custom "budget" Expenses:Groceries "weekly" 100.00 CNY
2016-06-01 custom "budget" Expenses:Groceries "weekly" 10.00 EUR
2016-06-01 custom "budget" Expenses:Groceries "asdfasdf" 10.00 EUR
2016-01-01 custom "budget" Expenses:Groceries "weekly"
2016-06-01 custom "budget" Expenses:Groceries 10.00 EUR
"""
budgets, errors = parse_budgets(load_doc_custom_entries)
assert len(errors) == 3
empty = calculate_budget(
budgets,
"Expenses",
date(2016, 6, 1),
date(2016, 6, 8),
)
assert not empty
budgets_ = calculate_budget(
budgets,
"Expenses:Groceries",
date(2016, 6, 1),
date(2016, 6, 8),
)
assert budgets_["CNY"] == Decimal(100)
assert budgets_["EUR"] == Decimal(10)
def test_budgets_daily(budgets_doc: BudgetDict) -> None:
"""
2016-05-01 custom "budget" Expenses:Books "daily" 2.5 EUR"""
assert "EUR" not in calculate_budget(
budgets_doc,
"Expenses:Books",
date(2010, 2, 1),
date(2010, 2, 2),
)
for start, end, num in [
(date(2016, 5, 1), date(2016, 5, 2), Decimal("2.5")),
(date(2016, 5, 1), date(2016, 5, 3), Decimal("5.0")),
(date(2016, 9, 2), date(2016, 9, 3), Decimal("2.5")),
(date(2018, 12, 31), date(2019, 1, 1), Decimal("2.5")),
]:
budget = calculate_budget(budgets_doc, "Expenses:Books", start, end)
assert budget["EUR"] == num
def test_budgets_weekly(budgets_doc: BudgetDict) -> None:
"""
2016-05-01 custom "budget" Expenses:Books "weekly" 21 EUR"""
for start, end, num in [
(date(2016, 5, 1), date(2016, 5, 2), Decimal(21) / 7),
(date(2016, 9, 1), date(2016, 9, 2), Decimal(21) / 7),
]:
budget = calculate_budget(budgets_doc, "Expenses:Books", start, end)
assert budget["EUR"] == num
def test_budgets_monthly(budgets_doc: BudgetDict) -> None:
"""
2014-05-01 custom "budget" Expenses:Books "monthly" 100 EUR"""
for start, end, num in [
(date(2016, 5, 1), date(2016, 5, 2), Decimal(100) / 31),
(date(2016, 2, 1), date(2016, 2, 2), Decimal(100) / 29),
(date(2018, 3, 31), date(2018, 4, 1), Decimal(100) / 31),
]:
budget = calculate_budget(budgets_doc, "Expenses:Books", start, end)
assert budget["EUR"] == num
def test_budgets_doc_quarterly(budgets_doc: BudgetDict) -> None:
"""
2014-05-01 custom "budget" Expenses:Books "quarterly" 123456.7 EUR"""
for start, end, num in [
(date(2016, 5, 1), date(2016, 5, 2), Decimal("123456.7") / 91),
(date(2016, 8, 15), date(2016, 8, 16), Decimal("123456.7") / 92),
]:
budget = calculate_budget(budgets_doc, "Expenses:Books", start, end)
assert budget["EUR"] == num
def test_budgets_doc_yearly(budgets_doc: BudgetDict) -> None:
"""
2010-01-01 custom "budget" Expenses:Books "yearly" 99999.87 EUR"""
budget = calculate_budget(
budgets_doc,
"Expenses:Books",
date(2011, 2, 1),
date(2011, 2, 2),
)
assert budget["EUR"] == Decimal("99999.87") / 365
def test_budgets_children(budgets_doc: BudgetDict) -> None:
"""
2017-01-01 custom "budget" Expenses:Books "daily" 10.00 USD
2017-01-01 custom "budget" Expenses:Books:Notebooks "daily" 2.00 USD"""
budget = calculate_budget_children(
budgets_doc,
"Expenses",
date(2017, 1, 1),
date(2017, 1, 2),
)
assert budget["USD"] == Decimal("12.00")
budget = calculate_budget_children(
budgets_doc,
"Expenses:Books",
date(2017, 1, 1),
date(2017, 1, 2),
)
assert budget["USD"] == Decimal("12.00")
budget = calculate_budget_children(
budgets_doc,
"Expenses:Books:Notebooks",
date(2017, 1, 1),
date(2017, 1, 2),
)
assert budget["USD"] == Decimal("2.00")
|