feat: resolve account platforms prioritizing structural snapshot values and correction on existing accounts
This commit is contained in:
@@ -410,3 +410,157 @@ def test_import_upstream_key_with_custom_concurrency_and_priority(monkeypatch, d
|
||||
assert body["concurrency"] == 20
|
||||
assert body["priority"] == 5
|
||||
assert body["credentials"]["base_url"] == "http://packy.local"
|
||||
|
||||
|
||||
def test_import_platform_from_snapshot(monkeypatch, db_session):
|
||||
"""验证快照 platform=anthropic 且名称不含 Claude 时,创建账号平台必须为 anthropic"""
|
||||
from app.models.snapshot import UpstreamRateSnapshot
|
||||
website, generated = seed_account_import_rows(db_session)
|
||||
generated.key_name = "MyCustomKey" # 不含 Claude
|
||||
|
||||
# 写入快照指定平台为 anthropic
|
||||
snapshot = UpstreamRateSnapshot(
|
||||
upstream_id=generated.upstream_id,
|
||||
snapshot_json=json.dumps({
|
||||
"groups": {
|
||||
"vip": {
|
||||
"group_name": "VIP",
|
||||
"rate": 0.1,
|
||||
"platform": "anthropic"
|
||||
}
|
||||
}
|
||||
})
|
||||
)
|
||||
db_session.add(snapshot)
|
||||
db_session.commit()
|
||||
|
||||
account_bodies = []
|
||||
class FakeWebsiteClient:
|
||||
def __init__(self, **kwargs):
|
||||
pass
|
||||
def __enter__(self): return self
|
||||
def __exit__(self, *args): return False
|
||||
def create_account(self, body, endpoint="/accounts"):
|
||||
account_bodies.append(body)
|
||||
return {"id": 101, "name": body["name"]}
|
||||
def account_exists(self, account_id): return True
|
||||
@staticmethod
|
||||
def extract_id(data): return "101"
|
||||
|
||||
monkeypatch.setattr(websites_router, "Sub2ApiWebsiteClient", FakeWebsiteClient)
|
||||
|
||||
websites_router.import_upstream_keys_as_accounts(
|
||||
website.id,
|
||||
ImportAccountsRequest(
|
||||
upstream_key_ids=[generated.id],
|
||||
target_group_map={"vip": "7"},
|
||||
default_platform="openai",
|
||||
platform_mode="auto",
|
||||
),
|
||||
db_session,
|
||||
object(),
|
||||
)
|
||||
assert len(account_bodies) == 1
|
||||
assert account_bodies[0]["platform"] == "anthropic"
|
||||
|
||||
|
||||
def test_import_platform_fallback_to_name(monkeypatch, db_session):
|
||||
"""验证快照无 platform 但名称含 Claude 时,仍兜底为 anthropic"""
|
||||
from app.models.snapshot import UpstreamRateSnapshot
|
||||
website, generated = seed_account_import_rows(db_session)
|
||||
generated.key_name = "Claude-Key"
|
||||
|
||||
# 写入快照但不含 platform 字段
|
||||
snapshot = UpstreamRateSnapshot(
|
||||
upstream_id=generated.upstream_id,
|
||||
snapshot_json=json.dumps({
|
||||
"groups": {
|
||||
"vip": {
|
||||
"group_name": "VIP",
|
||||
"rate": 0.1,
|
||||
}
|
||||
}
|
||||
})
|
||||
)
|
||||
db_session.add(snapshot)
|
||||
db_session.commit()
|
||||
|
||||
account_bodies = []
|
||||
class FakeWebsiteClient:
|
||||
def __init__(self, **kwargs):
|
||||
pass
|
||||
def __enter__(self): return self
|
||||
def __exit__(self, *args): return False
|
||||
def create_account(self, body, endpoint="/accounts"):
|
||||
account_bodies.append(body)
|
||||
return {"id": 101, "name": body["name"]}
|
||||
def account_exists(self, account_id): return True
|
||||
@staticmethod
|
||||
def extract_id(data): return "101"
|
||||
|
||||
monkeypatch.setattr(websites_router, "Sub2ApiWebsiteClient", FakeWebsiteClient)
|
||||
|
||||
websites_router.import_upstream_keys_as_accounts(
|
||||
website.id,
|
||||
ImportAccountsRequest(
|
||||
upstream_key_ids=[generated.id],
|
||||
target_group_map={"vip": "7"},
|
||||
default_platform="openai",
|
||||
platform_mode="auto",
|
||||
),
|
||||
db_session,
|
||||
object(),
|
||||
)
|
||||
assert len(account_bodies) == 1
|
||||
assert account_bodies[0]["platform"] == "anthropic"
|
||||
|
||||
|
||||
def test_import_platform_manual_override(monkeypatch, db_session):
|
||||
"""手动模式下不使用快照平台,仍按用户指定平台"""
|
||||
from app.models.snapshot import UpstreamRateSnapshot
|
||||
website, generated = seed_account_import_rows(db_session)
|
||||
|
||||
# 快照虽然指定为 anthropic
|
||||
snapshot = UpstreamRateSnapshot(
|
||||
upstream_id=generated.upstream_id,
|
||||
snapshot_json=json.dumps({
|
||||
"groups": {
|
||||
"vip": {
|
||||
"group_name": "VIP",
|
||||
"rate": 0.1,
|
||||
"platform": "anthropic"
|
||||
}
|
||||
}
|
||||
})
|
||||
)
|
||||
db_session.add(snapshot)
|
||||
db_session.commit()
|
||||
|
||||
account_bodies = []
|
||||
class FakeWebsiteClient:
|
||||
def __init__(self, **kwargs):
|
||||
pass
|
||||
def __enter__(self): return self
|
||||
def __exit__(self, *args): return False
|
||||
def create_account(self, body, endpoint="/accounts"):
|
||||
account_bodies.append(body)
|
||||
return {"id": 101, "name": body["name"]}
|
||||
def account_exists(self, account_id): return True
|
||||
@staticmethod
|
||||
def extract_id(data): return "101"
|
||||
|
||||
monkeypatch.setattr(websites_router, "Sub2ApiWebsiteClient", FakeWebsiteClient)
|
||||
|
||||
websites_router.import_upstream_keys_as_accounts(
|
||||
website.id,
|
||||
ImportAccountsRequest(
|
||||
upstream_key_ids=[generated.id],
|
||||
target_group_map={"vip": "7"},
|
||||
default_platform="gemini",
|
||||
platform_mode="manual", # 手动模式
|
||||
),
|
||||
db_session,
|
||||
object(),
|
||||
)
|
||||
assert len(account_bodies) == 1
|
||||
assert account_bodies[0]["platform"] == "gemini"
|
||||
|
||||
Reference in New Issue
Block a user