# -*- coding: utf-8 -*- """双账号 auth 纯函数与写回隔离测试(不联网): uv run python tests/test_auth.py""" import json import os import sys import tempfile from pathlib import Path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) sys.stdout.reconfigure(encoding="utf-8") from reaction_board.bilibili.auth import ( # noqa: E402 cookie_value, cookies_from_set_cookie, make_headers, merge_cookie, parse_cookie, sessdata_expiry, ) from reaction_board.bilibili.auth_flow import AuthService, write_qr_png # noqa: E402 READ_OLD = "buvid3=READ-B3; {{SECRET_i5bghhpt}}readcsrf; DedeUserID=11; SESSDATA=old%2C1700000000%2Ca" WRITE_OLD = "buvid3=WRITE-B3; bili_jct=writecsrf; DedeUserID=22; SESSDATA=old%2C1700000000%2Cb" NEW = {"SESSDATA": "new%2C1800000000%2Cxyz", "bili_jct": "newcsrf", "DedeUserID": "99"} def raw_config(): return { "bilibili": { "read": {"mid": 11, "csrf": "readcsrf", "cookie": READ_OLD}, "write": {"mid": 22, "csrf": "writecsrf", "cookie": WRITE_OLD}, }, "folders": [], } def test_cookie_helpers(): assert parse_cookie(READ_OLD)[0] == ("buvid3", "READ-B3") merged = merge_cookie(WRITE_OLD, NEW) assert cookie_value(merged, "SESSDATA") == "new%2C1800000000%2Cxyz" assert cookie_value(merged, "bili_jct") == "newcsrf" assert cookie_value(merged, "buvid3") == "WRITE-B3" assert sessdata_expiry(merged) == 1800000000 headers = ["SESSDATA=x; Path=/", "bili_jct=y; Domain=.bilibili.com"] assert cookies_from_set_cookie(headers) == {"SESSDATA": "x", "bili_jct": "y"} def test_finish_updates_only_selected_account_and_rolls_back(): with tempfile.TemporaryDirectory() as tmp: path = Path(tmp) / "config.json" original = raw_config() path.write_text(json.dumps(original, ensure_ascii=False), encoding="utf-8") service = AuthService(path, account="write") service._get_json = lambda credentials, url, auth: { # type: ignore[method-assign] "code": 0, "data": {"isLogin": True, "mid": 99, "uname": "writer"} } assert service.finish(service._load_raw(), NEW) == 0 saved = json.loads(path.read_text(encoding="utf-8")) assert saved["bilibili"]["read"] == original["bilibili"]["read"] assert saved["bilibili"]["write"]["mid"] == 99 assert saved["bilibili"]["write"]["csrf"] == "newcsrf" assert cookie_value(saved["bilibili"]["write"]["cookie"], "buvid3") == "WRITE-B3" assert path.with_name("config.json.bak").exists() before = path.read_text(encoding="utf-8") service._get_json = lambda credentials, url, auth: { # type: ignore[method-assign] "code": -101, "data": {"isLogin": False} } assert service.finish(service._load_raw(), NEW) == 4 assert path.read_text(encoding="utf-8") == before def test_qr_png(): with tempfile.TemporaryDirectory() as tmp: path = Path(tmp) / "qr.png" write_qr_png("https://example.com/login?key=abc", path) assert path.read_bytes().startswith(b"\x89PNG\r\n\x1a\n") def test_make_headers_matches_raw_request(): headers = make_headers({"cookie": "SESSDATA=x; buvid3=y"}, auth=False) assert headers["origin"] == "https://space.bilibili.com" assert headers["referer"] == "https://space.bilibili.com/" assert headers["priority"] == "u=1, i" assert headers["user-agent"].endswith("Chrome/155.0.0.0 Safari/537.36") assert headers["sec-ch-ua"].startswith('"Google Chrome";v="155"') assert "SESSDATA" not in headers["cookie"] assert "buvid3=y" in headers["cookie"] full = make_headers({"cookie": "SESSDATA=x"}, auth=True) assert full["cookie"] == "SESSDATA=x" custom = make_headers( {"cookie": ""}, referer="https://space.bilibili.com/1/favlist?fid=2" ) assert custom["referer"] == "https://space.bilibili.com/1/favlist?fid=2" def main(): test_cookie_helpers() test_finish_updates_only_selected_account_and_rolls_back() test_qr_png() test_make_headers_matches_raw_request() print("OK: 双账号 auth Cookie 合并、写回隔离与回滚测试全部通过") if __name__ == "__main__": main()