summaryrefslogtreecommitdiff
path: root/qa/stub
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-21 02:23:43 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-21 02:23:43 +0800
commitf55ed58d2c75b53774ef7256fddb973ae3e73323 (patch)
tree63269f233f4305d5b68aa252e9548244a362adcf /qa/stub
parentbe1afd248e4cc9b03a1e21090602a945af6988b2 (diff)
downloadfund-lab-f55ed58d2c75b53774ef7256fddb973ae3e73323.tar.gz
feat(web): 基金创建/读取界面与仓库内浏览器 QA
[变更性质] - 本提交完成 3c-1 切片:Web 端基金建档(创建/重读)表单接入既有幂等 API,并提供仓库内可复现的端到端 QA 入口与生命周期回归。 [新增功能] - 前端新增 03 / CREATE 面板:名称与初始现金(decimal 字符串)输入、创建/重新读取按钮、服务端返回的基金档案行(份额诚实显示 0、来源标注真实建档/合成标记);移动端单列布局。 - 创建请求携带 32 位十六进制 Idempotency-Key;网络失败重试复用同一 key,输入变更或成功后换新 key;token 变更清空档案并按序列号拒绝过期响应。 [实现方案] - 金额全程 decimal 字符串,不经 JS float;update 层 fundSeq 守卫 FundCreate/FundRead 完成消息;BoundaryTests 新增 FundBoundaryTests 9 项(幂等键长度/复用、token 失效、stale 读取拒绝等)。 - qa/run.sh 一次性拉起非默认端口 Postgres/API/Vite(桩行情,_synthetic 标记),清理仅限本次创建的容器(ID+名称归属校验);临时目录 mktemp 隔离;qa/lifecycle-test.sh 验证拒绝路径不破坏既有资源。 [影响范围] - Web 测试增至 17 项,全套 56 项通过;浏览器 QA 30/30 通过;README 更新阶段描述。本提交不包含 docs/overnight-progress.md 的现有修改。
Diffstat (limited to 'qa/stub')
-rwxr-xr-xqa/stub/fund-lab-python32
1 files changed, 32 insertions, 0 deletions
diff --git a/qa/stub/fund-lab-python b/qa/stub/fund-lab-python
new file mode 100755
index 0000000..9cdfa6a
--- /dev/null
+++ b/qa/stub/fund-lab-python
@@ -0,0 +1,32 @@
+#!/usr/bin/env bash
+# QA stub interpreter: emulates the akshare_collector.py JSON contract
+# (source=stub-synthetic, _synthetic=true on every payload).
+# Invoked by MarketDataService as: fund-lab-python <script> --operation search --query X | --operation nav --code X
+set -euo pipefail
+
+OP=""
+QUERY=""
+CODE=""
+args=("$@")
+for ((i=1; i<${#args[@]}; i++)); do
+ case "${args[$i]}" in
+ --operation) OP="${args[$((i+1))]:-}"; i=$((i+1)) ;;
+ --query) QUERY="${args[$((i+1))]:-}"; i=$((i+1)) ;;
+ --code) CODE="${args[$((i+1))]:-}"; i=$((i+1)) ;;
+ esac
+done
+
+TS="$(date -u +%Y-%m-%dT%H:%M:%S+00:00)"
+
+case "$OP" in
+ search)
+ printf '{"schema_version":"fund-lab.akshare.v1","operation":"search","source":"stub-synthetic","source_revision":"stub-1","_synthetic":true,"collected_at":"%s","instruments":[{"code":"000001","name":"桩测试基金一号","fund_type":"混合型"},{"code":"110011","name":"桩测试基金二号","fund_type":null}]}\n' "$TS"
+ ;;
+ nav)
+ printf '{"schema_version":"fund-lab.akshare.v1","operation":"nav","source":"stub-synthetic","source_revision":"stub-1","_synthetic":true,"collected_at":"%s","instrument":{"code":"%s"},"observations":[{"nav_date":"2026-09-15","published_at":null,"nav":"1.1000","accumulated_nav":null,"daily_return":null},{"nav_date":"2026-09-16","published_at":null,"nav":"1.1205","accumulated_nav":null,"daily_return":"1.86"},{"nav_date":"2026-09-17","published_at":null,"nav":"1.1180","accumulated_nav":null,"daily_return":"-0.22"},{"nav_date":"2026-09-18","published_at":null,"nav":"1.1500","accumulated_nav":null,"daily_return":"2.86"},{"nav_date":"2026-09-21","published_at":null,"nav":"1.1902","accumulated_nav":null,"daily_return":"3.49"}]}\n' "$TS" "$CODE"
+ ;;
+ *)
+ echo "unknown operation: $OP" >&2
+ exit 2
+ ;;
+esac