49 lines
2.3 KiB
Python
49 lines
2.3 KiB
Python
"""Measure compressed page bodies using only an isolated synthetic database."""
|
|
import gzip
|
|
import json
|
|
import os
|
|
import sys
|
|
from datetime import datetime, timedelta
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(ROOT))
|
|
os.environ['FLASK_CONFIG'] = 'TestingConfig'
|
|
from app.config import TestingConfig
|
|
TestingConfig.SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
|
|
from app import create_app, db
|
|
from app.models import User, Profile, Reading
|
|
|
|
app = create_app()
|
|
results = {}
|
|
with app.app_context():
|
|
db.create_all()
|
|
db.session.add(User(id=1, username='size-fixture', password_hash='unused', profile=Profile(timezone='Australia/Sydney')))
|
|
db.session.commit()
|
|
client = app.test_client()
|
|
with client.session_transaction() as session:
|
|
session['_user_id'] = '1'
|
|
session['_fresh'] = True
|
|
for filename in ('css/tailwind.css', 'js/diy-turbo.min.js', 'images/favicon.svg'):
|
|
payload = (ROOT / 'app/static' / filename).read_bytes()
|
|
results[filename] = {'raw_bytes': len(payload), 'gzip_bytes': len(gzip.compress(payload))}
|
|
for name, count in [('empty', 0), ('typical', 120), ('large', 10000)]:
|
|
db.session.query(Reading).filter_by(user_id=1).delete()
|
|
anchor = datetime(2026, 9, 8, 0, 0)
|
|
db.session.bulk_save_objects([Reading(user_id=1, timestamp=anchor - timedelta(hours=i * 5),
|
|
systolic=110 + i % 40, diastolic=65 + i % 25, heart_rate=60 + i % 30) for i in range(count)])
|
|
db.session.commit()
|
|
for view in ('overview', 'history', 'trends'):
|
|
dates = 'start_date=2020-01-01&end_date=2026-09-08' if name == 'large' and view == 'trends' else 'start_date=2026-09-02&end_date=2026-09-08'
|
|
payload = client.get(f'/dashboard?view={view}&{dates}')
|
|
assert payload.status_code == 200
|
|
size = len(gzip.compress(payload.data))
|
|
assert size <= 20000, (name, view, size)
|
|
results[f'{name}_{view}'] = {'raw_bytes': len(payload.data), 'gzip_bytes': size}
|
|
shared = sum(results[key]['gzip_bytes'] for key in ('css/tailwind.css', 'js/diy-turbo.min.js', 'images/favicon.svg'))
|
|
results['typical_cold_overview_bytes'] = shared + results['typical_overview']['gzip_bytes']
|
|
assert results['typical_cold_overview_bytes'] <= 40000
|
|
db.session.remove()
|
|
db.drop_all()
|
|
print(json.dumps(results, indent=2))
|