@@ -141,6 +141,7 @@ type mockVulnDBClient struct {
141
141
deleteTeamTagF func (ctx context.Context , authTeam , teamID , tag string ) error
142
142
deleteTargetTeamF func (ctx context.Context , authTeam , targetID , teamID string ) error
143
143
deleteTargetTagF func (ctx context.Context , authTeam , targetID , tag string ) error
144
+ getFindingF func (ctx context.Context , findingID string ) (* api.Finding , error )
144
145
updateFindingF func (ctx context.Context , findingID string , payload * api.UpdateFinding , tag string ) (* api.Finding , error )
145
146
}
146
147
@@ -162,6 +163,9 @@ func (m *mockVulnDBClient) DeleteTargetTeam(ctx context.Context, authTeam, targe
162
163
func (m * mockVulnDBClient ) DeleteTargetTag (ctx context.Context , authTeam , targetID , tag string ) error {
163
164
return m .deleteTargetTagF (ctx , authTeam , targetID , tag )
164
165
}
166
+ func (m * mockVulnDBClient ) Finding (ctx context.Context , findingID string ) (* api.Finding , error ) {
167
+ return m .getFindingF (ctx , findingID )
168
+ }
165
169
func (m * mockVulnDBClient ) UpdateFinding (ctx context.Context , findingID string , payload * api.UpdateFinding , tag string ) (* api.Finding , error ) {
166
170
return m .updateFindingF (ctx , findingID , payload , tag )
167
171
}
@@ -196,14 +200,15 @@ func init() {
196
200
197
201
func TestParse (t * testing.T ) {
198
202
testCases := []struct {
199
- name string
200
- log []Event
201
- vulnDBClient * mockVulnDBClient
202
- asyncAPI func () (* asyncapi.Vulcan , kafka.Client , error )
203
- loggr * mockLoggr
204
- wantNParsed uint
205
- wantAsyncAssets []testutil.AssetTopicData
206
- wantErr error
203
+ name string
204
+ log []Event
205
+ vulnDBClient * mockVulnDBClient
206
+ asyncAPI func () (* asyncapi.Vulcan , kafka.Client , error )
207
+ loggr * mockLoggr
208
+ wantNParsed uint
209
+ wantAsyncAssets []testutil.AssetTopicData
210
+ wantAsyncFindings []testutil.FindingTopicData
211
+ wantErr error
207
212
}{
208
213
{
209
214
name : "Happy path" ,
@@ -257,6 +262,12 @@ func TestParse(t *testing.T) {
257
262
deleteTargetTagF : func (ctx context.Context , authTeam , targetID , tag string ) error {
258
263
return nil
259
264
},
265
+ getFindingF : func (ctx context.Context , findingID string ) (* api.Finding , error ) {
266
+ return & api.Finding {
267
+ Finding : vulndb.FindingExpanded {
268
+ Finding : vulndb.Finding {ID : "1" }},
269
+ }, nil
270
+ },
260
271
updateFindingF : func (ctx context.Context , findingID string , payload * api.UpdateFinding , tag string ) (* api.Finding , error ) {
261
272
var f = & api.Finding {}
262
273
return f , nil
@@ -307,6 +318,26 @@ func TestParse(t *testing.T) {
307
318
},
308
319
},
309
320
},
321
+ wantAsyncFindings : []testutil.FindingTopicData {
322
+ {
323
+ Payload : asyncapi.FindingPayload {
324
+ Id : "1" ,
325
+ Issue : & asyncapi.Issue {
326
+ Recommendations : []any {nil },
327
+ ReferenceLinks : []any {nil },
328
+ Labels : []any {nil },
329
+ },
330
+ Source : & asyncapi.Source {},
331
+ Target : & asyncapi.Target {
332
+ Teams : []any {nil },
333
+ },
334
+ Resources : []any {nil },
335
+ },
336
+ Headers : map [string ][]byte {
337
+ "version" : []byte (asyncapi .Version ),
338
+ },
339
+ },
340
+ },
310
341
wantNParsed : 6 ,
311
342
},
312
343
{
@@ -431,6 +462,8 @@ func TestParse(t *testing.T) {
431
462
if nParsed != tc .wantNParsed {
432
463
t .Fatalf ("expected nParsed to be %d, but got %d" , tc .wantNParsed , nParsed )
433
464
}
465
+
466
+ // Verify async assets
434
467
topic := kclient .Topics [asyncapi .AssetsEntityName ]
435
468
gotAssets , err := testutil .ReadAllAssetsTopic (topic )
436
469
if err != nil {
@@ -445,6 +478,20 @@ func TestParse(t *testing.T) {
445
478
t .Fatalf ("want!=got, diff: %s" , diff )
446
479
}
447
480
481
+ // Verify async findings
482
+ topic = kclient .Topics [asyncapi .FindingsEntityName ]
483
+ gotFindings , err := testutil .ReadAllFindingsTopic (topic )
484
+ if err != nil {
485
+ t .Fatalf ("error reading findings from kafka %v" , err )
486
+ }
487
+ wantFindings := tc .wantAsyncFindings
488
+ sortSlices = cmpopts .SortSlices (func (a , b testutil.FindingTopicData ) bool {
489
+ return strings .Compare (a .Payload .Id , b .Payload .Id ) < 0
490
+ })
491
+ diff = cmp .Diff (wantFindings , gotFindings , sortSlices )
492
+ if diff != "" {
493
+ t .Fatalf ("want!=got, diff: %s" , diff )
494
+ }
448
495
})
449
496
}
450
497
}
@@ -464,7 +511,10 @@ func (n nullLogger) Debugf(s string, params ...any) {
464
511
}
465
512
466
513
func newTestAsyncAPI () (* asyncapi.Vulcan , kafka.Client , error ) {
467
- topics := map [string ]string {asyncapi .AssetsEntityName : "assets" }
514
+ topics := map [string ]string {
515
+ asyncapi .AssetsEntityName : "assets" ,
516
+ asyncapi .FindingsEntityName : "findings" ,
517
+ }
468
518
testTopics , err := testutil .PrepareKafka (topics )
469
519
if err != nil {
470
520
return nil , kafka.Client {}, fmt .Errorf ("error creating test topics: %v" , err )
0 commit comments