Smail/test/backend/verification_mail_log_test.go
smail dd6258c98b
Some checks are pending
Security Checks / security (push) Waiting to run
补齐三类日志的触发操作和结果并完善运行事件展示
2026-09-09 02:48:07 +08:00

77 lines
2.4 KiB
Go

package verification
import (
"context"
"database/sql"
"encoding/json"
"errors"
"path/filepath"
"strings"
"testing"
"git.pcux.cn/xuans/Smail/db/migration"
"git.pcux.cn/xuans/Smail/services/logstore"
_ "modernc.org/sqlite"
)
func TestRelayMailLogRecordsResultWithoutChallengeSecrets(t *testing.T) {
database, err := sql.Open("sqlite", filepath.Join(t.TempDir(), "relay-logs.db"))
if err != nil {
t.Fatal(err)
}
defer database.Close()
database.SetMaxOpenConns(1)
migrations := migration.DefaultMigrations()
for _, statement := range migrations[len(migrations)-1].StatementsFor(migration.DialectSQLite) {
if _, err := database.Exec(statement); err != nil {
t.Fatal(err)
}
}
store, err := logstore.New(database, migration.DialectSQLite)
if err != nil {
t.Fatal(err)
}
runtime := logstore.Start(store)
defer runtime.Stop()
settings := SMTPSettings{Host: "localhost", Port: 25, Security: SecurityPlain, From: "sender@example.com", Username: "private-user", Password: "private-password"}
for _, item := range []struct {
cause error
result string
count int
}{{nil, "accepted", 1}, {errors.New("private-remote-error"), "failure", 0}} {
delivery, err := NewSMTPDelivery(settings)
if err != nil {
t.Fatal(err)
}
var message []byte
delivery.send = func(_ SMTPSettings, _ string, data []byte) error {
message = data
return item.cause
}
err = delivery.Delivery()(Challenge{Email: "private-recipient@example.com", ID: "private-challenge", Purpose: PurposeLogin}, "private-code")
if !errors.Is(err, item.cause) {
t.Fatal("发送结果被改变")
}
for _, value := range message {
if value != 0 {
t.Fatal("验证码邮件缓冲未清理")
}
}
entries, err := store.Query(context.Background(), logstore.Query{Kind: "mail", Limit: 1})
if err != nil || len(entries) != 1 {
t.Fatal("缺少中继发送记录", err)
}
entry := entries[0]
var payload map[string]any
if err := json.Unmarshal(entry.Payload, &payload); err != nil {
t.Fatal(err)
}
if entry.Result != item.result || payload["acceptedCount"] != float64(item.count) || payload["stage"] != "SMTP 中继投递" || payload["trigger"] != "系统安全验证邮件" || payload["outcome"] == "" {
t.Fatalf("中继日志结果不完整:%+v", entry)
}
if strings.Contains(string(entry.Payload), "private-") {
t.Fatal("中继日志包含敏感信息")
}
}
}