28 lines
1.5 KiB
Python
28 lines
1.5 KiB
Python
"""Verify API facts against independently calculated persisted real data."""
|
|
import json
|
|
from decimal import Decimal
|
|
from pathlib import Path
|
|
from urllib.request import urlopen
|
|
|
|
root='http://127.0.0.1:8016/api/v1/sector-radar/'
|
|
d=json.load(urlopen(root+'sectors/concept/BK1147.DC/detail?trade_date=2026-09-04'))
|
|
assert d['status']=='success'
|
|
assert len(d['members'])==14
|
|
assert Decimal(d['pct_change'])==Decimal('1.82')
|
|
assert sum(Decimal(m['net_amount_yuan']) for m in d['members'])==Decimal('485456500')
|
|
assert sum(Decimal(m['active_buy_net_amount_yuan']) for m in d['members'])==Decimal('-255455700')
|
|
assert Decimal(d['summary']['amount']['metric_value'])==Decimal('4.854565')
|
|
# Storage uses 12 fractional digits for persisted metric observations.
|
|
assert abs(Decimal(d['summary']['ratio']['metric_value'])-Decimal('0.18560945649159168662'))<Decimal('1e-12')
|
|
assert d['history']['available_days']==1
|
|
assert len(d['history']['points'])==30
|
|
assert d['summary']['swing']['missing'] is True
|
|
assert len(d['leaders']['pct_change']['top'])==5
|
|
for view in ['amount','ratio']:
|
|
r=json.load(urlopen(root+'rankings?sector_type=concept&view='+view+'&side=top&trade_date=2026-09-04'))['rows'][0]
|
|
assert Decimal(r['pct_change'])==Decimal('1.82')
|
|
assert Decimal(r['daily_net_amount_yuan'])==Decimal('485456500')
|
|
assert r['on_list_count']==1
|
|
Path(__file__).with_name('verified-detail.json').write_text(json.dumps(d,ensure_ascii=False,indent=2))
|
|
print('PASS: real persisted SPD data matches detail and both ranking APIs; 14 members, 30 slots / 1 available day, absent swing remains null.')
|