fix(assignments): 未分配列表不再混入 CK 失效账号

分配池统一为:持 CK、CK 未判失效、未被停用/归档。新增 assignable_only 参数贯穿账号列表、批量分配与分配概览;前端列表与一键全部分配使用同一口径。
This commit is contained in:
yml2213
2026-10-22 11:01:55 +08:00
parent 3761267015
commit 96c4f41674
6 changed files with 109 additions and 12 deletions
+65 -1
View File
@@ -14,7 +14,11 @@
from tests.support.db import get_test_engine, make_test_session
from web.backend.models import Account, User
from web.backend.routers.accounts import batch_assign_accounts, list_accounts
from web.backend.routers.accounts import (
assignments_summary,
batch_assign_accounts,
list_accounts,
)
from web.backend.schemas import BatchAssign
@@ -97,6 +101,66 @@ class TestAssignFilter(_Base):
assert self.names(assign_status="unassigned", tag="10.1-测试") == ["tag-a-free"]
class TestAssignablePool(_Base):
"""分配池口径:CK 失效的号必须先修复,不能混进「未分配」让人误分配。"""
def test_assignable_only_excludes_invalid_ck(self):
self.make_account("ap-valid", ck_check_status="valid")
self.make_account("ap-unchecked") # 还没检测过:按可用处理
self.make_account("ap-error", ck_check_status="error") # 查不到 ≠ 失效
self.make_account("ap-invalid", ck_check_status="invalid")
self.make_account("ap-disabled", ck_check_status="valid", status="disabled")
assert self.names(assign_status="unassigned", assignable_only=True) == [
"ap-valid",
"ap-unchecked",
"ap-error",
]
def test_summary_counts_only_assignable(self):
self.make_account("as-valid", ck_check_status="valid")
self.make_account("as-invalid", ck_check_status="invalid")
self.make_account(
"as-assigned-valid", ck_check_status="valid", assigned_to=self.support.id
)
self.make_account(
"as-assigned-invalid",
ck_check_status="invalid",
assigned_to=self.support.id,
)
summary = assignments_summary(db=self.session, current=self.admin)
assert summary["unassigned_count"] == 1
assert summary["assigned_count"] == 1
assert summary["total_count"] == 2
support = next(
u for u in summary["support_users"] if u["id"] == self.support.id
)
assert support["assigned_count"] == 1
def test_all_matching_assignable_only_skips_invalid(self):
valid = self.make_account("am-valid", ck_check_status="valid")
invalid = self.make_account("am-invalid", ck_check_status="invalid")
result = batch_assign_accounts(
BatchAssign(
all_matching=True,
assign_status="unassigned",
assignable_only=True,
assigned_to=self.support.id,
),
db=self.session,
current=self.admin,
)
assert result["count"] == 1
self.session.refresh(valid)
self.session.refresh(invalid)
assert valid.assigned_to == self.support.id
assert invalid.assigned_to is None
class TestAllMatchingAssign(_Base):
def test_assigns_every_matching_unassigned(self):
free = [self.make_account(f"mf-{i}") for i in range(3)]