111 lines
5.1 KiB
Python
111 lines
5.1 KiB
Python
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
|