Files
bloodpressure/scripts/check-pages.py
T

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))