Phase 5 follow-up: discover the \Sent mailbox; record the approved real send (AUD-71)
The approved real test reply was sent and the thread updated (same X-GM-THRID as the original). The live test exposed one bug: the thread check hardcoded Gmail's sent mailbox as "[Gmail]/Sent Mail", but this account exposes it as "[Google Mail]/Sent Mail". - internal/mailfetch: LIST parser, ListMailboxes, and SentMailbox that finds the mailbox flagged \Sent (RFC 6154) with name fallbacks. - internal/mailops: VerifyThreadUpdated selects the discovered \Sent mailbox instead of a hardcoded name. - cmd/email-agent: -check-thread <id> exercises the check against real Gmail without sending mail. - Tests for LIST parsing, sent-mailbox discovery, and the discovery error path. - docs/phase5-replies.md: record send-as verification, the sent reply's thread id, the app confirmation (sent_reply_in_thread=true), and the fix. Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
@@ -2,6 +2,7 @@ package mailops
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"net"
|
||||
"strings"
|
||||
"testing"
|
||||
@@ -113,14 +114,34 @@ func TestVerifyThreadUpdatedSearchesSentMailbox(t *testing.T) {
|
||||
if !ok {
|
||||
t.Error("VerifyThreadUpdated() = false, want true when the thread has a sent message")
|
||||
}
|
||||
if fc.selected != LabelSent {
|
||||
t.Errorf("selected = %q, want %q", fc.selected, LabelSent)
|
||||
if fc.selected != "[Google Mail]/Sent Mail" {
|
||||
t.Errorf("selected = %q, want the discovered sent mailbox", fc.selected)
|
||||
}
|
||||
if len(fc.searched) != 1 || fc.searched[0] != "thrid:987654321" {
|
||||
t.Errorf("searched = %v, want [thrid:987654321]", fc.searched)
|
||||
}
|
||||
}
|
||||
|
||||
func TestVerifyThreadUpdatedUsesDiscoveredSentMailbox(t *testing.T) {
|
||||
fc := &fakeConn{uidValidity: 3, searchUIDs: []uint32{5}, sentMailbox: "[Gmail]/Sent Mail"}
|
||||
c := newFakeClient(fc)
|
||||
ok, err := c.VerifyThreadUpdated(context.Background(), "77")
|
||||
if err != nil || !ok {
|
||||
t.Fatalf("VerifyThreadUpdated() ok=%v err=%v", ok, err)
|
||||
}
|
||||
if fc.selected != "[Gmail]/Sent Mail" {
|
||||
t.Errorf("selected = %q, want the configured sent mailbox", fc.selected)
|
||||
}
|
||||
}
|
||||
|
||||
func TestVerifyThreadUpdatedSentMailboxError(t *testing.T) {
|
||||
fc := &fakeConn{sentErr: errors.New("no sent mailbox")}
|
||||
c := newFakeClient(fc)
|
||||
if _, err := c.VerifyThreadUpdated(context.Background(), "77"); err == nil {
|
||||
t.Fatal("VerifyThreadUpdated() error = nil, want a sent-mailbox discovery error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestVerifyThreadUpdatedEmptyThread(t *testing.T) {
|
||||
c := newFakeClient(&fakeConn{searchUIDs: nil})
|
||||
if _, err := c.VerifyThreadUpdated(context.Background(), ""); err == nil {
|
||||
|
||||
Reference in New Issue
Block a user