All checks were successful
技能自动化发布 / release (push) Successful in 8s
Data-management add/edit now use short forms with enums; copy clones a platform account into a new empty profile. Co-authored-by: Cursor <cursoragent@cursor.com>
154 lines
5.7 KiB
Python
154 lines
5.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""account copy / update 与数据管理短表单语义。"""
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import os
|
|
|
|
from db.accounts_repo import find_accounts, get_account_by_id
|
|
|
|
|
|
def _add(clean_db, **kwargs):
|
|
from service.account_service import cmd_account_add_web
|
|
|
|
defaults = dict(
|
|
platform_input="douyin",
|
|
login_id="13800138000",
|
|
login_id_type="phone",
|
|
label="抖音 默认",
|
|
tenant_id="t1",
|
|
environment="production",
|
|
role="default",
|
|
provider_code=None,
|
|
url="https://www.douyin.com",
|
|
extra_json_str='{"hook":"keep"}',
|
|
profile_dir_override=None,
|
|
auth_strategy="qr_code_manual",
|
|
session_persistent=1,
|
|
device_fingerprint=None,
|
|
)
|
|
defaults.update(kwargs)
|
|
cmd_account_add_web(**defaults)
|
|
|
|
|
|
class TestAccountCopy:
|
|
def test_copy_clones_platform_not_login_or_profile(self, clean_db, capsys):
|
|
from service.account_service import cmd_account_copy
|
|
|
|
_add(clean_db)
|
|
source = find_accounts(platform_key="douyin")[0]
|
|
cmd_account_copy(source["id"])
|
|
out = capsys.readouterr().out.strip()
|
|
payload = json.loads(out.splitlines()[-1])
|
|
assert payload["success"] is True
|
|
assert payload["type"] == "result"
|
|
assert "已复制为" in payload["message"]
|
|
copy_id = payload["data"]["id"]
|
|
assert copy_id != source["id"]
|
|
copied = get_account_by_id(copy_id)
|
|
assert copied["platform_key"] == "douyin"
|
|
assert copied["account_label"] == "抖音 默认 副本"
|
|
assert copied["login_id"] == ""
|
|
assert copied["tenant_id"] == "t1"
|
|
assert copied["environment"] == "production"
|
|
assert copied["role"] == "default"
|
|
assert copied["url"] == "https://www.douyin.com"
|
|
assert copied["auth_strategy"] == "qr_code_manual"
|
|
assert copied["session_persistent"] == 1
|
|
assert copied["device_fingerprint"] is None
|
|
assert copied["status"] == "active"
|
|
assert copied["session_status"] == "unknown"
|
|
assert (copied.get("extra_json") or {}).get("hook") == "keep"
|
|
assert copied["profile_dir"]
|
|
assert copied["profile_dir"] != source["profile_dir"]
|
|
assert os.path.isdir(copied["profile_dir"])
|
|
|
|
def test_copy_second_increments_label(self, clean_db, capsys):
|
|
from service.account_service import cmd_account_copy
|
|
|
|
_add(clean_db)
|
|
source = find_accounts(platform_key="douyin")[0]
|
|
cmd_account_copy(source["id"])
|
|
capsys.readouterr()
|
|
cmd_account_copy(source["id"])
|
|
payload = json.loads(capsys.readouterr().out.strip().splitlines()[-1])
|
|
assert payload["data"]["account_label"] == "抖音 默认 副本 2"
|
|
|
|
def test_copy_missing_id(self, clean_db, capsys):
|
|
from service.account_service import cmd_account_copy
|
|
|
|
cmd_account_copy(99999)
|
|
payload = json.loads(capsys.readouterr().out.strip().splitlines()[-1])
|
|
assert payload["success"] is False
|
|
assert payload["error"]["code"] == "ERROR:ACCOUNT_NOT_FOUND"
|
|
|
|
|
|
class TestAccountUpdate:
|
|
def test_update_short_fields(self, clean_db, capsys):
|
|
from service.account_service import cmd_account_update
|
|
|
|
_add(clean_db)
|
|
source = find_accounts(platform_key="douyin")[0]
|
|
cmd_account_update(
|
|
source["id"],
|
|
label="抖音 备用",
|
|
login_id="backup@example.com",
|
|
login_id_type="unknown",
|
|
url="https://www.douyin.com/user",
|
|
status="disabled",
|
|
)
|
|
payload = json.loads(capsys.readouterr().out.strip().splitlines()[-1])
|
|
assert payload["success"] is True
|
|
assert payload["message"] == "已保存"
|
|
updated = get_account_by_id(source["id"])
|
|
assert updated["account_label"] == "抖音 备用"
|
|
assert updated["login_id"] == "backup@example.com"
|
|
assert updated["login_id_type"] == "email"
|
|
assert updated["url"] == "https://www.douyin.com/user"
|
|
assert updated["status"] == "disabled"
|
|
assert updated["auth_strategy"] == "qr_code_manual"
|
|
assert updated["profile_dir"] == source["profile_dir"]
|
|
|
|
def test_update_empty_login_clears(self, clean_db, capsys):
|
|
from service.account_service import cmd_account_update
|
|
|
|
_add(clean_db)
|
|
source = find_accounts(platform_key="douyin")[0]
|
|
cmd_account_update(source["id"], login_id="", login_id_type="unknown")
|
|
capsys.readouterr()
|
|
updated = get_account_by_id(source["id"])
|
|
assert updated["login_id"] == ""
|
|
assert updated["login_id_type"] == "unknown"
|
|
assert updated["account_label"] == "抖音 默认"
|
|
|
|
def test_update_rejects_bad_status(self, clean_db, capsys):
|
|
from service.account_service import cmd_account_update
|
|
|
|
_add(clean_db)
|
|
source = find_accounts(platform_key="douyin")[0]
|
|
cmd_account_update(source["id"], status="nope")
|
|
payload = json.loads(capsys.readouterr().out.strip().splitlines()[-1])
|
|
assert payload["success"] is False
|
|
|
|
|
|
class TestAddWebInfersLoginType:
|
|
def test_email_without_type(self, clean_db, capsys):
|
|
from service.account_service import cmd_account_add_web
|
|
|
|
cmd_account_add_web(
|
|
platform_input="deepseek",
|
|
login_id="a@b.com",
|
|
login_id_type=None,
|
|
label="ds",
|
|
tenant_id=None,
|
|
environment="production",
|
|
role="default",
|
|
provider_code=None,
|
|
url=None,
|
|
extra_json_str=None,
|
|
profile_dir_override=None,
|
|
)
|
|
capsys.readouterr()
|
|
acc = find_accounts(platform_key="deepseek")[0]
|
|
assert acc["login_id_type"] == "email"
|