feat: sync upstream keys and reorder priorities
This commit is contained in:
@@ -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=NULL:fallback 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=1;A2(G2, rate=2.0) → priority=2
|
||||
# A1(G1, rate=1.0) → priority=1;A2(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 1;G1 rate=2.0 → priority 2
|
||||
# G2 rate=1.0 → priority 1;G1 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}
|
||||
|
||||
Reference in New Issue
Block a user