Files
mi-fitness-health/maintenance/legacy-tests/check_bulk_container.py
T

56 lines
2.1 KiB
Python

import asyncio
import json
import os
import sqlite3
import tempfile
import time
from datetime import datetime, timedelta, timezone
from pathlib import Path
import httpx
root=Path(tempfile.mkdtemp())
os.environ['XDG_CONFIG_HOME']=str(root/'config')
os.environ['XDG_DATA_HOME']=str(root/'data')
os.environ['HOME']=str(root)
from mi_fitness_mcp.api import app
from mi_fitness_mcp.models import HeartRateSample
from mi_fitness_mcp.services.sync_service import SyncService
from mi_fitness_mcp.storage import Database
class SlowDisk(Database):
def insert_heart_rate_sample(self, sample, **kwargs):
time.sleep(0.01)
return super().insert_heart_rate_sample(sample, **kwargs)
class SyntheticAdapter:
def is_connected(self): return True
async def iter_heart_rate(self,start,end):
stamp=datetime(2026,10,15,tzinfo=timezone.utc)
for i in range(40):
yield HeartRateSample(id=f'local-proof-{i}',provider='mi_fitness',source_type='cloud_session',user_id='synthetic-only',timestamp=stamp+timedelta(minutes=i),bpm=70)
async def main():
db=SlowDisk(root/'health.sqlite')
service=SyncService(SyntheticAdapter(),db)
task=asyncio.create_task(service.sync_data_type('heart_rate','2026-10-15','2026-10-15'))
await asyncio.sleep(0.02)
async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app),base_url='http://127.0.0.1') as client:
started=time.perf_counter()
r=await client.get('/')
elapsed=time.perf_counter()-started
responsive=not task.done()
result=await task
with sqlite3.connect(db.db_path) as c:
rows=c.execute('SELECT count(*) FROM heart_rate_samples').fetchone()[0]
integrity=c.execute('PRAGMA quick_check').fetchone()[0]
report={'linux_http_status_during_disk_wait':r.status_code,'request_returned_while_sync_active':responsive,'local_request_ms':round(elapsed*1000,1),'synthetic_records_stored':rows,'sync_status':result['status'],'database_quick_check':integrity}
print(json.dumps(report))
assert r.status_code==200 and responsive and rows==40 and integrity=='ok'
asyncio.run(main())