Files
kra-new/scripts/sw_preference_compare.py
T

62 lines
3.8 KiB
Python

"""用已有真实绑定的三级账号逐项切换统计偏好,对比报表后恢复原始偏好行。"""
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()