Skip to content

Commit 678af46

Browse files
committed
remove que from ignore
1 parent 37c78f4 commit 678af46

File tree

4 files changed

+425
-1
lines changed

4 files changed

+425
-1
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*.dll
55
*.so
66
*.dylib
7-
que
87
que.exe
98

109
# Test binary, built with `go test -c`

cmd/que/e2e_test.go

Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
package main
2+
3+
import (
4+
"encoding/json"
5+
"strings"
6+
"testing"
7+
8+
"github.com/jenian/que/internal/config"
9+
"github.com/jenian/que/internal/enricher"
10+
"github.com/jenian/que/internal/ingestor"
11+
"github.com/jenian/que/internal/sanitizer"
12+
)
13+
14+
// TestE2E_NoProblem tests the full pipeline when no problem is detected
15+
func TestE2E_NoProblem(t *testing.T) {
16+
// Setup: Create a simple log with no errors
17+
logInput := "2024-01-15 10:00:00 INFO Application started successfully\n2024-01-15 10:00:01 INFO Server listening on port 8080"
18+
19+
// Test the pipeline components
20+
reader := strings.NewReader(logInput)
21+
rawLog, err := ingestor.IngestFromReader(reader)
22+
if err != nil {
23+
t.Fatalf("Failed to ingest: %v", err)
24+
}
25+
26+
ctx := enricher.Enrich()
27+
redactor := sanitizer.NewRedactor()
28+
sanitizedLog, _ := redactor.Redact(rawLog)
29+
30+
// Verify sanitization worked
31+
if sanitizedLog != rawLog {
32+
t.Logf("Log was sanitized (expected for this test)")
33+
}
34+
35+
// Verify we got the log
36+
if !strings.Contains(rawLog, "Application started") {
37+
t.Error("Expected log content not found")
38+
}
39+
40+
// Verify context was gathered
41+
if ctx.OS == "" {
42+
t.Error("Expected OS to be set in context")
43+
}
44+
}
45+
46+
// TestE2E_WithSecrets tests the full pipeline with secrets that should be redacted
47+
func TestE2E_WithSecrets(t *testing.T) {
48+
// Setup: Create a log with a GitHub token (gitleaks will detect this)
49+
logInput := "GITHUB_TOKEN=ghp_123456789012345678901234567890123456\nError: Authentication failed"
50+
51+
redactor := sanitizer.NewRedactor()
52+
sanitizedLog, count := redactor.Redact(logInput)
53+
54+
// Verify secrets were detected and redacted
55+
if count == 0 {
56+
t.Log("No secrets detected (may depend on gitleaks patterns)")
57+
} else {
58+
// If secrets were found, they should be redacted
59+
if strings.Contains(sanitizedLog, "ghp_123456789012345678901234567890123456") {
60+
t.Error("Secret should be redacted but found in output")
61+
}
62+
if !strings.Contains(sanitizedLog, "REDACTED") {
63+
t.Log("Redaction placeholder not found (may use different format)")
64+
}
65+
}
66+
}
67+
68+
// TestE2E_LLMResponseFormats tests different LLM response formats
69+
func TestE2E_LLMResponseFormats(t *testing.T) {
70+
testCases := []struct {
71+
name string
72+
response string
73+
validate func(t *testing.T, result string)
74+
}{
75+
{
76+
name: "no_problem_status",
77+
response: func() string {
78+
resp := config.LLMResponse{
79+
Status: "no_problem",
80+
RootCause: "",
81+
Evidence: "",
82+
Fix: "",
83+
}
84+
jsonData, _ := json.Marshal(resp)
85+
return string(jsonData)
86+
}(),
87+
validate: func(t *testing.T, result string) {
88+
if !strings.Contains(result, "no problems detected") {
89+
t.Error("Should contain 'no problems detected' message")
90+
}
91+
},
92+
},
93+
{
94+
name: "insufficient_data_status",
95+
response: func() string {
96+
resp := config.LLMResponse{
97+
Status: "insufficient_data",
98+
RootCause: "Some error",
99+
Evidence: config.EvidenceString("Error log line 1\nError log line 2"),
100+
Fix: "",
101+
}
102+
jsonData, _ := json.Marshal(resp)
103+
return string(jsonData)
104+
}(),
105+
validate: func(t *testing.T, result string) {
106+
if !strings.Contains(result, "Evidence") {
107+
t.Error("Should contain Evidence section")
108+
}
109+
if !strings.Contains(result, "insufficient data") {
110+
t.Error("Should contain insufficient data warning")
111+
}
112+
if strings.Contains(result, "Fix") {
113+
t.Error("Should NOT contain Fix section")
114+
}
115+
},
116+
},
117+
{
118+
name: "problem_detected_full",
119+
response: func() string {
120+
resp := config.LLMResponse{
121+
Status: "problem_detected",
122+
RootCause: "Invalid API key",
123+
Evidence: config.EvidenceString("401 Unauthorized"),
124+
Fix: "export API_KEY='valid_key'",
125+
}
126+
jsonData, _ := json.Marshal(resp)
127+
return string(jsonData)
128+
}(),
129+
validate: func(t *testing.T, result string) {
130+
if !strings.Contains(result, "Root Cause") {
131+
t.Error("Should contain Root Cause section")
132+
}
133+
if !strings.Contains(result, "Evidence") {
134+
t.Error("Should contain Evidence section")
135+
}
136+
if !strings.Contains(result, "Fix") {
137+
t.Error("Should contain Fix section")
138+
}
139+
},
140+
},
141+
{
142+
name: "evidence_as_array",
143+
response: func() string {
144+
// Test evidence as array
145+
resp := map[string]interface{}{
146+
"status": "problem_detected",
147+
"root_cause": "Test error",
148+
"evidence": []string{"Line 1", "Line 2", "Line 3"},
149+
"fix": "Test fix",
150+
}
151+
jsonData, _ := json.Marshal(resp)
152+
return string(jsonData)
153+
}(),
154+
validate: func(t *testing.T, result string) {
155+
if !strings.Contains(result, "Line 1") {
156+
t.Error("Should contain first evidence line")
157+
}
158+
if !strings.Contains(result, "Line 2") {
159+
t.Error("Should contain second evidence line")
160+
}
161+
},
162+
},
163+
}
164+
165+
for _, tc := range testCases {
166+
t.Run(tc.name, func(t *testing.T) {
167+
// Import the parseAndFormatResponse function from advisor package
168+
// Since it's not exported, we'll test through the advisor.Advise function
169+
// But for unit testing, we can test the JSON parsing directly
170+
var llmResp config.LLMResponse
171+
err := json.Unmarshal([]byte(tc.response), &llmResp)
172+
if err != nil {
173+
t.Fatalf("Failed to parse JSON: %v", err)
174+
}
175+
176+
// Verify the response was parsed correctly
177+
if tc.name == "no_problem_status" && llmResp.Status != "no_problem" {
178+
t.Error("Status should be 'no_problem'")
179+
}
180+
if tc.name == "insufficient_data_status" && llmResp.Status != "insufficient_data" {
181+
t.Error("Status should be 'insufficient_data'")
182+
}
183+
if tc.name == "problem_detected_full" && llmResp.Status != "problem_detected" {
184+
t.Error("Status should be 'problem_detected'")
185+
}
186+
})
187+
}
188+
}
189+
190+
// TestE2E_PipelineFlow tests the complete pipeline flow
191+
func TestE2E_PipelineFlow(t *testing.T) {
192+
// Create test log
193+
testLog := `2024-01-15 14:32:11 ERROR Database connection failed
194+
Unable to connect to PostgreSQL database
195+
Connection string: postgresql://user:password@localhost:5432/mydb`
196+
197+
// Step 1: Ingest
198+
reader := strings.NewReader(testLog)
199+
rawLog, err := ingestor.IngestFromReader(reader)
200+
if err != nil {
201+
t.Fatalf("Ingestion failed: %v", err)
202+
}
203+
if rawLog == "" {
204+
t.Error("Expected non-empty log")
205+
}
206+
207+
// Step 2: Enrich
208+
ctx := enricher.Enrich()
209+
if ctx.OS == "" {
210+
t.Error("Expected OS to be set")
211+
}
212+
if ctx.Timestamp.IsZero() {
213+
t.Error("Expected timestamp to be set")
214+
}
215+
216+
// Step 3: Sanitize
217+
redactor := sanitizer.NewRedactor()
218+
sanitizedLog, count := redactor.Redact(rawLog)
219+
220+
// Verify sanitization
221+
if count > 0 {
222+
// If secrets were found, verify they're redacted
223+
if strings.Contains(sanitizedLog, "password") && !strings.Contains(sanitizedLog, "REDACTED") {
224+
t.Log("Password found but may not be detected by gitleaks patterns")
225+
}
226+
}
227+
228+
// Step 4: Create payload
229+
payload := config.QueryPayload{
230+
RawLog: rawLog,
231+
SanitizedLog: sanitizedLog,
232+
SystemContext: ctx,
233+
}
234+
235+
// Verify payload
236+
if payload.RawLog == "" {
237+
t.Error("Payload should have raw log")
238+
}
239+
if payload.SanitizedLog == "" {
240+
t.Error("Payload should have sanitized log")
241+
}
242+
if payload.SystemContext.OS == "" {
243+
t.Error("Payload should have system context")
244+
}
245+
}
246+
247+

0 commit comments

Comments
 (0)