-
Notifications
You must be signed in to change notification settings - Fork 0
/
health_test.go
125 lines (111 loc) · 3.58 KB
/
health_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package nats
import (
"testing"
"github.com/nats-io/nats.go/jetstream"
"github.com/stretchr/testify/assert"
"go.uber.org/mock/gomock"
"gofr.dev/pkg/gofr/datasource"
"gofr.dev/pkg/gofr/logging"
)
const (
NATSServer = "nats://localhost:4222"
)
func TestNATSClient_Health(t *testing.T) {
testCases := defineHealthTestCases()
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
runHealthTestCase(t, tc)
})
}
}
func defineHealthTestCases() []healthTestCase {
return []healthTestCase{
{
name: "HealthyConnection",
setupMocks: func(mockConnManager *MockConnectionManagerInterface, mockJS *MockJetStream) {
mockConnManager.EXPECT().Health().Return(datasource.Health{
Status: datasource.StatusUp,
Details: map[string]interface{}{
"host": NATSServer,
"connection_status": jetStreamConnected,
},
})
mockConnManager.EXPECT().JetStream().Return(mockJS, nil)
mockJS.EXPECT().AccountInfo(gomock.Any()).Return(&jetstream.AccountInfo{}, nil)
},
expectedStatus: datasource.StatusUp,
expectedDetails: map[string]interface{}{
"host": NATSServer,
"backend": natsBackend,
"connection_status": jetStreamConnected,
"jetstream_enabled": true,
"jetstream_status": jetStreamStatusOK,
},
},
{
name: "DisconnectedStatus",
setupMocks: func(mockConnManager *MockConnectionManagerInterface, _ *MockJetStream) {
mockConnManager.EXPECT().Health().Return(datasource.Health{
Status: datasource.StatusDown,
Details: map[string]interface{}{
"host": NATSServer,
"connection_status": jetStreamDisconnecting,
},
})
mockConnManager.EXPECT().JetStream().Return(nil, errJetStreamNotConfigured)
},
expectedStatus: datasource.StatusDown,
expectedDetails: map[string]interface{}{
"host": NATSServer,
"backend": natsBackend,
"connection_status": jetStreamDisconnecting,
"jetstream_enabled": false,
"jetstream_status": jetStreamStatusError + ": JetStream is not configured",
},
},
{
name: "JetStreamError",
setupMocks: func(mockConnManager *MockConnectionManagerInterface, mockJS *MockJetStream) {
mockConnManager.EXPECT().Health().Return(datasource.Health{
Status: datasource.StatusUp,
Details: map[string]interface{}{
"host": NATSServer,
"connection_status": jetStreamConnected,
},
})
mockConnManager.EXPECT().JetStream().Return(mockJS, nil)
mockJS.EXPECT().AccountInfo(gomock.Any()).Return(nil, errJetStream)
},
expectedStatus: datasource.StatusUp,
expectedDetails: map[string]interface{}{
"host": NATSServer,
"backend": natsBackend,
"connection_status": jetStreamConnected,
"jetstream_enabled": true,
"jetstream_status": jetStreamStatusError + ": " + errJetStream.Error(),
},
},
}
}
func runHealthTestCase(t *testing.T, tc healthTestCase) {
t.Helper()
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockConnManager := NewMockConnectionManagerInterface(ctrl)
mockJS := NewMockJetStream(ctrl)
tc.setupMocks(mockConnManager, mockJS)
client := &Client{
connManager: mockConnManager,
Config: &Config{Server: NATSServer},
logger: logging.NewMockLogger(logging.DEBUG),
}
h := client.Health()
assert.Equal(t, tc.expectedStatus, h.Status)
assert.Equal(t, tc.expectedDetails, h.Details)
}
type healthTestCase struct {
name string
setupMocks func(*MockConnectionManagerInterface, *MockJetStream)
expectedStatus string
expectedDetails map[string]interface{}
}