"""核对专用二级测试账号的资料更新、四种商务状态及恢复,不修改真实商务账号。""" import argparse import json import time 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) account = run.users[1] if not account["username"].startswith("mig_verify_"): raise ValueError("仅允许修改本轮创建的专用测试账号") originals = { "legacy": run.query("SELECT real_name,status,reject_reason,update_time FROM sw8.sys_user WHERE user_id=%s AND user_name=%s", (account["source_id"], account["username"]))[0], "new": run.query("SELECT real_name,business_status,enable,reject_reason,updated_at FROM sw9.sys_users WHERE id=%s AND username=%s", (account["target_id"], account["username"]))[0], } (args.runtime / "test-account-before-write.json").write_text(json.dumps(originals, default=str, indent=2), encoding="utf-8") def update(side, status, name, reason): payload = {"userId": account["source_id" if side == "legacy" else "target_id"], "userName": account["username"], "realName": name, "status": str(status), "rejectReason": reason or "", "roleIds": ["2087435436573081601"]} return run.call(side, "admin", "PUT", "/system/user" if side == "legacy" else "/sw/business", payload) try: started = time.monotonic() for index, status in enumerate((0, 3, 2, 1, 0)): if index == 4: # 旧控制器对相同请求体有五秒重复提交限制。 time.sleep(max(0, 5.2 - (time.monotonic() - started))) name = "迁移核对二级资料更新" reason = "迁移核对驳回" if status == 2 else "" for side in ("legacy", "new"): update(side, status, name, reason) path = "/system/user/" + str(account["source_id"]) if side == "legacy" else "/sw/business/" + str(account["target_id"]) detail = run.call(side, "admin", "GET", path)["data"] if side == "legacy": detail = detail["user"] run.check(f"资料及状态 {status} {side}", detail["realName"] == name and str(detail["status"]) == str(status) and detail["level"] == 2) enabled = run.query("SELECT enable FROM sw9.sys_users WHERE id=%s", (account["target_id"],))[0]["enable"] run.check(f"商务状态 {status} 与启停一致", enabled == (1 if status == 0 else 0)) replies = {side: run.call(side, "testlevel2", "GET", run.prefix(side) + "/user/preference", success=False) for side in ("legacy", "new")} if status != 0: run.check(f"状态 {status} 拒绝旧会话", replies["new"]["code"] != 0, legacy_session_allowed=replies["legacy"]["code"] == 200, accepted_change="新系统每次请求核对商务状态,阻止停用/待审/驳回账号沿用旧会话") else: run.check("正常账号会话可用", replies["new"]["code"] == 0 and replies["legacy"]["code"] == 200) finally: for side in ("legacy", "new"): original = originals[side] update(side, original["status" if side == "legacy" else "business_status"], original["real_name"], original["reject_reason"]) old, new = originals["legacy"], originals["new"] run.query("UPDATE sw8.sys_user SET real_name=%s,status=%s,reject_reason=%s,update_time=%s WHERE user_id=%s AND user_name=%s", (old["real_name"], old["status"], old["reject_reason"], old["update_time"], account["source_id"], account["username"])) run.query("UPDATE sw9.sys_users SET real_name=%s,business_status=%s,enable=%s,reject_reason=%s,updated_at=%s WHERE id=%s AND username=%s", (new["real_name"], new["business_status"], new["enable"], new["reject_reason"], new["updated_at"], account["target_id"], account["username"])) actual = { "legacy": run.query("SELECT real_name,status,reject_reason,update_time FROM sw8.sys_user WHERE user_id=%s", (account["source_id"],))[0], "new": run.query("SELECT real_name,business_status,enable,reject_reason,updated_at FROM sw9.sys_users WHERE id=%s", (account["target_id"],))[0], } run.check("测试账号原始资料和状态已恢复", actual == originals) run.db.close() if __name__ == "__main__": main()