1package broker
2
3import (
4 "context"
5 "errors"
6 "fmt"
7 "testing"
8
9 "github.com/stretchr/testify/require"
10
11 "github.com/bnema/vev/internal/domain"
12 "github.com/bnema/vev/internal/ports"
13)
14
15func TestObservationOutcomeKeepsTypedDialFailure(t *testing.T) {
16 tests := []struct {
17 name string
18 err error
19 kind domain.RemoteFailureKind
20 want domain.RemoteAvailability
21 }{
22 {name: "plain error is transport", err: errors.New("offline"), kind: domain.RemoteFailureTransport, want: domain.RemoteAvailabilityUnreachable},
23 {name: "deadline is timeout", err: context.DeadlineExceeded, kind: domain.RemoteFailureTimeout, want: domain.RemoteAvailabilityUnreachable},
24 {name: "wrapped authentication", err: fmt.Errorf("dial: %w", domain.RemoteFailure{Kind: domain.RemoteFailureAuthentication, Err: errors.New("exit 255")}), kind: domain.RemoteFailureAuthentication, want: domain.RemoteAvailabilityAuthFailed},
25 {name: "wrapped trust", err: fmt.Errorf("dial: %w", domain.RemoteFailure{Kind: domain.RemoteFailureTrust}), kind: domain.RemoteFailureTrust, want: domain.RemoteAvailabilityUnreachable},
26 {name: "conflicting policy is incompatible", err: fmt.Errorf("bind: %w", ports.BrokerError{Code: ports.BrokerErrorConflictingPolicy}), kind: domain.RemoteFailureIncompatible, want: domain.RemoteAvailabilityIncompatible},
27 {name: "incompatible broker error", err: ports.BrokerError{Code: ports.BrokerErrorIncompatible}, kind: domain.RemoteFailureIncompatible, want: domain.RemoteAvailabilityIncompatible},
28 {name: "unavailable broker error stays transport", err: ports.BrokerError{Code: ports.BrokerErrorUnavailable}, kind: domain.RemoteFailureTransport, want: domain.RemoteAvailabilityUnreachable},
29 }
30 for _, tt := range tests {
31 t.Run(tt.name, func(t *testing.T) {
32 kind, availability, failed := observationOutcome(probeResult{err: tt.err})
33 require.True(t, failed)
34 require.Equal(t, tt.kind, kind)
35 require.Equal(t, tt.want, availability)
36 })
37 }
38}