Files
expense_monitor/tests/test_integrations.py
Mateusz Gruszczyński 986ffb200a first commit
2026-03-13 15:17:32 +01:00

90 lines
3.1 KiB
Python

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