"""用已有真实绑定的三级账号逐项切换统计偏好,对比报表后恢复原始偏好行。""" import argparse import json import subprocess import sys from pathlib import Path from sw_write_verify import Rehearsal def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--runtime", type=Path, required=True) parser.add_argument("--config", type=Path, default=Path("configs/config.yaml")) parser.add_argument("--old-url", default="http://127.0.0.1:18080") parser.add_argument("--new-url", default="http://127.0.0.1:19001") parser.add_argument("--output", type=Path, required=True) args = parser.parse_args() run = Rehearsal(args) identity = json.loads((args.runtime / "test-business-identities.json").read_text())["level3"] ids = {"legacy": identity["user_id"], "new": run.mapping[str(identity["user_id"])]} originals, preferences = {}, {} for side, db in (("legacy", "sw8"), ("new", "sw9")): originals[side] = run.query(f"SELECT * FROM {db}.sys_user_preference WHERE user_id=%s", (ids[side],)) preferences[side] = run.call(side, "level3", "GET", run.prefix(side) + "/user/preference")["data"] (args.runtime / "preferences-before-matrix.json").write_text(json.dumps(originals, ensure_ascii=False, indent=2, default=str), encoding="utf-8") templates = json.loads((args.runtime / "level3-business-cases.json").read_text()) templates = [row for row in templates if row["name"] in ("channelData-list", "gameData-list", "rank-game", "workbench-summary")] try: for include, dedup in ((True, True), (True, False), (False, True), (False, False)): mode = f"sub{int(include)}-dedup{int(dedup)}" value = {"includeSubPromote": include, "idcardDedup": dedup} for side in ("legacy", "new"): run.call(side, "level3", "PUT", run.prefix(side) + "/user/preference", value) actual = run.call(side, "level3", "GET", run.prefix(side) + "/user/preference")["data"] run.check("偏好写入 " + mode + " " + side, actual == value) cases = [{**row, "name": mode + "-" + row["name"]} for row in templates] cases_file = args.runtime / ("preference-cases-" + mode + ".json") cases_file.write_text(json.dumps(cases), encoding="utf-8") output = args.output.with_name(args.output.stem + "-" + mode + args.output.suffix) with (args.runtime / ("preference-" + mode + ".log")).open("wb") as log: completed = subprocess.run([sys.executable, str(Path(__file__).with_name("sw_api_compare.py")), "--runtime", str(args.runtime), "--cases", str(cases_file), "--identity", "level3", "--old-url", args.old_url, "--new-url", args.new_url, "--output", str(output)], stdout=log, stderr=subprocess.STDOUT) run.check("偏好模式报表一致 " + mode, completed.returncode == 0, report=output.name) finally: for side, db in (("legacy", "sw8"), ("new", "sw9")): run.call(side, "level3", "PUT", run.prefix(side) + "/user/preference", preferences[side]) if not originals[side]: run.query(f"DELETE FROM {db}.sys_user_preference WHERE user_id=%s", (ids[side],)) else: row = originals[side][0] run.query(f"UPDATE {db}.sys_user_preference SET include_sub_promote=%s,idcard_dedup=%s,update_time=%s WHERE user_id=%s", (row["include_sub_promote"], row["idcard_dedup"], row["update_time"], ids[side])) actual = run.query(f"SELECT * FROM {db}.sys_user_preference WHERE user_id=%s", (ids[side],)) run.check("偏好原始行已恢复 " + side, actual == originals[side]) run.db.close() if __name__ == "__main__": main()