Monorepo for Tangled — https://tangled.org
at spindle-log-err 130 lines 4.0 kB view raw
1package models 2 3import ( 4 "bufio" 5 "encoding/json" 6 "errors" 7 "os" 8 "path/filepath" 9 "testing" 10 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13) 14 15func TestParseSetupError(t *testing.T) { 16 tests := []struct { 17 name string 18 err error 19 expected string 20 }{ 21 { 22 name: "valid nixery error", 23 err: errors.New(`Error response from daemon: unknown: {"errors":[{"code":"MANIFEST_UNKNOWN","message":"Could not find Nix packages: [gopher123]"}]}`), 24 expected: "Could not find Nix packages: [gopher123]", 25 }, 26 { 27 name: "multiple errors returns first", 28 err: errors.New(`Error response from daemon: unknown: {"errors":[{"code":"A","message":"first error"},{"code":"B","message":"second error"}]}`), 29 expected: "first error", 30 }, 31 { 32 name: "no unknown marker fallback", 33 err: errors.New("some other docker error"), 34 expected: "some other docker error", 35 }, 36 { 37 name: "malformed JSON fallback", 38 err: errors.New(`Error response from daemon: unknown: {invalid json}`), 39 expected: `Error response from daemon: unknown: {invalid json}`, 40 }, 41 { 42 name: "empty errors array fallback", 43 err: errors.New(`Error response from daemon: unknown: {"errors":[]}`), 44 expected: `Error response from daemon: unknown: {"errors":[]}`, 45 }, 46 { 47 name: "empty message field fallback", 48 err: errors.New(`Error response from daemon: unknown: {"errors":[{"code":"X","message":""}]}`), 49 expected: `Error response from daemon: unknown: {"errors":[{"code":"X","message":""}]}`, 50 }, 51 { 52 name: "nil error", 53 err: nil, 54 expected: "", 55 }, 56 { 57 name: "real world nixery error", 58 err: errors.New(`Error response from daemon: unknown: {"errors":[{"code":"MANIFEST_UNKNOWN","message":"Could not find Nix packages: [nonexistent-package-xyz]"}]}`), 59 expected: "Could not find Nix packages: [nonexistent-package-xyz]", 60 }, 61 } 62 63 for _, tt := range tests { 64 t.Run(tt.name, func(t *testing.T) { 65 result := ParseSetupError(tt.err) 66 assert.Equal(t, tt.expected, result) 67 }) 68 } 69} 70 71func TestWriteSetupError(t *testing.T) { 72 // Create temp directory 73 tempDir := t.TempDir() 74 75 wid := WorkflowId{ 76 PipelineId: PipelineId{ 77 Knot: "test.example.com", 78 Rkey: "abc123", 79 }, 80 Name: "test-workflow", 81 } 82 83 // Create logger 84 logger, err := NewWorkflowLogger(tempDir, wid) 85 require.NoError(t, err) 86 defer logger.Close() 87 88 // Write setup error 89 testMessage := "Could not find Nix packages: [gopher123]" 90 err = logger.WriteSetupError(testMessage) 91 require.NoError(t, err) 92 93 // Close logger to flush 94 err = logger.Close() 95 require.NoError(t, err) 96 97 // Read the log file 98 logPath := filepath.Join(tempDir, wid.String()+".log") 99 file, err := os.Open(logPath) 100 require.NoError(t, err) 101 defer file.Close() 102 103 scanner := bufio.NewScanner(file) 104 105 // Line 1: Control message (step start) 106 require.True(t, scanner.Scan(), "expected control start line") 107 var controlStart LogLine 108 require.NoError(t, json.Unmarshal(scanner.Bytes(), &controlStart)) 109 assert.Equal(t, LogKindControl, controlStart.Kind) 110 assert.Equal(t, "Setup", controlStart.Content) 111 assert.Equal(t, 0, controlStart.StepId) 112 assert.Equal(t, StepKindSystem, controlStart.StepKind) 113 assert.Equal(t, StepStatusStart, controlStart.StepStatus) 114 115 // Line 2: Data message (error content) 116 require.True(t, scanner.Scan(), "expected data line") 117 var dataLine LogLine 118 require.NoError(t, json.Unmarshal(scanner.Bytes(), &dataLine)) 119 assert.Equal(t, LogKindData, dataLine.Kind) 120 assert.Equal(t, testMessage, dataLine.Content) 121 assert.Equal(t, 0, dataLine.StepId) 122 assert.Equal(t, "stderr", dataLine.Stream) 123 124 // Line 3: Control message (step end) 125 require.True(t, scanner.Scan(), "expected control end line") 126 var controlEnd LogLine 127 require.NoError(t, json.Unmarshal(scanner.Bytes(), &controlEnd)) 128 assert.Equal(t, LogKindControl, controlEnd.Kind) 129 assert.Equal(t, StepStatusEnd, controlEnd.StepStatus) 130}