# -*- 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"