feat: take over host delete so profile dirs are removed
All checks were successful
技能自动化发布 / release (push) Successful in 7s

This commit is contained in:
2026-10-01 09:56:55 +08:00
parent 1ba7a0f4a1
commit 7d0ec94210
7 changed files with 129 additions and 17 deletions

View File

@@ -0,0 +1,54 @@
# -*- coding: utf-8 -*-
"""delete id 会删库记录和硬盘 Profile,避免假删除残留登录态。"""
from __future__ import annotations
import os
from db.accounts_repo import find_accounts, get_account_by_id
def _add_web(**kwargs):
from service.account_service import cmd_account_add_web
defaults = dict(
platform_input="maersk",
login_id="demo@maersk.com",
login_id_type="email",
label="Maersk delete test",
tenant_id="tenant-demo",
environment="simulator",
role="booking",
provider_code=None,
url=None,
extra_json_str=None,
profile_dir_override=None,
)
defaults.update(kwargs)
cmd_account_add_web(**defaults)
def test_delete_by_id_removes_row_and_profile(clean_db, fake_env):
from service.account_service import cmd_delete_by_id
_add_web()
acc = find_accounts(platform_key="maersk")[0]
profile_dir = acc["profile_dir"]
marker = os.path.join(profile_dir, "Default", "Cookies")
os.makedirs(os.path.dirname(marker), exist_ok=True)
with open(marker, "w", encoding="utf-8") as handle:
handle.write("session")
assert os.path.isfile(marker)
cmd_delete_by_id(acc["id"])
assert get_account_by_id(acc["id"]) is None
assert find_accounts(platform_key="maersk") == []
assert not os.path.exists(profile_dir)
def test_delete_by_id_missing_account(clean_db, capsys):
from service.account_service import cmd_delete_by_id
cmd_delete_by_id(99999)
out = capsys.readouterr().out
assert "ERROR:ACCOUNT_NOT_FOUND" in out

View File

@@ -72,6 +72,26 @@ class TestRowOpenActions(unittest.TestCase):
self.assertIn("enum", props["login_id_type"])
self.assertIn("enum", props["status"])
def test_delete_takes_over_host_delete(self) -> None:
delete = _by_id(_load_actions(), "account-delete")
self.assertEqual(delete.get("replaces"), "delete")
self.assertEqual(delete.get("placements") or [], [])
self.assertEqual(delete.get("interaction"), "confirm")
self.assertEqual(delete.get("label"), "删除账号")
bind = delete.get("bind") or {}
self.assertEqual(bind.get("tables"), ["accounts"])
self.assertEqual(bind.get("inputMapping"), {"accountId": "$row.$pk"})
self.assertEqual(
(delete.get("entrypoint") or {}).get("command"),
"delete",
)
self.assertEqual(
(delete.get("entrypoint") or {}).get("args"),
["id", "{{accountId}}"],
)
steps = delete.get("steps") or []
self.assertTrue(any(s.get("do") == "reloadTable" for s in steps))
def test_copy_is_direct_row_action(self) -> None:
copy = _by_id(_load_actions(), "account-copy")
self.assertEqual(copy.get("label"), "复制")