from datetime import date from io import BytesIO from PIL import Image from app.extensions import db from app.models import AppSetting, Category, DocumentAttachment, Expense, User from tests.conftest import login def _png_bytes(color='red'): image = Image.new('RGB', (32, 32), color=color) buffer = BytesIO() image.save(buffer, format='PNG') buffer.seek(0) return buffer def test_manifest_and_service_worker(client): manifest = client.get('/manifest.json') assert manifest.status_code == 200 assert manifest.get_json()['display'] == 'standalone' sw = client.get('/service-worker.js') assert sw.status_code == 200 assert b'skipWaiting' in sw.data def test_webhook_creates_expense(client, app): with app.app_context(): AppSetting.set('webhook_api_token', 'secret123') db.session.commit() category = Category.query.first() response = client.post( '/api/webhooks/expenses', json={ 'user_email': 'user@test.com', 'title': 'Webhook Lunch', 'amount': '25.50', 'currency': 'PLN', 'purchase_date': '2026-03-10', 'category_key': category.key, }, headers={'X-Webhook-Token': 'secret123'}, ) assert response.status_code == 200 with app.app_context(): expense = Expense.query.filter_by(title='Webhook Lunch').first() assert expense is not None assert float(expense.amount) == 25.5 def test_multiple_attachments_saved(logged_user, app): with app.app_context(): category = Category.query.first() data = { 'title': 'Multi doc expense', 'amount': '12.34', 'purchase_date': '2026-03-12', 'category_id': str(category.id), 'payment_method': 'card', 'vendor': 'Vendor', 'description': 'Desc', 'currency': 'PLN', 'tags': 'tag1', 'recurring_period': 'none', 'status': 'confirmed', 'rotate': '0', 'scale_percent': '100', 'document': [(_png_bytes('red'), 'one.png'), (_png_bytes('blue'), 'two.png')], } response = logged_user.post('/expenses/create', data=data, content_type='multipart/form-data', follow_redirects=True) assert response.status_code == 200 with app.app_context(): expense = Expense.query.filter_by(vendor='Vendor').order_by(Expense.id.desc()).first() assert expense is not None assert expense.title == 'Multi doc expense' assert len(expense.attachments) == 2 assert DocumentAttachment.query.count() >= 2 def test_manual_report_run_from_admin(logged_admin, app): with app.app_context(): user = User.query.filter_by(email='user@test.com').first() user.report_frequency = 'monthly' db.session.add(Expense(user_id=user.id, title='Report item', amount=9, currency='PLN', purchase_date=date.today(), payment_method='card')) db.session.commit() response = logged_admin.post('/admin/run-reports', follow_redirects=True) assert response.status_code == 200 assert b'Queued/sent reports' in response.data