117 lines
4.4 KiB
Python
117 lines
4.4 KiB
Python
from src.models.category import Category
|
|
from src.models.category_tree import (
|
|
CategoryTree,
|
|
_transaction_to_category_branch,
|
|
build_category_tree,
|
|
)
|
|
from src.models.transactions import Transaction
|
|
from tests.factories import TransactionFactory
|
|
|
|
|
|
def test_transaction_to_category_branch_simple():
|
|
transaction = TransactionFactory.build(category=Category.from_str("dummy category"))
|
|
result = _transaction_to_category_branch(transaction)
|
|
assert isinstance(result, CategoryTree)
|
|
assert result.category
|
|
assert result.category.name == "dummy category"
|
|
assert result.transactions
|
|
assert isinstance(result.transactions, list)
|
|
assert len(result.transactions) == 1
|
|
assert isinstance(result.transactions[0], Transaction)
|
|
|
|
|
|
def test_transaction_to_category_branch_two_category_levels():
|
|
transaction = TransactionFactory.build(category=Category.from_str("father:son"))
|
|
result = _transaction_to_category_branch(transaction)
|
|
assert isinstance(result, CategoryTree)
|
|
assert result.category
|
|
assert result.category.name == "father"
|
|
assert result.transactions is None
|
|
assert result.sub_categories
|
|
assert isinstance(result.sub_categories, list)
|
|
assert len(result.sub_categories) == 1
|
|
assert isinstance(result.sub_categories[0], CategoryTree)
|
|
assert isinstance(result.sub_categories[0].category, Category)
|
|
assert result.sub_categories[0].category.name == "son"
|
|
assert result.sub_categories[0].transactions
|
|
assert isinstance(result.sub_categories[0].transactions, list)
|
|
assert len(result.sub_categories[0].transactions) == 1
|
|
assert isinstance(result.sub_categories[0].transactions[0], Transaction)
|
|
assert result.sub_categories[0].transactions[0] == transaction
|
|
|
|
|
|
def test_transaction_to_category_branch_no_category():
|
|
transaction = TransactionFactory.build(category=None)
|
|
result = _transaction_to_category_branch(transaction)
|
|
assert result.category is None
|
|
assert result.transactions
|
|
assert isinstance(result.transactions, list)
|
|
assert len(result.transactions) == 1
|
|
assert result.transactions[0] == transaction
|
|
|
|
|
|
def test_category_tree_add():
|
|
category_tree_1 = CategoryTree(
|
|
category=Category.from_str("super"),
|
|
sub_categories=[
|
|
CategoryTree(
|
|
category=Category.from_str("super:sub1"),
|
|
transactions=[TransactionFactory.build(amount=10)],
|
|
),
|
|
CategoryTree(
|
|
category=Category.from_str("super:sub2"),
|
|
transactions=[TransactionFactory.build(amount=30)],
|
|
),
|
|
],
|
|
)
|
|
category_tree_2 = CategoryTree(
|
|
category=Category.from_str("super"),
|
|
sub_categories=[
|
|
CategoryTree(
|
|
category=Category.from_str("super:sub2"),
|
|
transactions=[TransactionFactory.build(amount=20)],
|
|
),
|
|
CategoryTree(
|
|
category=Category.from_str("super:sub3"),
|
|
transactions=[TransactionFactory.build(amount=100)],
|
|
),
|
|
],
|
|
)
|
|
result = category_tree_1 + category_tree_2
|
|
assert result
|
|
assert result.sub_categories
|
|
assert isinstance(result.sub_categories, list)
|
|
assert len(result.sub_categories) == 3
|
|
assert all(s.category for s in result.sub_categories)
|
|
assert sorted([s.category.name for s in result.sub_categories]) == [
|
|
"sub1",
|
|
"sub2",
|
|
"sub3",
|
|
]
|
|
assert result.total_amount == 160.0
|
|
|
|
|
|
def test_build_category_tree():
|
|
transactions = [
|
|
TransactionFactory.build(category=Category.from_str("super1:sub1"), amount=10),
|
|
TransactionFactory.build(category=Category.from_str("super1:sub2"), amount=13),
|
|
TransactionFactory.build(
|
|
category=Category.from_str("super1:sub2:sub2_sub1"), amount=104
|
|
),
|
|
TransactionFactory.build(
|
|
category=Category.from_str("super1:sub2:sub2_sub1"), amount=109
|
|
),
|
|
TransactionFactory.build(category=Category.from_str("super2"), amount=5000),
|
|
]
|
|
result = build_category_tree(transactions)
|
|
assert result
|
|
assert isinstance(result, list)
|
|
assert len(result) == 2
|
|
assert isinstance(result[0], CategoryTree)
|
|
assert result[0].category
|
|
assert result[0].category.name == "super1"
|
|
assert result[0].transactions is None
|
|
assert result[0].sub_categories
|
|
assert isinstance(result[0].sub_categories, list)
|
|
assert len(result[0].sub_categories) == 2
|