mirror of
https://github.com/This-weiyuqing/mi-fitness-health.git
synced 2026-10-18 03:03:49 +08:00
56 lines
2.1 KiB
Python
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())
|