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