first commit

This commit is contained in:
Mateusz Gruszczyński
2026-03-13 15:17:32 +01:00
commit 986ffb200a
91 changed files with 4423 additions and 0 deletions

110
tests/test_expenses.py Normal file
View File

@@ -0,0 +1,110 @@
from datetime import date
from app.extensions import db
from app.models import Budget, Category, Expense, User
def test_create_manual_expense(logged_user, app):
with app.app_context():
category = Category.query.first()
category_id = category.id
response = logged_user.post('/expenses/create', data={
'title': 'Milk',
'vendor': 'Store',
'description': '2L milk',
'amount': '12.50',
'currency': 'PLN',
'purchase_date': '2026-03-10',
'payment_method': 'card',
'category_id': str(category_id),
'recurring_period': 'none',
'status': 'confirmed',
}, follow_redirects=True)
assert response.status_code == 200
with app.app_context():
expense = Expense.query.filter_by(title='Milk').first()
assert expense is not None
assert expense.vendor == 'Store'
def test_expense_list_and_exports(logged_user, app):
with app.app_context():
user = User.query.filter_by(email='user@test.com').first()
expense = Expense(user_id=user.id, title='Bread', amount=4.99, currency='PLN', purchase_date=date(2026, 3, 1), payment_method='cash')
db.session.add(expense)
db.session.commit()
response = logged_user.get('/expenses/?year=2026&month=3')
assert b'Bread' in response.data
csv_response = logged_user.get('/expenses/export.csv')
assert csv_response.status_code == 200
assert b'Bread' in csv_response.data
pdf_response = logged_user.get('/expenses/export.pdf')
assert pdf_response.status_code == 200
assert pdf_response.mimetype == 'application/pdf'
def test_edit_delete_and_budget(logged_user, app):
with app.app_context():
user = User.query.filter_by(email='user@test.com').first()
category = Category.query.first()
category_id = category.id
expense = Expense(user_id=user.id, title='Taxi', amount=20, currency='PLN', purchase_date=date(2026, 3, 4), payment_method='cash', category_id=category_id)
db.session.add(expense)
db.session.commit()
expense_id = expense.id
response = logged_user.post(f'/expenses/{expense_id}/edit', data={
'title': 'Taxi Updated',
'vendor': 'Bolt',
'description': 'Airport ride',
'amount': '25.00',
'currency': 'PLN',
'purchase_date': '2026-03-04',
'payment_method': 'card',
'category_id': str(category_id),
'recurring_period': 'monthly',
'status': 'confirmed',
}, follow_redirects=True)
assert response.status_code == 200
with app.app_context():
updated = db.session.get(Expense, expense_id)
assert updated.title == 'Taxi Updated'
assert updated.vendor == 'Bolt'
response = logged_user.post('/expenses/budgets', data={'category_id': str(category_id), 'year': '2026', 'month': '3', 'amount': '300', 'alert_percent': '80'}, follow_redirects=True)
assert response.status_code == 200
with app.app_context():
assert Budget.query.filter_by(year=2026, month=3).first() is not None
response = logged_user.post(f'/expenses/{expense_id}/delete', follow_redirects=True)
assert response.status_code == 200
with app.app_context():
assert db.session.get(Expense, expense_id).is_deleted is True
def test_expense_list_filters_sort_and_grouping(logged_user, app):
with app.app_context():
user = User.query.filter_by(email='user@test.com').first()
category = Category.query.first()
other = Category.query.filter(Category.id != category.id).first()
db.session.add_all([
Expense(user_id=user.id, title='Alpha', vendor='Shop A', amount=10, currency='PLN', purchase_date=date(2026, 3, 5), payment_method='card', category_id=category.id, status='confirmed'),
Expense(user_id=user.id, title='Zulu', vendor='Shop B', amount=99, currency='PLN', purchase_date=date(2026, 3, 6), payment_method='cash', category_id=other.id if other else category.id, status='new'),
])
db.session.commit()
response = logged_user.get('/expenses/?year=2026&month=3&q=Zulu&sort_by=amount&sort_dir=desc&group_by=category')
assert response.status_code == 200
assert b'Zulu' in response.data
assert b'Alpha' not in response.data
assert b'Filtered total' in response.data or 'Suma po filtrach'.encode() in response.data
def test_expense_export_respects_status_filter(logged_user, app):
with app.app_context():
user = User.query.filter_by(email='user@test.com').first()
db.session.add_all([
Expense(user_id=user.id, title='Confirmed expense', amount=11, currency='PLN', purchase_date=date(2026, 3, 7), payment_method='card', status='confirmed'),
Expense(user_id=user.id, title='Needs review expense', amount=22, currency='PLN', purchase_date=date(2026, 3, 8), payment_method='card', status='needs_review'),
])
db.session.commit()
csv_response = logged_user.get('/expenses/export.csv?year=2026&month=3&status=confirmed')
assert csv_response.status_code == 200
assert b'Confirmed expense' in csv_response.data
assert b'Needs review expense' not in csv_response.data