Files
kra-new/scripts/sw_account_write_verify.py
T

76 lines
4.8 KiB
Python

"""核对专用二级测试账号的资料更新、四种商务状态及恢复,不修改真实商务账号。"""
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()