Skip to content

Commit 1e666f7

Browse files
dharmabclaude
andcommitted
Assert full response contents in controller handler tests
Previously many handler tests only checked a subset of response fields (e.g. declaration without callsign, group without BRAA details). This adds comprehensive assertions for all response fields including callsigns, bearings, ranges, altitudes, aspects, tracks, platforms, contacts counts, and nil checks for absent fields. Introduces standardized InDelta tolerance constants (bearingDeltaDegrees, rangeDeltaNauticalMiles, altitudeDeltaFeet) for computed BRAA/Bullseye values. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 40c44ab commit 1e666f7

14 files changed

Lines changed: 185 additions & 15 deletions

pkg/controller/alphacheck_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ func TestHandleAlphaCheck_CallsignOnRadar(t *testing.T) {
1919
got := h.expectResponse(t)
2020
resp, ok := got.(brevity.AlphaCheckResponse)
2121
require.True(t, ok)
22+
assert.Equal(t, "eagle 1", resp.Callsign)
2223
assert.True(t, resp.Status)
2324
require.NotNil(t, resp.Location)
24-
assert.InDelta(t, 8.0, resp.Location.Distance().NauticalMiles(), 1.0)
25+
assert.InDelta(t, 31.0, resp.Location.Bearing().Degrees(), bearingDeltaDegrees)
26+
assert.InDelta(t, 8.0, resp.Location.Distance().NauticalMiles(), rangeDeltaNauticalMiles)
2527
}
2628

2729
func TestHandleAlphaCheck_CallsignNotOnRadar(t *testing.T) {
@@ -32,6 +34,7 @@ func TestHandleAlphaCheck_CallsignNotOnRadar(t *testing.T) {
3234
got := h.expectResponse(t)
3335
resp, ok := got.(brevity.AlphaCheckResponse)
3436
require.True(t, ok)
37+
assert.Equal(t, "eagle 1", resp.Callsign)
3538
assert.False(t, resp.Status)
3639
assert.Nil(t, resp.Location)
3740
}

pkg/controller/bogeydope_test.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ func TestHandleBogeyDope_CallsignNotOnRadar(t *testing.T) {
1616

1717
h.ctrl.HandleBogeyDope(h.ctx, &brevity.BogeyDopeRequest{Callsign: "eagle 1", Filter: brevity.Aircraft})
1818
got := h.expectResponse(t)
19-
_, ok := got.(brevity.NegativeRadarContactResponse)
19+
resp, ok := got.(brevity.NegativeRadarContactResponse)
2020
require.True(t, ok)
21+
assert.Equal(t, "eagle 1", resp.Callsign)
2122
}
2223

2324
func TestHandleBogeyDope_NoHostiles(t *testing.T) {
@@ -29,6 +30,7 @@ func TestHandleBogeyDope_NoHostiles(t *testing.T) {
2930
got := h.expectResponse(t)
3031
resp, ok := got.(brevity.BogeyDopeResponse)
3132
require.True(t, ok)
33+
assert.Equal(t, "eagle 1", resp.Callsign)
3234
assert.Nil(t, resp.Group)
3335
}
3436

@@ -42,10 +44,18 @@ func TestHandleBogeyDope_HostilePresent(t *testing.T) {
4244
got := h.expectResponse(t)
4345
resp, ok := got.(brevity.BogeyDopeResponse)
4446
require.True(t, ok)
47+
assert.Equal(t, "eagle 1", resp.Callsign)
4548
require.NotNil(t, resp.Group)
4649
assert.Equal(t, brevity.Hostile, resp.Group.Declaration())
50+
assert.Equal(t, 1, resp.Group.Contacts())
51+
assert.Nil(t, resp.Group.Bullseye())
4752
require.NotNil(t, resp.Group.BRAA())
48-
assert.InDelta(t, 23.0, resp.Group.BRAA().Range().NauticalMiles(), 1.0)
53+
assert.InDelta(t, 84.0, resp.Group.BRAA().Bearing().Degrees(), bearingDeltaDegrees)
54+
assert.InDelta(t, 23.0, resp.Group.BRAA().Range().NauticalMiles(), rangeDeltaNauticalMiles)
55+
assert.InDelta(t, 20000.0, resp.Group.BRAA().Altitude().Feet(), altitudeDeltaFeet)
56+
assert.Equal(t, brevity.Aspect(brevity.Drag), resp.Group.BRAA().Aspect())
57+
assert.Equal(t, brevity.East, resp.Group.Track())
58+
assert.Contains(t, resp.Group.Platforms(), "Flanker")
4959
}
5060

5161
func TestHandleBogeyDope_FilterFixedWing(t *testing.T) {
@@ -59,8 +69,16 @@ func TestHandleBogeyDope_FilterFixedWing(t *testing.T) {
5969
got := h.expectResponse(t)
6070
resp, ok := got.(brevity.BogeyDopeResponse)
6171
require.True(t, ok)
72+
assert.Equal(t, "eagle 1", resp.Callsign)
6273
require.NotNil(t, resp.Group)
74+
assert.Equal(t, brevity.Hostile, resp.Group.Declaration())
75+
assert.Equal(t, 1, resp.Group.Contacts())
76+
require.NotNil(t, resp.Group.BRAA())
6377
// The Su-27 is fixed-wing; the Ka-50 is rotary. With FixedWing filter,
6478
// the nearest match should be the Su-27 (farther away), not the Ka-50.
65-
assert.InDelta(t, 23.0, resp.Group.BRAA().Range().NauticalMiles(), 1.0)
79+
assert.InDelta(t, 84.0, resp.Group.BRAA().Bearing().Degrees(), bearingDeltaDegrees)
80+
assert.InDelta(t, 23.0, resp.Group.BRAA().Range().NauticalMiles(), rangeDeltaNauticalMiles)
81+
assert.InDelta(t, 20000.0, resp.Group.BRAA().Altitude().Feet(), altitudeDeltaFeet)
82+
assert.Equal(t, brevity.Aspect(brevity.Drag), resp.Group.BRAA().Aspect())
83+
assert.Contains(t, resp.Group.Platforms(), "Flanker")
6684
}

pkg/controller/checkin_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func TestHandleCheckIn_CallsignOnRadar(t *testing.T) {
1919
got := h.expectResponse(t)
2020
resp, ok := got.(brevity.CheckInResponse)
2121
require.True(t, ok)
22-
assert.Contains(t, resp.Callsign, "eagle 1")
22+
assert.Equal(t, "eagle 1", resp.Callsign)
2323
}
2424

2525
func TestHandleCheckIn_CallsignNotOnRadar(t *testing.T) {

pkg/controller/declare_test.go

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ func TestHandleDeclare_CallsignNotOnRadar(t *testing.T) {
2424
Altitude: 20000 * unit.Foot,
2525
})
2626
got := h.expectResponse(t)
27-
_, ok := got.(brevity.NegativeRadarContactResponse)
27+
resp, ok := got.(brevity.NegativeRadarContactResponse)
2828
require.True(t, ok)
29+
assert.Equal(t, "eagle 1", resp.Callsign)
2930
}
3031

3132
func TestHandleDeclare_Sour(t *testing.T) {
@@ -40,8 +41,10 @@ func TestHandleDeclare_Sour(t *testing.T) {
4041
got := h.expectResponse(t)
4142
resp, ok := got.(brevity.DeclareResponse)
4243
require.True(t, ok)
44+
assert.Equal(t, "eagle 1", resp.Callsign)
4345
assert.True(t, resp.Sour)
4446
assert.Equal(t, brevity.Unable, resp.Declaration)
47+
assert.Nil(t, resp.Group)
4548
}
4649

4750
func TestHandleDeclare_BRAA_Clean(t *testing.T) {
@@ -60,7 +63,10 @@ func TestHandleDeclare_BRAA_Clean(t *testing.T) {
6063
got := h.expectResponse(t)
6164
resp, ok := got.(brevity.DeclareResponse)
6265
require.True(t, ok)
66+
assert.Equal(t, "eagle 1", resp.Callsign)
67+
assert.False(t, resp.Sour)
6368
assert.Equal(t, brevity.Clean, resp.Declaration)
69+
assert.Nil(t, resp.Group)
6470
}
6571

6672
func TestHandleDeclare_BRAA_Friendly(t *testing.T) {
@@ -80,7 +86,11 @@ func TestHandleDeclare_BRAA_Friendly(t *testing.T) {
8086
got := h.expectResponse(t)
8187
resp, ok := got.(brevity.DeclareResponse)
8288
require.True(t, ok)
89+
assert.Equal(t, "eagle 1", resp.Callsign)
90+
assert.False(t, resp.Sour)
8391
assert.Equal(t, brevity.Friendly, resp.Declaration)
92+
require.NotNil(t, resp.Group)
93+
assert.Equal(t, brevity.Friendly, resp.Group.Declaration())
8494
}
8595

8696
func TestHandleDeclare_BRAA_Hostile(t *testing.T) {
@@ -99,8 +109,12 @@ func TestHandleDeclare_BRAA_Hostile(t *testing.T) {
99109
got := h.expectResponse(t)
100110
resp, ok := got.(brevity.DeclareResponse)
101111
require.True(t, ok)
112+
assert.Equal(t, "eagle 1", resp.Callsign)
113+
assert.False(t, resp.Sour)
102114
assert.Equal(t, brevity.Hostile, resp.Declaration)
103115
require.NotNil(t, resp.Group)
116+
assert.Equal(t, 1, resp.Group.Contacts())
117+
assert.Contains(t, resp.Group.Platforms(), "Flanker")
104118
}
105119

106120
func TestHandleDeclare_BRAA_Furball(t *testing.T) {
@@ -121,7 +135,12 @@ func TestHandleDeclare_BRAA_Furball(t *testing.T) {
121135
got := h.expectResponse(t)
122136
resp, ok := got.(brevity.DeclareResponse)
123137
require.True(t, ok)
138+
assert.Equal(t, "eagle 1", resp.Callsign)
139+
assert.False(t, resp.Sour)
124140
assert.Equal(t, brevity.Furball, resp.Declaration)
141+
require.NotNil(t, resp.Group)
142+
assert.Equal(t, brevity.Furball, resp.Group.Declaration())
143+
assert.Contains(t, resp.Group.Platforms(), "Flanker")
125144
}
126145

127146
func TestHandleDeclare_Bullseye_Hostile(t *testing.T) {
@@ -141,8 +160,13 @@ func TestHandleDeclare_Bullseye_Hostile(t *testing.T) {
141160
got := h.expectResponse(t)
142161
resp, ok := got.(brevity.DeclareResponse)
143162
require.True(t, ok)
163+
assert.Equal(t, "eagle 1", resp.Callsign)
164+
assert.False(t, resp.Sour)
144165
assert.Equal(t, brevity.Hostile, resp.Declaration)
145166
require.NotNil(t, resp.Group)
167+
assert.Equal(t, brevity.Hostile, resp.Group.Declaration())
168+
assert.Equal(t, 1, resp.Group.Contacts())
169+
assert.Contains(t, resp.Group.Platforms(), "Flanker")
146170
}
147171

148172
func TestHandleDeclare_Bullseye_NilBullseye(t *testing.T) {
@@ -159,7 +183,9 @@ func TestHandleDeclare_Bullseye_NilBullseye(t *testing.T) {
159183
got := h.expectResponse(t)
160184
resp, ok := got.(brevity.DeclareResponse)
161185
require.True(t, ok)
186+
assert.Equal(t, "eagle 1", resp.Callsign)
162187
assert.Equal(t, brevity.Unable, resp.Declaration)
188+
assert.Nil(t, resp.Group)
163189
}
164190

165191
func TestHandleDeclare_Bullseye_Clean(t *testing.T) {
@@ -177,7 +203,10 @@ func TestHandleDeclare_Bullseye_Clean(t *testing.T) {
177203
got := h.expectResponse(t)
178204
resp, ok := got.(brevity.DeclareResponse)
179205
require.True(t, ok)
206+
assert.Equal(t, "eagle 1", resp.Callsign)
207+
assert.False(t, resp.Sour)
180208
assert.Equal(t, brevity.Clean, resp.Declaration)
209+
assert.Nil(t, resp.Group)
181210
}
182211

183212
func TestHandleDeclare_Bullseye_Friendly(t *testing.T) {
@@ -195,7 +224,11 @@ func TestHandleDeclare_Bullseye_Friendly(t *testing.T) {
195224
got := h.expectResponse(t)
196225
resp, ok := got.(brevity.DeclareResponse)
197226
require.True(t, ok)
227+
assert.Equal(t, "eagle 1", resp.Callsign)
228+
assert.False(t, resp.Sour)
198229
assert.Equal(t, brevity.Friendly, resp.Declaration)
230+
require.NotNil(t, resp.Group)
231+
assert.Equal(t, brevity.Friendly, resp.Group.Declaration())
199232
}
200233

201234
func TestHandleDeclare_Bullseye_Furball(t *testing.T) {
@@ -214,7 +247,12 @@ func TestHandleDeclare_Bullseye_Furball(t *testing.T) {
214247
got := h.expectResponse(t)
215248
resp, ok := got.(brevity.DeclareResponse)
216249
require.True(t, ok)
250+
assert.Equal(t, "eagle 1", resp.Callsign)
251+
assert.False(t, resp.Sour)
217252
assert.Equal(t, brevity.Furball, resp.Declaration)
253+
require.NotNil(t, resp.Group)
254+
assert.Equal(t, brevity.Furball, resp.Group.Declaration())
255+
assert.Contains(t, resp.Group.Platforms(), "Flanker")
218256
}
219257

220258
func TestHandleDeclare_BRAA_ZeroAltitude(t *testing.T) {
@@ -234,5 +272,11 @@ func TestHandleDeclare_BRAA_ZeroAltitude(t *testing.T) {
234272
got := h.expectResponse(t)
235273
resp, ok := got.(brevity.DeclareResponse)
236274
require.True(t, ok)
275+
assert.Equal(t, "eagle 1", resp.Callsign)
276+
assert.False(t, resp.Sour)
237277
assert.Equal(t, brevity.Hostile, resp.Declaration)
278+
require.NotNil(t, resp.Group)
279+
assert.Equal(t, brevity.Hostile, resp.Group.Declaration())
280+
assert.Equal(t, 1, resp.Group.Contacts())
281+
assert.Contains(t, resp.Group.Platforms(), "Flanker")
238282
}

pkg/controller/harness_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,12 @@ func newControllerTestHarness(t *testing.T, locs []locations.Location) *controll
6464
}
6565
}
6666

67+
const (
68+
bearingDeltaDegrees = 5.0
69+
rangeDeltaNauticalMiles = 1.0
70+
altitudeDeltaFeet = 1000.0
71+
)
72+
6773
const (
6874
acmiF15C = "F-15C"
6975
acmiF16C = "F-16C_50"

pkg/controller/picture_test.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ func TestHandlePicture_NoHostiles(t *testing.T) {
2626
resp, ok := got.(brevity.PictureResponse)
2727
require.True(t, ok)
2828
assert.Equal(t, 0, resp.Count)
29+
assert.Empty(t, resp.Groups)
2930
})
3031
}
3132

@@ -44,7 +45,15 @@ func TestHandlePicture_OneHostileGroup(t *testing.T) {
4445
require.True(t, ok)
4546
assert.Equal(t, 1, resp.Count)
4647
require.Len(t, resp.Groups, 1)
47-
assert.Equal(t, brevity.Hostile, resp.Groups[0].Declaration())
48+
grp := resp.Groups[0]
49+
assert.Equal(t, brevity.Hostile, grp.Declaration())
50+
assert.Equal(t, 1, grp.Contacts())
51+
assert.Nil(t, grp.BRAA())
52+
require.NotNil(t, grp.Bullseye())
53+
assert.InDelta(t, 84.0, grp.Bullseye().Bearing().Degrees(), bearingDeltaDegrees)
54+
assert.InDelta(t, 23.0, grp.Bullseye().Distance().NauticalMiles(), rangeDeltaNauticalMiles)
55+
assert.Equal(t, brevity.East, grp.Track())
56+
assert.Contains(t, grp.Platforms(), "Flanker")
4857
})
4958
}
5059

@@ -65,6 +74,13 @@ func TestHandlePicture_MultipleHostileGroups(t *testing.T) {
6574
resp, ok := got.(brevity.PictureResponse)
6675
require.True(t, ok)
6776
assert.Equal(t, 3, resp.Count)
68-
assert.Len(t, resp.Groups, 3)
77+
require.Len(t, resp.Groups, 3)
78+
for _, grp := range resp.Groups {
79+
assert.Equal(t, brevity.Hostile, grp.Declaration())
80+
assert.Equal(t, 1, grp.Contacts())
81+
assert.Nil(t, grp.BRAA())
82+
require.NotNil(t, grp.Bullseye())
83+
assert.Equal(t, brevity.East, grp.Track())
84+
}
6985
})
7086
}

pkg/controller/radiocheck_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ func TestHandleRadioCheck_CallsignOnRadar(t *testing.T) {
1919
got := h.expectResponse(t)
2020
resp, ok := got.(brevity.RadioCheckResponse)
2121
require.True(t, ok)
22+
assert.Equal(t, "eagle 1", resp.Callsign)
2223
assert.True(t, resp.RadarContact)
2324
}
2425

pkg/controller/shopping_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func TestHandleShopping_CallsignOnRadar(t *testing.T) {
1919
got := h.expectResponse(t)
2020
resp, ok := got.(brevity.ShoppingResponse)
2121
require.True(t, ok)
22-
assert.Contains(t, resp.Callsign, "eagle 1")
22+
assert.Equal(t, "eagle 1", resp.Callsign)
2323
}
2424

2525
func TestHandleShopping_CallsignNotOnRadar(t *testing.T) {

pkg/controller/snaplock_test.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ func TestHandleSnaplock_CallsignNotOnRadar(t *testing.T) {
2121
BRA: brevity.NewBRA(bearings.NewMagneticBearing(90*unit.Degree), 20*unit.NauticalMile, 20000*unit.Foot),
2222
})
2323
got := h.expectResponse(t)
24-
_, ok := got.(brevity.NegativeRadarContactResponse)
24+
resp, ok := got.(brevity.NegativeRadarContactResponse)
2525
require.True(t, ok)
26+
assert.Equal(t, "eagle 1", resp.Callsign)
2627
}
2728

2829
func TestHandleSnaplock_Clean(t *testing.T) {
@@ -38,7 +39,9 @@ func TestHandleSnaplock_Clean(t *testing.T) {
3839
got := h.expectResponse(t)
3940
resp, ok := got.(brevity.SnaplockResponse)
4041
require.True(t, ok)
42+
assert.Equal(t, "eagle 1", resp.Callsign)
4143
assert.Equal(t, brevity.Clean, resp.Declaration)
44+
assert.Nil(t, resp.Group)
4245
}
4346

4447
func TestHandleSnaplock_Friendly(t *testing.T) {
@@ -55,7 +58,10 @@ func TestHandleSnaplock_Friendly(t *testing.T) {
5558
got := h.expectResponse(t)
5659
resp, ok := got.(brevity.SnaplockResponse)
5760
require.True(t, ok)
61+
assert.Equal(t, "eagle 1", resp.Callsign)
5862
assert.Equal(t, brevity.Friendly, resp.Declaration)
63+
require.NotNil(t, resp.Group)
64+
assert.Equal(t, brevity.Friendly, resp.Group.Declaration())
5965
}
6066

6167
func TestHandleSnaplock_Hostile(t *testing.T) {
@@ -72,8 +78,17 @@ func TestHandleSnaplock_Hostile(t *testing.T) {
7278
got := h.expectResponse(t)
7379
resp, ok := got.(brevity.SnaplockResponse)
7480
require.True(t, ok)
81+
assert.Equal(t, "eagle 1", resp.Callsign)
7582
assert.Equal(t, brevity.Hostile, resp.Declaration)
7683
require.NotNil(t, resp.Group)
84+
assert.Equal(t, brevity.Hostile, resp.Group.Declaration())
85+
assert.Equal(t, 1, resp.Group.Contacts())
86+
require.NotNil(t, resp.Group.BRAA())
87+
assert.InDelta(t, 84.0, resp.Group.BRAA().Bearing().Degrees(), bearingDeltaDegrees)
88+
assert.InDelta(t, 23.0, resp.Group.BRAA().Range().NauticalMiles(), rangeDeltaNauticalMiles)
89+
assert.InDelta(t, 20000.0, resp.Group.BRAA().Altitude().Feet(), altitudeDeltaFeet)
90+
assert.Equal(t, brevity.Aspect(brevity.Drag), resp.Group.BRAA().Aspect())
91+
assert.Contains(t, resp.Group.Platforms(), "Flanker")
7792
}
7893

7994
func TestHandleSnaplock_Furball(t *testing.T) {
@@ -91,7 +106,9 @@ func TestHandleSnaplock_Furball(t *testing.T) {
91106
got := h.expectResponse(t)
92107
resp, ok := got.(brevity.SnaplockResponse)
93108
require.True(t, ok)
109+
assert.Equal(t, "eagle 1", resp.Callsign)
94110
assert.Equal(t, brevity.Furball, resp.Declaration)
111+
assert.Nil(t, resp.Group)
95112
}
96113

97114
func TestHandleSnaplock_HostilePrefersHotAspect(t *testing.T) {
@@ -112,7 +129,13 @@ func TestHandleSnaplock_HostilePrefersHotAspect(t *testing.T) {
112129
got := h.expectResponse(t)
113130
resp, ok := got.(brevity.SnaplockResponse)
114131
require.True(t, ok)
132+
assert.Equal(t, "eagle 1", resp.Callsign)
115133
assert.Equal(t, brevity.Hostile, resp.Declaration)
116134
require.NotNil(t, resp.Group)
135+
assert.Equal(t, brevity.Hostile, resp.Group.Declaration())
136+
assert.Equal(t, 1, resp.Group.Contacts())
137+
require.NotNil(t, resp.Group.BRAA())
138+
assert.Equal(t, brevity.Aspect(brevity.Hot), resp.Group.BRAA().Aspect())
117139
assert.Equal(t, brevity.Aspect(brevity.Hot), resp.Group.Aspect())
140+
assert.Contains(t, resp.Group.Platforms(), "Fulcrum")
118141
}

0 commit comments

Comments
 (0)