#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""不依赖登录的端到端验证：
① 直接调 render_list_shell(route='crawler')，检查产出 HTML 是否含选中即搜 + boot 里每条带 v
② 访问计数的读路径往返：插一条假 project_visits → 看 _crawler_views_map 是否读到 → 删除还原
"""
import importlib.util
import json
import re
import sqlite3

spec = importlib.util.spec_from_file_location("sa", "/root/gov_crawler/search_app.py")
m = importlib.util.module_from_spec(spec)
try:
    spec.loader.exec_module(m)
except SystemExit:
    pass

print("=== ① render_list_shell(route='crawler') 产出检查 ===")
html = m.render_list_shell(username='tester', route='crawler')
print("  大小:", len(html))
print("  含 selbar（选中浮层）        :", "selbar" in html)
print("  含 encodeURIComponent        :", "encodeURIComponent" in html)
print("  浮层跳 /originals/?q=        :", "/originals/?q='+encodeURIComponent" in html)
print("  含 rowEl 的访问次数渲染      :", "it.v ?" in html)
mb = re.search(r"window\.__BOOT__ = (\{.*?\});</script>", html, re.S)
if mb:
    boot = json.loads(mb.group(1))
    items = boot.get("items") or []
    print("  首屏 items 数                :", len(items))
    print("  每条都带 v 字段              :", all("v" in it for it in items) if items else "(无 items)")
    print("  v 值样例                     :", [it.get("v") for it in items[:6]])
else:
    print("  ⚠️ 未找到 __BOOT__")

print("\n=== ② 访问计数读路径往返 ===")
db = sqlite3.connect("/root/session.db", timeout=15)
db.execute("PRAGMA busy_timeout=15000")
g = sqlite3.connect("/root/search.db", timeout=15)
g.execute("PRAGMA busy_timeout=15000")
rid = str(g.execute("SELECT id FROM gov_raw ORDER BY id DESC LIMIT 1").fetchone()[0])
g.close()

before = m._crawler_views_map([rid]).get(rid, 0)
print("  记录 %s 当前计数            : %d" % (rid, before))
db.execute("INSERT INTO project_visits (project_type, project_id, username) VALUES ('crawler',?,?)",
           (rid, '__hermes_selftest__'))
db.commit()
mid = m._crawler_views_map([rid]).get(rid, 0)
print("  插入一条假访问后             : %d  (%s)" % (mid, "✅ 读到" if mid == before + 1 else "❌ 未读到"))
db.execute("DELETE FROM project_visits WHERE project_type='crawler' AND project_id=? AND username='__hermes_selftest__'",
           (rid,))
db.commit()
after = m._crawler_views_map([rid]).get(rid, 0)
print("  清理后还原                   : %d  (%s)" % (after, "✅ 已还原" if after == before else "❌ 未还原"))
db.close()
