feat: sync upstream keys and reorder priorities

This commit is contained in:
SmartUp Developer
2026-06-03 17:03:11 +08:00
parent a42bcba483
commit b866b387e0
8 changed files with 415 additions and 57 deletions
+53 -15
View File
@@ -5,8 +5,8 @@
- 竞争分组键 = imported_target_group_id or group_id(老数据 fallback
- 只有同一竞争分组内账号数 > 1 时才更新 priority / 发通知
- 不同分组各 1 个账号:不调用 update_account,不发通知
- 同一目标分组多账号:组内按倍率升序独立排序,priority 从 1 开始
- 两个目标分组各有多账号:彼此独立,每组内 priority 都从 1 开始
- 同一目标分组多账号:组内按倍率升序独立排序,priority 从 1 开始,每档间隔 10
- 两个目标分组各有多账号:彼此独立,每组内 priority 都从 1 开始,每档间隔 10
- 老数据 imported_target_group_id=NULLfallback group_id,不报错
"""
import json
@@ -164,9 +164,9 @@ def test_same_target_group_two_accounts_updated(db_session, monkeypatch):
assert len(update_calls) == 2
priority_map = {aid: data["priority"] for aid, data in update_calls}
# G1 rate=1.0 → priority=1(低倍率优先);G2 rate=2.0 → priority=2
# G1 rate=1.0 → priority=1(低倍率优先);G2 rate=2.0 → priority=11
assert priority_map["A1"] == 1
assert priority_map["A2"] == 2
assert priority_map["A2"] == 11
# 写了日志
log = db_session.query(WebsiteSyncLog).filter(WebsiteSyncLog.website_id == w.id).first()
@@ -185,9 +185,9 @@ def test_two_target_groups_independent_priority(db_session, monkeypatch):
_make_snapshot(db_session, u1.id, {
"G1": 1.0, # → TG1 中排 priority=1
"G2": 2.0, # → TG1 中排 priority=2
"G2": 2.0, # → TG1 中排 priority=11
"G3": 0.5, # → TG2 中排 priority=1
"G4": 3.0, # → TG2 中排 priority=2
"G4": 3.0, # → TG2 中排 priority=11
})
# TG1: G1(1.0), G2(2.0)
@@ -208,12 +208,12 @@ def test_two_target_groups_independent_priority(db_session, monkeypatch):
priority_map = {aid: data["priority"] for aid, data in update_calls}
assert len(update_calls) == 4
# TG1 内部:G1(1.0)→p1, G2(2.0)→p2
# TG1 内部:G1(1.0)→p1, G2(2.0)→p11
assert priority_map["A1"] == 1
assert priority_map["A2"] == 2
# TG2 内部:G3(0.5)→p1, G4(3.0)→p2(独立从 1 开始)
assert priority_map["A2"] == 11
# TG2 内部:G3(0.5)→p1, G4(3.0)→p11(独立从 1 开始)
assert priority_map["A3"] == 1
assert priority_map["A4"] == 2
assert priority_map["A4"] == 11
def test_old_data_null_target_group_fallback(db_session, monkeypatch):
@@ -334,9 +334,9 @@ def test_partial_missing_rate_sufficient_accounts_still_updates(db_session, monk
updated = {c[0]: c[1]["priority"] for c in update_calls}
# A3 无快照 → 不参与排序,不被更新
assert "A3" not in updated
# A1(G1, rate=1.0) → priority=1A2(G2, rate=2.0) → priority=2
# A1(G1, rate=1.0) → priority=1A2(G2, rate=2.0) → priority=11
assert updated["A1"] == 1
assert updated["A2"] == 2
assert updated["A2"] == 11
def test_priority_sync_log_structure(db_session, monkeypatch):
@@ -392,7 +392,7 @@ def test_priority_sync_cross_upstream_group(db_session):
priority_map = build_rate_priority_map(db_session, {u1.id, u2.id})
assert priority_map[f"{u1.id}:VIP"] == 1
assert priority_map[f"{u2.id}:VIP"] == 2
assert priority_map[f"{u2.id}:VIP"] == 11
assert len(priority_map) == 2
@@ -446,8 +446,46 @@ def test_import_auto_priority_by_rate(db_session, monkeypatch):
import_upstream_keys_as_accounts(w.id, req, db_session)
assert len(created_accounts) == 2
# G2 rate=1.0 → priority 1G1 rate=2.0 → priority 2
# G2 rate=1.0 → priority 1G1 rate=2.0 → priority 11
p1 = next(a["priority"] for a in created_accounts if "G1" in a["name"])
p2 = next(a["priority"] for a in created_accounts if "G2" in a["name"])
assert p2 == 1
assert p1 == 2
assert p1 == 11
def test_reorder_priority_endpoint_scopes_to_current_website(db_session, monkeypatch):
"""手动重排只影响当前网站,不误改同一上游导入到其他网站的账号。"""
from app.routers.websites import reorder_account_priorities
from app.schemas.website import ReorderPriorityRequest
w1 = Website(name="W1", base_url="http://w1", enabled=True,
auth_config_json="{}", timeout_seconds=30)
w2 = Website(name="W2", base_url="http://w2", enabled=True,
auth_config_json="{}", timeout_seconds=30)
u1 = Upstream(name="U1", base_url="http://u1")
db_session.add_all([w1, w2, u1])
db_session.commit()
db_session.refresh(w1); db_session.refresh(w2); db_session.refresh(u1)
_make_snapshot(db_session, u1.id, {"G1": 1.0, "G2": 2.0})
_make_key(db_session, u1.id, "G1", "K1", "V1", w1.id, "W1A1", imported_target_group_id="TG1")
_make_key(db_session, u1.id, "G2", "K2", "V2", w1.id, "W1A2", imported_target_group_id="TG1")
_make_key(db_session, u1.id, "G1", "K3", "V3", w2.id, "W2A1", imported_target_group_id="TG1")
_make_key(db_session, u1.id, "G2", "K4", "V4", w2.id, "W2A2", imported_target_group_id="TG1")
update_calls = []
monkeypatch.setattr(
"app.services.website_sync.Sub2ApiWebsiteClient",
make_mock_client(update_calls),
)
response = reorder_account_priorities(
w1.id,
ReorderPriorityRequest(upstream_id=u1.id),
db_session,
)
updated = {account_id: payload["priority"] for account_id, payload in update_calls}
assert response.success is True
assert updated == {"W1A1": 1, "W1A2": 11}