Files
gastown/internal/cmd/errors_test.go
Daniel Sauer 8332a719ab fix(errors): use errors.As for wrapped error handling (#462)
IsSilentExit used type assertion which fails on wrapped errors.
Changed to errors.As to properly unwrap and detect SilentExitError.

Added test to verify wrapped error detection works.
2026-01-16 11:05:59 -08:00

93 lines
2.0 KiB
Go

package cmd
import (
"errors"
"fmt"
"testing"
)
func TestSilentExitError_Error(t *testing.T) {
tests := []struct {
name string
code int
want string
}{
{"zero code", 0, "exit 0"},
{"success code", 1, "exit 1"},
{"error code", 2, "exit 2"},
{"custom code", 42, "exit 42"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
e := &SilentExitError{Code: tt.code}
got := e.Error()
if got != tt.want {
t.Errorf("SilentExitError.Error() = %q, want %q", got, tt.want)
}
})
}
}
func TestNewSilentExit(t *testing.T) {
tests := []struct {
code int
}{
{0},
{1},
{2},
{127},
}
for _, tt := range tests {
t.Run(fmt.Sprintf("code_%d", tt.code), func(t *testing.T) {
err := NewSilentExit(tt.code)
if err == nil {
t.Fatal("NewSilentExit should return non-nil")
}
if err.Code != tt.code {
t.Errorf("NewSilentExit(%d).Code = %d, want %d", tt.code, err.Code, tt.code)
}
})
}
}
func TestIsSilentExit(t *testing.T) {
tests := []struct {
name string
err error
wantCode int
wantIsSilent bool
}{
{"nil error", nil, 0, false},
{"silent exit code 0", NewSilentExit(0), 0, true},
{"silent exit code 1", NewSilentExit(1), 1, true},
{"silent exit code 2", NewSilentExit(2), 2, true},
{"other error", errors.New("some error"), 0, false},
{"wrapped silent exit", fmt.Errorf("wrapped: %w", NewSilentExit(5)), 5, true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
code, isSilent := IsSilentExit(tt.err)
if isSilent != tt.wantIsSilent {
t.Errorf("IsSilentExit(%v) isSilent = %v, want %v", tt.err, isSilent, tt.wantIsSilent)
}
if code != tt.wantCode {
t.Errorf("IsSilentExit(%v) code = %d, want %d", tt.err, code, tt.wantCode)
}
})
}
}
func TestSilentExitError_Is(t *testing.T) {
err := NewSilentExit(1)
var target *SilentExitError
if !errors.As(err, &target) {
t.Error("errors.As should find SilentExitError")
}
if target.Code != 1 {
t.Errorf("errors.As extracted code = %d, want 1", target.Code)
}
}