From ed178138869ad6fd6b4740a535172741cbdd1286 Mon Sep 17 00:00:00 2001 From: Michael Henriksen Date: Thu, 18 May 2023 12:31:40 +0200 Subject: [PATCH] feat: show output from test runs failing with error (#13) Introduces a view for test results that fail because of an error which allows the user to inspect the test command output and exit code for debugging purposes. Closes #12 --- internal/pkg/runner/runner.go | 4 +- internal/pkg/server/server.go | 7 +- internal/pkg/server/server_test.go | 2 +- web/app/src/lib/common/types.ts | 1 + .../lib/components/ResultEmptyState.svelte | 125 ++++++++++++++ .../lib/components/ResultListBoxItem.svelte | 2 +- web/app/src/lib/services/websocket.ts | 4 +- web/app/src/routes/+layout.svelte | 39 +++-- web/app/src/routes/+page.svelte | 160 ++++-------------- 9 files changed, 188 insertions(+), 156 deletions(-) create mode 100644 web/app/src/lib/components/ResultEmptyState.svelte diff --git a/internal/pkg/runner/runner.go b/internal/pkg/runner/runner.go index bc0d80b..ed538d3 100644 --- a/internal/pkg/runner/runner.go +++ b/internal/pkg/runner/runner.go @@ -39,6 +39,7 @@ type Result struct { Start time.Time `json:"start"` Duration time.Duration `json:"duration"` ExitCode int `json:"exitCode"` + Output []byte `json:"output"` Targets []string `json:"targets"` Passed int `json:"passed"` Failed int `json:"failed"` @@ -168,6 +169,7 @@ func (r *Runner) Run(pkgs ...string) (*Result, error) { if err := r.handleError(err, out); err != nil { result.Error = err.Error() result.Pass = false + result.Output = out return result, nil } @@ -252,8 +254,6 @@ func (r *Runner) handleError(err error, out []byte) error { reason = "timeout" case errors.Is(err, exec.ErrNotFound): reason = fmt.Sprintf("go binary %q was not found", r.goBin) - case bytes.Contains(out, []byte("panic: test timed out")): - reason = "timeout" case bytes.Contains(out, []byte("[build failed]")): reason = "build failed" default: diff --git a/internal/pkg/server/server.go b/internal/pkg/server/server.go index bbdc599..76c0477 100644 --- a/internal/pkg/server/server.go +++ b/internal/pkg/server/server.go @@ -122,12 +122,7 @@ func (s *Server) Close() error { // Prepends the result to the internal result slice. Slice is trimmed if its // length exceeds configured max results. func (s *Server) AddResult(r *runner.Result) { - if r.Error != "" { - s.sendClientMessage(newClientMessage("resultError", r)) - return - } - - if r.Tests == 0 { + if r.Error == "" && r.Tests == 0 { s.sendClientMessage(newClientMessage("resultEmpty", r)) return } diff --git a/internal/pkg/server/server_test.go b/internal/pkg/server/server_test.go index aa55a43..db5f3be 100644 --- a/internal/pkg/server/server_test.go +++ b/internal/pkg/server/server_test.go @@ -122,7 +122,7 @@ func TestServerWebsocketResultError(t *testing.T) { serverInstance.AddResult(&runner.Result{UUID: "deadbeef", Error: "warp core breach"}) msg := waitForMessage(t, ws) - require.Equal(t, "resultError", msg.Kind) + require.Equal(t, "result", msg.Kind) result, ok := msg.Data.(map[string]any) require.True(t, ok) diff --git a/web/app/src/lib/common/types.ts b/web/app/src/lib/common/types.ts index 5039c3a..c5e01ff 100644 --- a/web/app/src/lib/common/types.ts +++ b/web/app/src/lib/common/types.ts @@ -36,6 +36,7 @@ export interface Result { start: string; duration: number; exitCode: number; + output: string; targets: string[]; passed: number; failed: number; diff --git a/web/app/src/lib/components/ResultEmptyState.svelte b/web/app/src/lib/components/ResultEmptyState.svelte new file mode 100644 index 0000000..d1af2c3 --- /dev/null +++ b/web/app/src/lib/components/ResultEmptyState.svelte @@ -0,0 +1,125 @@ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +