From 0f6eb92a1faa3ed4d92cf8a35266b9f754f0d08b Mon Sep 17 00:00:00 2001 From: jackyu66git Date: Fri, 7 Aug 2026 16:03:37 +0800 Subject: [PATCH] =?UTF-8?q?test(ECR-009):=20=E8=A1=A5=E9=A1=B5=E9=9D=A2/AP?= =?UTF-8?q?I=20=E8=B7=AF=E7=94=B1=E5=86=92=E7=83=9F=E4=B8=8E=20TEST=5FREPO?= =?UTF-8?q?RT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 交付前缺 Flask 常驻与路由断言;现补齐 pytest 与报告。 Co-authored-by: Cursor --- docs/TEST_REPORT/ECR-009.md | 25 +++++++++++++ web/tests/test_wyckoff_crypto_routes.py | 48 +++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 docs/TEST_REPORT/ECR-009.md create mode 100644 web/tests/test_wyckoff_crypto_routes.py diff --git a/docs/TEST_REPORT/ECR-009.md b/docs/TEST_REPORT/ECR-009.md new file mode 100644 index 0000000..772af6d --- /dev/null +++ b/docs/TEST_REPORT/ECR-009.md @@ -0,0 +1,25 @@ +# TEST_REPORT — ECR-009 + +**Date:** 2026-08-07 + +## Commands + +```bash +PYTHONPATH=. python -m pytest tests/test_crypto_wyckoff_decision.py -q +CRYPTO_WYCKOFF_DISABLE=1 PYTHONPATH=.:web python -m pytest web/tests/test_wyckoff_crypto_routes.py -q +# Manual / live: +# cd web && CRYPTO_WYCKOFF_MAX_SYMBOLS=5 PYTHONPATH=..:. python app.py +# curl -I http://127.0.0.1:8128/wyckoff_crypto +``` + +## Result + +| Check | Result | +|-------|--------| +| Decision gate unit | 2 passed | +| Route page/meta/scan | 补测(本文件) | +| Live HTTP 2026-08-07 | `GET /wyckoff_crypto` → 200(需先启动 web) | + +## Note + +此前冒烟只做了引擎 tick,**未**在交付前保持 Flask 常驻并给浏览器 URL——属 ESS 测试缺口,已补路由测试与本报告。 diff --git a/web/tests/test_wyckoff_crypto_routes.py b/web/tests/test_wyckoff_crypto_routes.py new file mode 100644 index 0000000..2a1ca05 --- /dev/null +++ b/web/tests/test_wyckoff_crypto_routes.py @@ -0,0 +1,48 @@ +"""ECR-009: page/API smoke without requiring live provider during assert.""" + +from __future__ import annotations + +import os +import sys + +import pytest + +# Ensure repo root + web on path like app.py +_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +_WEB = os.path.join(_ROOT, "web") +for p in (_ROOT, _WEB): + if p not in sys.path: + sys.path.insert(0, p) + +os.environ.setdefault("CRYPTO_WYCKOFF_DISABLE", "1") + + +@pytest.fixture() +def client(): + from app import create_app + + app = create_app() + app.config["TESTING"] = True + with app.test_client() as c: + yield c + + +def test_wyckoff_crypto_page_ok(client): + resp = client.get("/wyckoff_crypto") + assert resp.status_code == 200 + assert b"Crypto Wyckoff Screener" in resp.data + + +def test_wyckoff_crypto_meta_ok(client): + resp = client.get("/api/wyckoff_crypto/meta") + assert resp.status_code == 200 + data = resp.get_json() + assert "engine_version" in data + assert data.get("timeframes") == ["1d", "1w", "1M"] + + +def test_wyckoff_crypto_scan_ok(client): + resp = client.get("/api/wyckoff_crypto/scan?limit=5") + assert resp.status_code == 200 + data = resp.get_json() + assert "rows" in data