Files
MujicaUI/chat/conversation_export_test.go
T

98 lines
3.1 KiB
Go

package chat
import (
"encoding/json"
"strings"
"testing"
"github.com/egoist/mygo/ui"
"git.zacharyzhang.com/ZacharyZhang-NY/MujicaUI/core"
)
func TestExportConversationFormats(t *testing.T) {
msgs := chatMessages()
md := ExportConversation("Banquet", msgs, ExportMarkdown)
want := "# Banquet\n\n**User** · (2026-10-05 15:20)\n\nHow should guests be seated at the banquet?\n"
if !strings.HasPrefix(md, want) || !strings.Contains(md, "**Lady Ann**") {
t.Fatalf("markdown %q", md)
}
var doc struct {
Title string
Messages []struct{ Role, Author, Text, Time string }
}
if err := json.Unmarshal([]byte(ExportConversation("Banquet", msgs, ExportJSON)), &doc); err != nil {
t.Fatal(err)
}
if doc.Title != "Banquet" || len(doc.Messages) != 3 || doc.Messages[1].Role != "assistant" || doc.Messages[2].Author != "Lady Ann" ||
doc.Messages[0].Time != "2026-10-05T15:20:00Z" {
t.Fatalf("json %+v", doc)
}
txt := ExportConversation("Banquet", msgs[:1], ExportText)
if txt != "Banquet\n\nUser (2026-10-05 15:20):\nHow should guests be seated at the banquet?\n" {
t.Fatalf("text %q", txt)
}
if got := ExportConversation("Empty", nil, ExportJSON); !strings.Contains(got, `"messages": []`) {
t.Fatalf("empty json %q", got)
}
}
func TestConversationExportRangeAndExport(t *testing.T) {
var s ConversationExportState
var last ConversationExportView
selected := []int{2}
tt := chatTester(560, 600, func(c *ui.Context) {
if v := ConversationExport(c, &s, chatMessages(), ConversationExportOptions{Title: "Banquet", Selected: selected}); v.Exported {
last = v
}
})
_ = tt.Click("JSON")
_ = tt.Click("Selected (1)")
_ = tt.Click("Export")
if !last.Exported || last.Format != ExportJSON || !strings.Contains(last.Content, "And the musicians?") ||
strings.Contains(last.Content, "banquet?") {
t.Fatalf("export %+v", last)
}
_ = tt.Click("Plain text")
_ = tt.Click("Last")
s.Last = 2
tt.Frame()
_ = tt.Click("Export")
if last.Format != ExportText || strings.Contains(last.Content, "banquet?") || !strings.Contains(last.Content, "Seat by rank") {
t.Fatalf("last-2 export %q", last.Content)
}
}
func TestConversationExportDisabledAndChecks(t *testing.T) {
var s ConversationExportState
exported := false
tt := chatTester(560, 600, func(c *ui.Context) {
if ConversationExport(c, &s, chatMessages(), ConversationExportOptions{Title: "T", Disabled: true}).Exported {
exported = true
}
})
_ = tt.Click("JSON")
_ = tt.Click("Export")
if exported || s.Format != ExportMarkdown {
t.Fatalf("disabled export acted: %v %v", exported, s.Format)
}
defer func() {
if recover() == nil {
t.Fatal("no panic for a bad selection")
}
}()
ui.Render(func(c *ui.Context) {
core.Use(c, core.Settings{})
ConversationExport(c, &s, chatMessages(), ConversationExportOptions{Title: "T", Selected: []int{9}})
}, 100, 100, 1)
}
func TestConversationExportSnapshot(t *testing.T) {
snapshot(t, "conversation_export", 560, 470, func(c *ui.Context) {
s := &ConversationExportState{}
ui.Column(c).Padding(16).Children(func() {
ConversationExport(c, s, chatMessages(), ConversationExportOptions{Title: "Banquet seating", Selected: []int{0, 2}})
})
})
}