# -*- coding: utf-8 -*-
"""分片自动重试 E2E：首次请求把两个 data 分片截断（模拟链路瞬断），第二次放行 → 页面应自愈：files==want、无红横幅、DATA 全量。
   再测：某分片永远截断 → 横幅出现且点名该文件。"""
import urllib.parse, time, sys
from playwright.sync_api import sync_playwright

URL = 'http://127.0.0.1:8848/' + urllib.parse.quote('组卷台.html')
res = []
def ok(name, cond, extra=''):
    res.append((name, bool(cond))); print('%s %s %s' % ('✓' if cond else '✗', name, extra))

def run(truncate_forever):
    hits = {}
    def handler(route):
        url = route.request.url; key = url.split('/zj_assets/')[1].split('?')[0]
        n = hits.get(key, 0) + 1; hits[key] = n
        if key in ('data/01_0.js', 'data/08_0.js') and (n == 1 or truncate_forever):
            body = route.fetch().body()
            route.fulfill(status=200, content_type='application/javascript', body=body[: len(body) // 2])
        else:
            route.continue_()
    with sync_playwright() as p:
        b = p.chromium.launch(headless=True); pg = b.new_page(viewport={'width': 1300, 'height': 900})
        errs = []; pg.on('pageerror', lambda e: errs.append(str(e)[:120]))
        pg.route('**/zj_assets/data/**', handler)
        pg.goto(URL, timeout=600000, wait_until='domcontentloaded'); pg.wait_for_selector('#bCompose', timeout=600000); time.sleep(1)
        st = pg.evaluate("({files:ZJ._files,want:ZJ._want,data:DATA.length,retried:ZJ._retried,failed:ZJ._failed,verbar:(document.getElementById('verbar')||{}).innerText||''})")
        b.close()
    return st, hits, errs

st, hits, errs = run(False)
ok('首开截断 2 片 → 自动重拉后分片齐全', st['files'] == st['want'] and not st['verbar'], str({k: v for k, v in st.items() if k != 'verbar'}))
ok('两片各被请求 2 次（1 次截断 + 1 次重试）', hits.get('data/01_0.js') == 2 and hits.get('data/08_0.js') == 2, str({k: v for k, v in hits.items() if v > 1}))
ok('DATA 全量 160524', st['data'] == 160524, str(st['data']))
ok('retried 记录了两片', sorted(x.split('#')[0] for x in st['retried']) == ['data/01_0.js', 'data/08_0.js'], str(st['retried']))

st2, hits2, _ = run(True)
ok('永久截断 → 横幅点名文件', st2['files'] == st2['want'] - 2 and '01_0' in st2['verbar'] and '08_0' in st2['verbar'], st2['verbar'][:80])
ok('永久截断 → 每片重试 2 次后放弃（共 3 次请求）', hits2.get('data/01_0.js') == 3, str(hits2.get('data/01_0.js')))

bad = [r for r in res if not r[1]]
print('\n%d/%d 通过' % (len(res) - len(bad), len(res)))
sys.exit(1 if bad else 0)
