Files
ai-agent/internal/agents/tool/email/summary_test.go
Christoph K. 905981cd1e zwischenstand
2026-03-20 23:24:56 +01:00

118 lines
3.2 KiB
Go

package email
import (
"strings"
"testing"
"time"
"my-brain-importer/internal/config"
)
var testMessages = []Message{
{Subject: "Rechnung März", From: "buchhaltung@firma.de", Date: "2026-03-01 09:00"},
{Subject: "Meeting Einladung", From: "chef@firma.de", Date: "2026-03-02 10:30"},
{Subject: "Newsletter", From: "news@shop.de", Date: "2026-03-03 08:00"},
}
func TestFormatEmailList_ContainsFields(t *testing.T) {
result := formatEmailList(testMessages)
checks := []string{"Rechnung März", "buchhaltung@firma.de", "Meeting Einladung", "Newsletter"}
for _, s := range checks {
if !strings.Contains(result, s) {
t.Errorf("formatEmailList: fehlt %q in:\n%s", s, result)
}
}
}
func TestFormatEmailList_NumberedLines(t *testing.T) {
result := formatEmailList(testMessages)
if !strings.Contains(result, "[1]") {
t.Error("fehlt [1] in Ausgabe")
}
if !strings.Contains(result, "[3]") {
t.Error("fehlt [3] in Ausgabe")
}
}
func TestFormatEmailList_Empty(t *testing.T) {
result := formatEmailList([]Message{})
if result != "" {
t.Errorf("leere Liste sollte leeren String ergeben, got: %q", result)
}
}
func TestFallbackList_ContainsWarning(t *testing.T) {
result := fallbackList(testMessages)
if !strings.Contains(result, "LLM nicht verfügbar") {
t.Errorf("Fallback-Hinweis fehlt: %q", result)
}
}
func TestFallbackList_ContainsAllMessages(t *testing.T) {
result := fallbackList(testMessages)
for _, m := range testMessages {
if !strings.Contains(result, m.Subject) {
t.Errorf("Betreff fehlt: %q", m.Subject)
}
}
}
func TestParseMessages_Empty(t *testing.T) {
result := parseMessages(nil)
if len(result) != 0 {
t.Errorf("erwartet leer, got %d", len(result))
}
}
func TestMessage_DateFormat(t *testing.T) {
// Datum muss im Format "2006-01-02 15:04" formatiert werden
m := testMessages[0]
if _, err := time.Parse("2006-01-02 15:04", m.Date); err != nil {
t.Errorf("Datumsformat ungültig: %v", err)
}
}
func TestAccountLabel_WithName(t *testing.T) {
acc := config.EmailAccount{Name: "Privat", User: "user@example.de"}
if got := accountLabel(acc); got != "Privat" {
t.Errorf("accountLabel: erwartet %q, got %q", "Privat", got)
}
}
func TestAccountLabel_FallsBackToUser(t *testing.T) {
acc := config.EmailAccount{User: "user@example.de"}
if got := accountLabel(acc); got != "user@example.de" {
t.Errorf("accountLabel: erwartet %q, got %q", "user@example.de", got)
}
}
func TestAccountModel_WithModel(t *testing.T) {
acc := config.EmailAccount{Model: "custom-model"}
if got := accountModel(acc); got != "custom-model" {
t.Errorf("accountModel: erwartet %q, got %q", "custom-model", got)
}
}
func TestAccountModel_FallsBackToChatModel(t *testing.T) {
orig := config.Cfg
defer func() { config.Cfg = orig }()
config.Cfg.Chat.Model = "default-model"
acc := config.EmailAccount{} // kein Model gesetzt
if got := accountModel(acc); got != "default-model" {
t.Errorf("accountModel: erwartet chat.model %q, got %q", "default-model", got)
}
}
func TestSummarizeUnread_NoAccountsConfigured(t *testing.T) {
orig := config.Cfg
defer func() { config.Cfg = orig }()
config.Cfg = config.Config{} // leere Config, kein Email-Account
_, err := SummarizeUnread()
if err == nil {
t.Error("erwartet Fehler wenn kein Account konfiguriert")
}
}