mail/mail_test.go

94 lines
2.3 KiB
Go
Raw Permalink Normal View History

package mail_test
import (
"context"
"fmt"
"testing"
"time"
"apigo.cc/go/cast"
"apigo.cc/go/file"
"apigo.cc/go/mail"
"apigo.cc/go/safe"
)
func TestMail(t *testing.T) {
// 1. 加载配置
var rawConf map[string]any
err := file.UnmarshalFile("env.yml", &rawConf)
if err != nil {
t.Skip("Failed to load env.yml, skipping real mail test", err)
return
}
mailMap := cast.To[map[string]any](rawConf["mail"])
mboxMap := cast.To[map[string]any](mailMap["mailbox"])
defaultMbox := cast.To[map[string]any](mboxMap["default"])
if defaultMbox == nil {
t.Skip("Default mailbox not configured in env.yml, skipping real mail test")
return
}
// 准备真实的 MailboxConfig
var mboxCfg mail.MailboxConfig
cast.Convert(&mboxCfg, defaultMbox)
// 手动处理 Password因为 YAML 中是字符串
password := cast.String(defaultMbox["password"])
if password != "" {
mboxCfg.Password = safe.NewSafeBuf([]byte(password))
}
mboxCfg.PollInterval = 5 * time.Second
fmt.Printf("Using mailbox: %s\n", mboxCfg.Username)
// 2. 创建 Mailbox 实例
mbox, err := mail.New(&mboxCfg)
if err != nil {
t.Fatalf("Failed to create mailbox: %v", err)
}
// 3. 测试解析地址
name, address, err := mail.ParseAddr("测试工程师 <test@example.com>")
if err != nil {
t.Errorf("ParseAddr failed: %v", err)
}
if name != "测试工程师" || address != "test@example.com" {
t.Errorf("Unexpected address parsing: name=%s, address=%s", name, address)
}
// 4. 测试 Service 模式与回调
received := make(chan mail.Mail, 1)
mbox.On(&mail.RecvOption{Limit: 1}, func(m mail.Mail) {
fmt.Printf("Callback received mail: %s\n", m.Subject)
select {
case received <- m:
default:
}
})
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
err = mbox.Start(ctx, nil)
if err != nil {
t.Fatalf("Failed to start mail service: %v", err)
}
defer func() { _ = mbox.Stop(ctx) }()
select {
case m := <-received:
fmt.Printf("Successfully received mail via service: %s\n", m.Subject)
case <-time.After(20 * time.Second):
t.Log("No mail received via service in 20s (normal if no new mail)")
}
// 5. 测试手动发送 (可选)
/*
err = mbox.Send([]string{mboxCfg.Username}, "Service Test", "Hello from service mode", nil)
if err != nil {
t.Errorf("Send mail failed: %v", err)
}
*/
}