feat(api): sessions加is_del过滤+filehelper置顶标记,accounts加avatar(raw_json提取)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -293,3 +293,45 @@ async def test_accounts_pagination(make_client):
|
||||
b2 = r2.json()
|
||||
assert len(b2["items"]) == 1
|
||||
assert b2["items"][0]["account_id"] == "wa_c@s.whatsapp.net"
|
||||
|
||||
|
||||
async def test_accounts_avatar_from_raw_json(make_client):
|
||||
"""``avatar`` 从 raw_json.headImageUrl 提取(对齐云客员工聊天窗口左侧头像)。
|
||||
|
||||
WeChat wxUser/list 原始记录带 ``headImageUrl``;WhatsApp businessSalesList
|
||||
原始记录无该键(抓包确认,见 wa_accounts_fixture) -> None。NULL raw_json
|
||||
同样 -> None。
|
||||
"""
|
||||
|
||||
async def seed(s: AsyncSession) -> None:
|
||||
s.add_all(
|
||||
[
|
||||
WechatAccount(
|
||||
wx_id="wx_av",
|
||||
nick_name="WxAv",
|
||||
raw_json={
|
||||
"wechatId": "wx_av",
|
||||
"headImageUrl": "https://wx.qlogo.cn/a/0",
|
||||
},
|
||||
),
|
||||
WechatAccount(wx_id="wx_noav", nick_name="WxNoAv", raw_json=None),
|
||||
WhatsappAccount(
|
||||
uid="wa_av@s.whatsapp.net",
|
||||
nick_name="WaAv",
|
||||
raw_json={"uid": "wa_av@s.whatsapp.net", "nickName": "WaAv"},
|
||||
),
|
||||
]
|
||||
)
|
||||
await s.commit()
|
||||
|
||||
client = await make_client(seed)
|
||||
|
||||
r = await client.get("/api/accounts", params={"channel": "wechat"})
|
||||
assert r.status_code == 200
|
||||
by_id = {it["account_id"]: it for it in r.json()["items"]}
|
||||
assert by_id["wx_av"]["avatar"] == "https://wx.qlogo.cn/a/0"
|
||||
assert by_id["wx_noav"]["avatar"] is None # NULL raw_json
|
||||
|
||||
r2 = await client.get("/api/accounts", params={"channel": "whatsapp"})
|
||||
assert r2.status_code == 200
|
||||
assert r2.json()["items"][0]["avatar"] is None # WA raw 无头像键
|
||||
|
||||
@@ -59,3 +59,65 @@ async def test_sessions_empty(make_client):
|
||||
r = await client.get("/api/sessions", params={"owner_account_id": OWNER})
|
||||
assert r.status_code == 200
|
||||
assert r.json()["sessions"] == []
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# is_del filter + pinned flag (2026-08-25 对齐云客员工聊天窗口)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def _msg(msg_id: str, talker: str, ts: int = 1) -> Message:
|
||||
return Message(
|
||||
msg_id=msg_id, channel=CH, owner_account_id=OWNER,
|
||||
talker_id=talker, room_id=None, timestamp=ts,
|
||||
)
|
||||
|
||||
|
||||
async def test_sessions_is_del_filter(make_client):
|
||||
"""``is_del`` 过滤:delete_flag 1=已删好友;NULL/0=未删;无 customer 行保留。
|
||||
|
||||
云客员工聊天窗口「删除好友」开关映射 customer.delete_flag;无 customer
|
||||
行的 talker(如从未入库的系统账号)视作未删,两个方向都保留。
|
||||
"""
|
||||
|
||||
async def seed(s: AsyncSession):
|
||||
s.add_all([
|
||||
Customer(friend_id="f1", channel=CH, owner_account_id=OWNER, delete_flag=0),
|
||||
Customer(friend_id="f2", channel=CH, owner_account_id=OWNER, delete_flag=1),
|
||||
Customer(friend_id="filehelper", channel=CH, owner_account_id=OWNER, delete_flag=None),
|
||||
_msg("m1", "f1", 1),
|
||||
_msg("m2", "f2", 2),
|
||||
_msg("m3", "filehelper", 3),
|
||||
_msg("m4", "gh0st", 4), # 无 customer 行的 talker
|
||||
])
|
||||
await s.commit()
|
||||
|
||||
client = await make_client(seed)
|
||||
live = await client.get("/api/sessions", params={"owner_account_id": OWNER, "channel": CH, "is_del": 0})
|
||||
deleted = await client.get("/api/sessions", params={"owner_account_id": OWNER, "channel": CH, "is_del": 1})
|
||||
assert live.status_code == 200 and deleted.status_code == 200
|
||||
# NULL 视为未删;无 customer 行的 talker 保留
|
||||
assert sorted(s["talker_id"] for s in live.json()["sessions"]) == ["f1", "filehelper", "gh0st"]
|
||||
assert [s["talker_id"] for s in deleted.json()["sessions"]] == ["f2"]
|
||||
|
||||
|
||||
async def test_sessions_pinned_filehelper(make_client):
|
||||
"""filehelper 会话 pinned=True(对齐云客置顶区),普通好友/群 False。"""
|
||||
|
||||
async def seed(s: AsyncSession):
|
||||
s.add_all([
|
||||
Customer(friend_id="f1", channel=CH, owner_account_id=OWNER, delete_flag=0),
|
||||
ChatGroup(room_id="room1@chatroom", channel=CH, owner_account_id=OWNER, room_name="群一号"),
|
||||
_msg("p1", "f1", 1),
|
||||
_msg("p2", "filehelper", 2),
|
||||
Message(msg_id="p3", channel=CH, owner_account_id=OWNER, talker_id="mx", room_id="room1@chatroom", timestamp=3),
|
||||
])
|
||||
await s.commit()
|
||||
|
||||
client = await make_client(seed)
|
||||
r = await client.get("/api/sessions", params={"owner_account_id": OWNER, "channel": CH})
|
||||
assert r.status_code == 200
|
||||
by = {s.get("talker_id") or s.get("room_id"): s for s in r.json()["sessions"]}
|
||||
assert by["filehelper"]["pinned"] is True
|
||||
assert by["f1"]["pinned"] is False
|
||||
assert by["room1@chatroom"]["pinned"] is False
|
||||
|
||||
Reference in New Issue
Block a user