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.
93 lines
2.0 KiB
Go
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)
|
|
}
|
|
}
|