VoiceLedger / tests /test_analytics.py
Sagar Patel
Add business insights dashboard
4ec46cc
Raw
History Blame Contribute Delete
2.24 kB
from pathlib import Path
from voiceledger.ledger.analytics import (
calculate_daily_expenses,
calculate_daily_sales,
calculate_net_profit,
low_stock_items,
outstanding_credit,
top_selling_items,
)
from voiceledger.ledger.database import add_transaction
from voiceledger.parser.rules import parse_transaction
def test_calculate_daily_sales_expenses_and_net_profit(tmp_path: Path) -> None:
db_path = tmp_path / "voiceledger.sqlite3"
add_transaction(parse_transaction("Bought 50 mangoes for 200"), db_path)
add_transaction(parse_transaction("Sold 12 mangoes, 20 each"), db_path)
add_transaction(parse_transaction("Paid 100 for supplies"), db_path)
assert calculate_daily_sales(db_path) == 240
assert calculate_daily_expenses(db_path) == 300
assert calculate_net_profit(db_path) == -60
def test_top_selling_items_orders_by_quantity(tmp_path: Path) -> None:
db_path = tmp_path / "voiceledger.sqlite3"
add_transaction(parse_transaction("Sold 12 mangoes, 20 each"), db_path)
add_transaction(parse_transaction("Sold 5 bananas, 10 each"), db_path)
add_transaction(parse_transaction("Sold 3 mangoes, 20 each"), db_path)
top_items = top_selling_items(db_path)
assert len(top_items) == 2
assert top_items.iloc[0]["item"] == "mangoes"
assert top_items.iloc[0]["quantity_sold"] == 15
assert top_items.iloc[0]["sales_amount"] == 300
def test_outstanding_credit_totals_customer_balances(tmp_path: Path) -> None:
db_path = tmp_path / "voiceledger.sqlite3"
add_transaction(parse_transaction("Amit owes 100"), db_path)
add_transaction(parse_transaction("Amit paid 25"), db_path)
assert outstanding_credit(db_path) == 75
def test_low_stock_items_returns_items_below_threshold(tmp_path: Path) -> None:
db_path = tmp_path / "voiceledger.sqlite3"
add_transaction(parse_transaction("Bought 10 mangoes"), db_path)
add_transaction(parse_transaction("Sold 6 mangoes"), db_path)
add_transaction(parse_transaction("Bought 20 bananas"), db_path)
low_stock = low_stock_items(db_path, threshold=5)
assert len(low_stock) == 1
assert low_stock.iloc[0]["item"] == "mangoes"
assert low_stock.iloc[0]["current_stock"] == 4