7f93d6b0f5
- Introduced ActiveMoneyflowSource to fetch optional active-order flow, enhancing the sector radar's data capabilities. - Updated StockFactRecord and DailyAggregateRecord to include pct_change and active_buy_net_amount_yuan for improved financial insights. - Modified the build process to incorporate active moneyflow data without invalidating main rankings on failure. - Enhanced the HTTP API to return detailed sector history and metrics, including pct_change and active buy metrics for members. - Updated tests to validate the new functionality and ensure data integrity across various scenarios.
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.')
|