Files
ai-customer-service/internal/domain/error/cserrors/codes_test.go
Your Name 06eeb5776b
Some checks failed
CI / verify (push) Failing after 24s
style(go): apply gofmt to repository
2026-05-06 12:22:41 +08:00

146 lines
3.9 KiB
Go

package cserrors
import (
"strings"
"testing"
)
func TestCS_TKT_4002_And_CS_TICKET_4091_Alias(t *testing.T) {
if CS_TKT_4002 != CS_TICKET_4091 {
t.Errorf("CS_TKT_4002 (%q) != CS_TICKET_4091 (%q)", CS_TKT_4002, CS_TICKET_4091)
}
}
func TestErrorMsg_AllCodes(t *testing.T) {
codes := []string{
// Session
CS_SES_4001,
CS_SES_4002,
CS_SES_4003,
// Identity
CS_IDT_4001,
CS_IDT_4002,
// Ticket
CS_TICKET_4001,
CS_TICKET_4002,
CS_TKT_4002,
CS_TICKET_4091,
CS_TICKET_4092,
CS_TICKET_4093,
// Knowledge-base
CS_KB_4001,
CS_KB_4002,
// LLM
CS_LLM_5001,
CS_LLM_5002,
// Auth
CS_AUTH_4001,
CS_AUTH_4031,
CS_AUTH_4032,
CS_AUTH_4033,
CS_AUTH_4034,
// HTTP/Request
CS_HTTP_405,
CS_REQ_4001,
CS_REQ_4131,
CS_REQ_4002,
CS_REQ_4003,
CS_REQ_4004,
CS_REQ_4008,
CS_REQ_4005,
CS_REQ_4006,
CS_REQ_4007,
CS_REQ_4009,
CS_REQ_4010,
// System
CS_SYS_5001,
CS_SYS_5002,
}
for _, code := range codes {
msg := ErrorMsg(code)
if strings.TrimSpace(msg) == "" {
t.Errorf("ErrorMsg(%q) returned empty string", code)
}
// For known codes (not default), message should be different from code
if msg == code && strings.HasPrefix(code, "CS_") {
t.Logf("Warning: ErrorMsg(%q) returned same value as code (default case?)", code)
}
}
}
func TestErrorMsg_UnknownCode(t *testing.T) {
msg := ErrorMsg("CS_UNKNOWN_9999")
// Default case returns the code itself
if msg != "CS_UNKNOWN_9999" {
t.Errorf("ErrorMsg for unknown code: expected %q, got %q", "CS_UNKNOWN_9999", msg)
}
}
func TestErrorMsg_SpecificCodes(t *testing.T) {
tests := []struct {
code string
expectedMsg string
}{
{CS_SES_4001, "session not found"},
{CS_SES_4002, "message rate limit exceeded"},
{CS_TICKET_4002, "ticket already assigned"},
{CS_TKT_4002, "ticket already assigned"}, // same as CS_TICKET_4002
{CS_KB_4001, "knowledge-base entry not found"},
{CS_LLM_5001, "LLM service unavailable"},
{CS_AUTH_4034, "invalid webhook signature"},
}
for _, tt := range tests {
msg := ErrorMsg(tt.code)
if msg != tt.expectedMsg {
t.Errorf("ErrorMsg(%q): expected %q, got %q", tt.code, tt.expectedMsg, msg)
}
}
}
func TestErrorMsg_AllKnownCodesReturnNonEmpty(t *testing.T) {
// Verify all codes defined in the switch have non-empty messages
knownCodes := map[string]string{
CS_SES_4001: "session not found",
CS_SES_4002: "message rate limit exceeded",
CS_SES_4003: "identity verification locked",
CS_IDT_4001: "identity information mismatch",
CS_IDT_4002: "verification code incorrect",
CS_TICKET_4001: "ticket not found",
CS_TICKET_4002: "ticket already assigned",
CS_TICKET_4092: "ticket resolve conflict",
CS_TICKET_4093: "ticket close conflict",
CS_KB_4001: "knowledge-base entry not found",
CS_KB_4002: "entry name already exists",
CS_LLM_5001: "LLM service unavailable",
CS_LLM_5002: "LLM request timeout",
CS_AUTH_4001: "access denied",
CS_AUTH_4031: "missing webhook signature",
CS_AUTH_4032: "invalid webhook timestamp",
CS_AUTH_4033: "stale webhook request",
CS_AUTH_4034: "invalid webhook signature",
CS_HTTP_405: "method not allowed",
CS_REQ_4001: "invalid JSON",
CS_REQ_4131: "request body too large",
CS_REQ_4002: "channel, open_id and content are required",
CS_REQ_4003: "content exceeds maximum length",
CS_REQ_4004: "unable to read request body",
CS_REQ_4008: "channel is required",
CS_REQ_4005: "ticket_id and agent_id are required",
CS_REQ_4006: "ticket_id and resolution are required",
CS_REQ_4007: "ticket_id and resolution are required",
CS_REQ_4009: "feedback score must be between 1 and 5",
CS_REQ_4010: "handoff reason is required",
CS_SYS_5001: "internal server error",
CS_SYS_5002: "list tickets failed",
}
for code, expectedMsg := range knownCodes {
msg := ErrorMsg(code)
if msg != expectedMsg {
t.Errorf("ErrorMsg(%q): expected %q, got %q", code, expectedMsg, msg)
}
}
}