90 lines
3.1 KiB
Python
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
|