Openstatus
www.openstatus.dev
1package server_test
2
3import (
4 "testing"
5
6 "connectrpc.com/connect"
7 "github.com/openstatushq/openstatus/apps/private-location/internal/server"
8 private_locationv1 "github.com/openstatushq/openstatus/apps/private-location/proto/private_location/v1"
9)
10
11func TestValidateIngestHTTPRequest(t *testing.T) {
12 tests := []struct {
13 name string
14 req *private_locationv1.IngestHTTPRequest
15 wantErr error
16 }{
17 {
18 name: "valid request",
19 req: &private_locationv1.IngestHTTPRequest{
20 MonitorId: "monitor-123",
21 Latency: 100,
22 Timestamp: 1234567890,
23 },
24 wantErr: nil,
25 },
26 {
27 name: "valid request with zero latency",
28 req: &private_locationv1.IngestHTTPRequest{
29 MonitorId: "monitor-123",
30 Latency: 0,
31 Timestamp: 1234567890,
32 },
33 wantErr: nil,
34 },
35 {
36 name: "empty monitor_id",
37 req: &private_locationv1.IngestHTTPRequest{
38 MonitorId: "",
39 Latency: 100,
40 Timestamp: 1234567890,
41 },
42 wantErr: server.ErrEmptyMonitorID,
43 },
44 {
45 name: "negative latency",
46 req: &private_locationv1.IngestHTTPRequest{
47 MonitorId: "monitor-123",
48 Latency: -1,
49 Timestamp: 1234567890,
50 },
51 wantErr: server.ErrInvalidLatency,
52 },
53 {
54 name: "zero timestamp",
55 req: &private_locationv1.IngestHTTPRequest{
56 MonitorId: "monitor-123",
57 Latency: 100,
58 Timestamp: 0,
59 },
60 wantErr: server.ErrInvalidTimestamp,
61 },
62 {
63 name: "negative timestamp",
64 req: &private_locationv1.IngestHTTPRequest{
65 MonitorId: "monitor-123",
66 Latency: 100,
67 Timestamp: -1,
68 },
69 wantErr: server.ErrInvalidTimestamp,
70 },
71 }
72
73 for _, tt := range tests {
74 t.Run(tt.name, func(t *testing.T) {
75 err := server.ValidateIngestHTTPRequest(tt.req)
76 if err != tt.wantErr {
77 t.Errorf("ValidateIngestHTTPRequest() error = %v, wantErr %v", err, tt.wantErr)
78 }
79 })
80 }
81}
82
83func TestValidateIngestTCPRequest(t *testing.T) {
84 tests := []struct {
85 name string
86 req *private_locationv1.IngestTCPRequest
87 wantErr error
88 }{
89 {
90 name: "valid request",
91 req: &private_locationv1.IngestTCPRequest{
92 Id: "tcp-123",
93 Latency: 100,
94 Timestamp: 1234567890,
95 },
96 wantErr: nil,
97 },
98 {
99 name: "valid request with zero latency",
100 req: &private_locationv1.IngestTCPRequest{
101 Id: "tcp-123",
102 Latency: 0,
103 Timestamp: 1234567890,
104 },
105 wantErr: nil,
106 },
107 {
108 name: "empty id",
109 req: &private_locationv1.IngestTCPRequest{
110 Id: "",
111 Latency: 100,
112 Timestamp: 1234567890,
113 },
114 wantErr: server.ErrEmptyID,
115 },
116 {
117 name: "negative latency",
118 req: &private_locationv1.IngestTCPRequest{
119 Id: "tcp-123",
120 Latency: -1,
121 Timestamp: 1234567890,
122 },
123 wantErr: server.ErrInvalidLatency,
124 },
125 {
126 name: "zero timestamp",
127 req: &private_locationv1.IngestTCPRequest{
128 Id: "tcp-123",
129 Latency: 100,
130 Timestamp: 0,
131 },
132 wantErr: server.ErrInvalidTimestamp,
133 },
134 {
135 name: "negative timestamp",
136 req: &private_locationv1.IngestTCPRequest{
137 Id: "tcp-123",
138 Latency: 100,
139 Timestamp: -1,
140 },
141 wantErr: server.ErrInvalidTimestamp,
142 },
143 }
144
145 for _, tt := range tests {
146 t.Run(tt.name, func(t *testing.T) {
147 err := server.ValidateIngestTCPRequest(tt.req)
148 if err != tt.wantErr {
149 t.Errorf("ValidateIngestTCPRequest() error = %v, wantErr %v", err, tt.wantErr)
150 }
151 })
152 }
153}
154
155func TestValidateIngestDNSRequest(t *testing.T) {
156 tests := []struct {
157 name string
158 req *private_locationv1.IngestDNSRequest
159 wantErr error
160 }{
161 {
162 name: "valid request",
163 req: &private_locationv1.IngestDNSRequest{
164 Id: "dns-123",
165 Latency: 100,
166 Timestamp: 1234567890,
167 },
168 wantErr: nil,
169 },
170 {
171 name: "valid request with zero latency",
172 req: &private_locationv1.IngestDNSRequest{
173 Id: "dns-123",
174 Latency: 0,
175 Timestamp: 1234567890,
176 },
177 wantErr: nil,
178 },
179 {
180 name: "empty id",
181 req: &private_locationv1.IngestDNSRequest{
182 Id: "",
183 Latency: 100,
184 Timestamp: 1234567890,
185 },
186 wantErr: server.ErrEmptyID,
187 },
188 {
189 name: "negative latency",
190 req: &private_locationv1.IngestDNSRequest{
191 Id: "dns-123",
192 Latency: -1,
193 Timestamp: 1234567890,
194 },
195 wantErr: server.ErrInvalidLatency,
196 },
197 {
198 name: "zero timestamp",
199 req: &private_locationv1.IngestDNSRequest{
200 Id: "dns-123",
201 Latency: 100,
202 Timestamp: 0,
203 },
204 wantErr: server.ErrInvalidTimestamp,
205 },
206 {
207 name: "negative timestamp",
208 req: &private_locationv1.IngestDNSRequest{
209 Id: "dns-123",
210 Latency: 100,
211 Timestamp: -1,
212 },
213 wantErr: server.ErrInvalidTimestamp,
214 },
215 }
216
217 for _, tt := range tests {
218 t.Run(tt.name, func(t *testing.T) {
219 err := server.ValidateIngestDNSRequest(tt.req)
220 if err != tt.wantErr {
221 t.Errorf("ValidateIngestDNSRequest() error = %v, wantErr %v", err, tt.wantErr)
222 }
223 })
224 }
225}
226
227func TestNewValidationError(t *testing.T) {
228 tests := []struct {
229 name string
230 err error
231 wantCode connect.Code
232 wantContains string
233 }{
234 {
235 name: "empty monitor id error",
236 err: server.ErrEmptyMonitorID,
237 wantCode: connect.CodeInvalidArgument,
238 wantContains: "monitor_id is required",
239 },
240 {
241 name: "empty id error",
242 err: server.ErrEmptyID,
243 wantCode: connect.CodeInvalidArgument,
244 wantContains: "id is required",
245 },
246 {
247 name: "invalid latency error",
248 err: server.ErrInvalidLatency,
249 wantCode: connect.CodeInvalidArgument,
250 wantContains: "latency must be non-negative",
251 },
252 {
253 name: "invalid timestamp error",
254 err: server.ErrInvalidTimestamp,
255 wantCode: connect.CodeInvalidArgument,
256 wantContains: "timestamp must be positive",
257 },
258 }
259
260 for _, tt := range tests {
261 t.Run(tt.name, func(t *testing.T) {
262 connErr := server.NewValidationError(tt.err)
263 if connErr.Code() != tt.wantCode {
264 t.Errorf("NewValidationError() code = %v, want %v", connErr.Code(), tt.wantCode)
265 }
266 if connErr.Message() == "" {
267 t.Error("NewValidationError() message should not be empty")
268 }
269 })
270 }
271}