feat(cli): configurable send-as From address (flags, TUI, validation)
- tui.ValidFromAddress: exported validator; blank passes, malformed rejects - Fields.FromAddress: new field, round-trips through ToAccount/FieldsFromAccount - Fields.Validate: calls ValidFromAddress before returning nil - TUI form: from_address fieldDef between username and password - send.go: From set via acc.SendFrom() instead of acc.Username - admin.go account add: --from flag with pre-parse validation - admin.go account edit: --from flag; validate before Visit, apply in Visit - USER-MANUAL.md: --from flag added to account add flags table Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -139,6 +139,32 @@ func TestSendReplyToThreadsHeaders(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestSendUsesConfiguredFromAddress(t *testing.T) {
|
||||
acc := rwAccount()
|
||||
acc.FromAddress = "Steve Cliff <me@stevecliff.com>"
|
||||
d, sent, _ := sendDeps(t, acc, nil)
|
||||
if err := SendCmd(d, "send", []string{"me@stevecliff.com"}, nil, nil, "hi", "body", nil, 0, "INBOX"); err != nil {
|
||||
t.Fatalf("SendCmd: %v", err)
|
||||
}
|
||||
if len(*sent) != 1 {
|
||||
t.Fatalf("want 1 send, got %d", len(*sent))
|
||||
}
|
||||
if got := (*sent)[0].From; got != "Steve Cliff <me@stevecliff.com>" {
|
||||
t.Fatalf("From = %q, want configured from-address", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSendFallsBackToUsernameAsFrom(t *testing.T) {
|
||||
// rwAccount has no FromAddress, so From must be the login username.
|
||||
d, sent, _ := sendDeps(t, rwAccount(), nil)
|
||||
if err := SendCmd(d, "send", []string{"me@stevecliff.com"}, nil, nil, "hi", "body", nil, 0, "INBOX"); err != nil {
|
||||
t.Fatalf("SendCmd: %v", err)
|
||||
}
|
||||
if got := (*sent)[0].From; got != "emcli@stevecliff.com" {
|
||||
t.Fatalf("From = %q, want username fallback", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSendReplyToFilteredSourceNotFound(t *testing.T) {
|
||||
acc := rwAccount()
|
||||
acc.WhitelistInEnabled = true // inbound filter active
|
||||
|
||||
Reference in New Issue
Block a user