package agent import ( "strings" "testing" "ai-operator/internal/dialogue/state" "ai-operator/internal/kb" ) func TestBuildSystemPromptGuardrails(t *testing.T) { p := BuildSystemPrompt(PromptContext{State: state.StateLanguageSelection}) if !strings.Contains(p, "Жанна") || !strings.Contains(p, "QazAimaqGas") || !strings.Contains(p, "Do not block on explicit language selection") { t.Fatalf("language prompt missing guardrails: %s", p) } p = BuildSystemPrompt(PromptContext{State: state.StateReadyToHelp, Language: state.LanguageRU, RegionCode: "almaty_city"}) if !strings.Contains(p, "search_knowledge_base") || !strings.Contains(p, "do not invent") || !strings.Contains(p, "global KB") { t.Fatalf("ready prompt missing KB guardrails: %s", p) } if strings.Contains(strings.ToLower(p), "authorization") || strings.Contains(p, "OPENAI_API_KEY") { t.Fatalf("prompt leaked secret wording: %s", p) } } func TestKnowledgeAnswerUsesKBOnly(t *testing.T) { resp := kb.SearchResponse{OK: true, ReasonCode: "ok", MessageKey: "knowledge.results_found", Results: []kb.SearchResult{{ Title: "Test title", Content: "Краткий ответ: подключение выполняется по заявке.", Language: "ru", SourceURI: "source.docx", Citation: kb.Citation{DocumentTitle: "Test title", SourceURI: "source.docx"}, }}} ru := BuildKnowledgeAnswer(state.LanguageRU, resp) if !strings.Contains(ru, "По информации, которую я вижу") || !strings.Contains(ru, "подключение выполняется") { t.Fatalf("bad ru answer: %s", ru) } kkResp := resp kkResp.CrossLanguageFallbackUsed = true kk := BuildKnowledgeAnswer(state.LanguageKK, kkResp) if !strings.Contains(kk, "Мен көріп тұрған ақпарат бойынша") || !strings.Contains(kk, "подключение выполняется") { t.Fatalf("bad kk fallback answer: %s", kk) } } func TestKnowledgeNoAnswer(t *testing.T) { resp := kb.SearchResponse{OK: false, ReasonCode: "no_relevant_knowledge", MessageKey: "knowledge.no_answer"} if got := BuildKnowledgeAnswer(state.LanguageRU, resp); !strings.Contains(got, "нет точной информации") { t.Fatalf("bad no answer ru: %s", got) } if got := BuildKnowledgeAnswer(state.LanguageKK, resp); !strings.Contains(got, "нақты ақпарат жоқ") { t.Fatalf("bad no answer kk: %s", got) } }