Files

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