fix: 作废投递走统一终态函数并写回执收尾

This commit is contained in:
Nixevol
2026-09-30 14:58:58 +08:00
parent 4059a1576b
commit ac90495137
10 changed files with 365 additions and 166 deletions
+59
View File
@@ -461,3 +461,62 @@ func TestGroupTransferRenameListGet(t *testing.T) {
}
}
}
func TestLeaveLastPendingFinalizesAndReceipt(t *testing.T) {
t.Parallel()
gApp, _, msgApp, db, _ := setup(t)
ctx := context.Background()
insertEP(t, db, "alice", 1)
insertEP(t, db, "bob", 1)
created, err := gApp.Create(ctx, "alice", &protocol.GroupCreate{
V: protocol.Version, Type: protocol.TypeGroupCreate, RID: "1",
Name: "OnlyBob", Members: []protocol.GroupMemberIn{{ID: "bob"}},
})
if err != nil {
t.Fatal(err)
}
ttl := int64(3600)
_, err = msgApp.Submit(ctx, "alice", port.ConnInfo{}, &protocol.Send{
V: protocol.Version, Type: protocol.TypeSend, RID: "s", ID: "keep1",
To: protocol.Target{Kind: protocol.TargetGroup, ID: created.ID},
Body: protocol.Body{Enc: protocol.EncUTF8, Data: "hi"},
Offline: &protocol.OfflineOpts{Keep: true, TTLSeconds: &ttl},
})
if err != nil {
t.Fatal(err)
}
if err = gApp.Leave(ctx, "bob", &protocol.GroupLeave{
V: protocol.Version, Type: protocol.TypeGroupLeave, RID: "2", GroupID: created.ID,
}); err != nil {
t.Fatal(err)
}
var state, reason string
if err = db.Read.QueryRow(`SELECT state, reason FROM messages WHERE id='keep1'`).Scan(&state, &reason); err != nil {
t.Fatal(err)
}
if state != message.StateCompleted {
t.Fatalf("state=%s want completed", state)
}
var bodies int
if err = db.Read.QueryRow(`SELECT COUNT(*) FROM message_bodies b JOIN messages m ON m.seq=b.seq WHERE m.id='keep1'`).Scan(&bodies); err != nil {
t.Fatal(err)
}
if bodies != 0 {
t.Fatalf("body still present: %d", bodies)
}
var rState, rReason, rEP string
if err = db.Read.QueryRow(`
SELECT state, reason, endpoint_id FROM receipts WHERE sender_id='alice' AND msg_id='keep1'`).Scan(&rState, &rReason, &rEP); err != nil {
t.Fatalf("receipt: %v", err)
}
if rState != "rejected" || rReason != "left_group" || rEP != "bob" {
t.Fatalf("receipt state=%q reason=%q ep=%q", rState, rReason, rEP)
}
var pending int
if err = db.Read.QueryRow(`SELECT COUNT(*) FROM messages WHERE sender_id='alice' AND state IN ('scheduled','dispatched')`).Scan(&pending); err != nil {
t.Fatal(err)
}
if pending != 0 {
t.Fatalf("sender pending count=%d", pending)
}
}