Files
ai-agent/internal/builders/ticket_builder_test.go
T
mlogclub 5d7c10aeab refactor: rename agent widget references to AI agent for consistency
- Updated runtime configuration to use __CS_AI_AGENT_WIDGET_CONFIG__ instead of __CS_AGENT_WIDGET_CONFIG__.
- Changed message types in support host bridge from "cs-agent" to "cs-ai-agent".
- Minified SDK script updated to reflect new AI agent naming conventions.
- Adjusted scrollbar styles in main.scss to use .cs-ai-agent-scrollbar instead of .cs-agent-scrollbar.
2026-05-30 21:19:36 +08:00

123 lines
3.4 KiB
Go

package builders
import (
"testing"
"time"
"cs-ai-agent/internal/models"
"cs-ai-agent/internal/pkg/enums"
)
func TestBuildLightweightTicket(t *testing.T) {
now := time.Date(2026, 5, 2, 12, 30, 0, 0, time.Local)
ticket := &models.Ticket{
ID: 12,
TicketNo: "TK202605020001",
Title: "登录失败",
Description: "客户反馈无法登录",
Source: enums.TicketSourceManual,
Channel: "web",
CustomerID: 3,
ConversationID: 4,
Status: enums.TicketStatusPending,
CurrentAssigneeID: 5,
AuditFields: models.AuditFields{
CreateUserID: 1,
CreateUserName: "admin",
CreatedAt: now,
UpdatedAt: now,
},
}
ctx := &TicketBuildContext{
TagsByTicketID: map[int64][]models.Tag{
12: {{ID: 8, Name: "登录", Status: enums.StatusOk}},
},
Users: map[int64]*models.User{
5: {ID: 5, Username: "agent", Nickname: "客服"},
},
Customers: map[int64]*models.Customer{
3: {ID: 3, Name: "客户"},
},
}
out := BuildTicketWithContext(ticket, ctx)
if out == nil {
t.Fatalf("expected ticket response")
}
if out.ID != ticket.ID || out.TicketNo != ticket.TicketNo || out.Status != ticket.Status {
t.Fatalf("unexpected ticket response: %+v", out)
}
if out.CurrentAssigneeName != "客服" {
t.Fatalf("expected assignee name, got %q", out.CurrentAssigneeName)
}
if len(out.Tags) != 1 || out.Tags[0].ID != 8 {
t.Fatalf("expected tag response, got %+v", out.Tags)
}
if out.Customer == nil || out.Customer.ID != 3 {
t.Fatalf("expected customer response, got %+v", out.Customer)
}
}
func TestBuildTicketWithoutContextLeavesOptionalLookupsEmpty(t *testing.T) {
now := time.Date(2026, 5, 2, 12, 30, 0, 0, time.Local)
ticket := &models.Ticket{
ID: 12,
TicketNo: "TK202605020001",
Title: "登录失败",
Description: "客户反馈无法登录",
CustomerID: 3,
CurrentAssigneeID: 5,
Status: enums.TicketStatusPending,
AuditFields: models.AuditFields{
CreateUserID: 1,
CreateUserName: "admin",
CreatedAt: now,
UpdatedAt: now,
},
}
out := BuildTicket(ticket)
if out == nil {
t.Fatalf("expected ticket response")
}
if out.Tags != nil {
t.Fatalf("expected tags to stay empty without context, got %+v", out.Tags)
}
if out.Customer != nil {
t.Fatalf("expected customer to stay empty without context, got %+v", out.Customer)
}
if out.CurrentAssigneeName != "" {
t.Fatalf("expected assignee name to stay empty without context, got %q", out.CurrentAssigneeName)
}
}
func TestBuildTicketProgress(t *testing.T) {
now := time.Date(2026, 5, 2, 12, 30, 0, 0, time.Local)
progress := &models.TicketProgress{
ID: 1,
TicketID: 2,
Content: "已联系客户",
AuthorID: 3,
CreatedAt: now,
}
ctx := &TicketDetailBuildContext{
Users: map[int64]*models.User{
3: {ID: 3, Username: "agent", Nickname: "客服"},
},
}
out := BuildTicketProgressWithContext(progress, ctx)
if out == nil {
t.Fatalf("expected progress response")
}
if out.ID != progress.ID || out.TicketID != progress.TicketID || out.Content != progress.Content {
t.Fatalf("unexpected progress response: %+v", out)
}
if out.AuthorName != "客服" {
t.Fatalf("expected author name, got %q", out.AuthorName)
}
if out.CreatedAt == "" {
t.Fatalf("expected createdAt to be formatted")
}
}