@@ -94,7 +94,7 @@ public void Should_Initialize_Issue_Provider()
94
94
_ = fixture . ReadIssues ( ) ;
95
95
96
96
// Then
97
- fixture . IssueProviders . ShouldAllBe ( x => x . Settings == fixture . Settings ) ;
97
+ fixture . IssueProviders . OfType < FakeIssueProvider > ( ) . ShouldAllBe ( x => x . Settings == fixture . Settings ) ;
98
98
}
99
99
100
100
[ Fact ]
@@ -142,7 +142,7 @@ public void Should_Initialize_All_Issue_Provider()
142
142
_ = fixture . ReadIssues ( ) ;
143
143
144
144
// Then
145
- fixture . IssueProviders . ShouldAllBe ( x => x . Settings == fixture . Settings ) ;
145
+ fixture . IssueProviders . OfType < FakeIssueProvider > ( ) . ShouldAllBe ( x => x . Settings == fixture . Settings ) ;
146
146
}
147
147
148
148
[ Fact ]
@@ -349,5 +349,91 @@ public void Should_Set_FileLink_Property()
349
349
issue2 . FileLink . ToString ( )
350
350
. ShouldBe ( $ "{ repoUrl } /blob/{ branch } /{ filePath2 . Replace ( @"\" , "/" ) } #L{ line2 } ") ;
351
351
}
352
+
353
+ [ Fact ]
354
+ public void Should_Read_Issues_From_Multiple_Providers_Concurrently ( )
355
+ {
356
+ // Given
357
+ const int providerCount = 10 ;
358
+ const int issuesPerProvider = 100 ;
359
+ var fixture = new IssuesFixture ( ) ;
360
+ fixture . IssueProviders . Clear ( ) ;
361
+
362
+ // Create multiple providers with different issues
363
+ for ( var i = 0 ; i < providerCount ; i ++ )
364
+ {
365
+ var providerIssues = new List < IIssue > ( ) ;
366
+ for ( var j = 0 ; j < issuesPerProvider ; j ++ )
367
+ {
368
+ var issue = IssueBuilder
369
+ . NewIssue ( $ "Issue{ i } -{ j } ", $ "ProviderType{ i } ", $ "ProviderName{ i } ")
370
+ . InFile ( $@ "src\Provider{ i } \File{ j } .cs", j + 1 )
371
+ . OfRule ( $ "Rule{ j } ")
372
+ . WithPriority ( IssuePriority . Warning )
373
+ . Create ( ) ;
374
+ providerIssues . Add ( issue ) ;
375
+ }
376
+ fixture . IssueProviders . Add ( new FakeIssueProvider ( fixture . Log , providerIssues ) ) ;
377
+ }
378
+
379
+ // When
380
+ var stopwatch = System . Diagnostics . Stopwatch . StartNew ( ) ;
381
+ var issues = fixture . ReadIssues ( ) . ToList ( ) ;
382
+ stopwatch . Stop ( ) ;
383
+
384
+ // Then
385
+ issues . Count . ShouldBe ( providerCount * issuesPerProvider ) ;
386
+
387
+ // Verify all providers contributed issues
388
+ for ( var i = 0 ; i < providerCount ; i ++ )
389
+ {
390
+ var providerIssues = issues . Where ( x => x . ProviderType == $ "ProviderType{ i } ") . ToList ( ) ;
391
+ providerIssues . Count . ShouldBe ( issuesPerProvider ) ;
392
+ }
393
+
394
+ // Verify all Run properties are set
395
+ issues . ShouldAllBe ( x => x . Run == fixture . Settings . Run ) ;
396
+
397
+ // Log timing for performance verification
398
+ System . Console . WriteLine ( $ "Reading { issues . Count } issues from { providerCount } providers took { stopwatch . ElapsedMilliseconds } ms") ;
399
+ }
400
+
401
+ [ Fact ]
402
+ public void Should_Handle_Provider_Initialization_Failures_Concurrently ( )
403
+ {
404
+ // Given
405
+ var fixture = new IssuesFixture ( ) ;
406
+ fixture . IssueProviders . Clear ( ) ;
407
+
408
+ // Add mix of successful and failing providers
409
+ fixture . IssueProviders . Add ( new FakeIssueProvider ( fixture . Log , [
410
+ IssueBuilder . NewIssue ( "Success1" , "ProviderType1" , "ProviderName1" )
411
+ . InFile ( @"src\File1.cs" , 1 )
412
+ . OfRule ( "Rule1" )
413
+ . WithPriority ( IssuePriority . Warning )
414
+ . Create ( )
415
+ ] ) ) ;
416
+
417
+ // Create a failing provider by passing null settings later
418
+ var failingProvider = new FakeFailingIssueProvider ( fixture . Log ) ;
419
+ fixture . IssueProviders . Add ( failingProvider ) ;
420
+
421
+ fixture . IssueProviders . Add ( new FakeIssueProvider ( fixture . Log , [
422
+ IssueBuilder . NewIssue ( "Success2" , "ProviderType2" , "ProviderName2" )
423
+ . InFile ( @"src\File2.cs" , 2 )
424
+ . OfRule ( "Rule2" )
425
+ . WithPriority ( IssuePriority . Warning )
426
+ . Create ( )
427
+ ] ) ) ;
428
+
429
+ // When
430
+ var issues = fixture . ReadIssues ( ) . ToList ( ) ;
431
+
432
+ // Then
433
+ // Should get issues from successful providers only
434
+ issues . Count . ShouldBe ( 2 ) ;
435
+ issues . ShouldContain ( x => x . MessageText == "Success1" ) ;
436
+ issues . ShouldContain ( x => x . MessageText == "Success2" ) ;
437
+ }
352
438
}
353
439
}
0 commit comments