5656import io .snyk .languageserver .LsBaseTest ;
5757import io .snyk .languageserver .ScanInProgressKey ;
5858import io .snyk .languageserver .ScanState ;
59+ import io .snyk .languageserver .SnykIssueCache ;
5960import io .snyk .languageserver .protocolextension .messageObjects .Diagnostic316 ;
6061import io .snyk .languageserver .protocolextension .messageObjects .HasAuthenticatedParam ;
6162import io .snyk .languageserver .protocolextension .messageObjects .PublishDiagnostics316Param ;
@@ -224,7 +225,7 @@ void testPublishDiagnosticsShouldChangeCache() {
224225 } catch (Exception ex ) {
225226 fail (ex );
226227 }
227-
228+
228229 }
229230
230231 @ Test
@@ -319,7 +320,7 @@ void testSnykScanSuccessAddsInfoNodes_IssuesFound_multipleFixable() {
319320
320321 pref .store (Preferences .FILTER_IGNORES_SHOW_IGNORED_ISSUES , "false" );
321322 pref .store (Preferences .FILTER_IGNORES_SHOW_OPEN_ISSUES , "true" );
322-
323+
323324 runInfoNodeTest (param , 4 , 2 , 0 , 3 , expectedFirstInfoNode , expectedSecondInfoNode , expectedThirdInfoNode );
324325 }
325326
@@ -366,7 +367,7 @@ void testSnykScanSuccessAddsInfoNodes_IssuesFound_onlyOpenDisplayed() {
366367 String expectedFirstInfoNode = "✋ 4 issues found by Snyk" ;
367368 String expectedSecondInfoNode = "⚡️ 2 issues can be fixed automatically" ;
368369 String expectedThirdInfoNode = "Adjust your Issue View Options to see open issues." ;
369-
370+
370371 runInfoNodeTest (param , 4 , 2 , 0 , 4 , expectedFirstInfoNode , expectedSecondInfoNode , expectedThirdInfoNode );
371372 }
372373
@@ -448,7 +449,7 @@ private HashSet<ProductTreeNode> setupProductNodes(SnykScanParam param) {
448449 }
449450 return productNodes ;
450451 }
451-
452+
452453 @ Test
453454 void testSnykScanAddsToScanStateHashMap () {
454455 var scanState = ScanState .getInstance ();
@@ -478,34 +479,34 @@ void testSnykScanAddsToScanStateHashMap() {
478479 actualState = scanState .isScanInProgress (expectedKey );
479480 assertEquals (false , actualState );
480481 }
481-
482- @ Test
482+
483+ @ Test
483484 void createProgressAddsTokenToProgressManager () {
484485 ProgressManager pmMock = mock (ProgressManager .class );
485486 cut = new SnykExtendedLanguageClient ();
486487 cut .setProgressMgr (pmMock );
487488 var params = new WorkDoneProgressCreateParams ();
488489 params .setToken ("a" );
489-
490+
490491 cut .createProgress (params );
491-
492+
492493 verify (pmMock ).addProgress ("a" );
493494 }
494-
495- @ Test
495+
496+ @ Test
496497 void notifyProgress_EndProgressRemovesFromProgressManager () {
497498 ProgressManager pmMock = mock (ProgressManager .class );
498499 cut = new SnykExtendedLanguageClient ();
499500 cut .setProgressMgr (pmMock );
500501 var params = cut .getEndProgressParam ("a" );
501502 params .setToken ("a" );
502-
503+
503504 cut .notifyProgress (params );
504-
505+
505506 verify (pmMock ).removeProgress ("a" );
506507 }
507-
508- @ Test
508+
509+ @ Test
509510 void notifyProgress_BeginProgressDoesNotRemoveFromProgressManager () {
510511 ProgressManager pmMock = mock (ProgressManager .class );
511512 cut = new SnykExtendedLanguageClient ();
@@ -516,13 +517,13 @@ void notifyProgress_BeginProgressDoesNotRemoveFromProgressManager() {
516517 Either <String , Integer > tokenEither = Either .forLeft ("a" );
517518 var progressParam = new ProgressParams (tokenEither , value );
518519 progressParam .setToken ("a" );
519-
520+
520521 cut .notifyProgress (progressParam );
521-
522+
522523 verifyNoInteractions (pmMock );
523524 }
524-
525- @ Test
525+
526+ @ Test
526527 void notifyProgress_ReportProgressDoesNotRemoveFromProgressManager () {
527528 ProgressManager pmMock = mock (ProgressManager .class );
528529 cut = new SnykExtendedLanguageClient ();
@@ -533,25 +534,50 @@ void notifyProgress_ReportProgressDoesNotRemoveFromProgressManager() {
533534 Either <String , Integer > tokenEither = Either .forLeft ("a" );
534535 var progressParam = new ProgressParams (tokenEither , value );
535536 progressParam .setToken ("a" );
536-
537+
537538 cut .notifyProgress (progressParam );
538-
539+
539540 verifyNoInteractions (pmMock );
540541 }
541-
542- @ Test
542+
543+ @ Test
543544 void cancelProgress_callsLSToCancel () {
544545 ProgressManager pmMock = mock (ProgressManager .class );
545546 LanguageServer lsMock = mock (LanguageServer .class );
546547 cut = new SnykExtendedLanguageClient ();
547548 cut .setLs (lsMock );
548549 cut .setProgressMgr (pmMock );
549-
550+
550551 cut .cancelProgress ("a" );
551-
552+
552553 // progressManager should call language client, but not the other way round
553554 // else we'd have an endless loop
554555 verifyNoInteractions (pmMock );
555556 verify (lsMock ).cancelProgress (Mockito .any ());
556557 }
558+
559+ @ Test
560+ void testGetTotal () {
561+ cut = new SnykExtendedLanguageClient ();
562+ ProductTreeNode productTreeNode = new ProductTreeNode (DISPLAYED_CODE_SECURITY );
563+ SnykIssueCache issueCache = new SnykIssueCache ();
564+ var issues = new HashSet <Issue >();
565+ var highIssue = Instancio .of (Issue .class ).set (Select .field (Issue ::additionalData ), getSecurityIssue ())
566+ .set (Select .field (Issue ::severity ), "high" ).create ();
567+ var mediumIssue = Instancio .of (Issue .class ).set (Select .field (Issue ::additionalData ), getSecurityIssue ())
568+ .set (Select .field (Issue ::severity ), "medium" ).create ();
569+ var lowIssue = Instancio .of (Issue .class ).set (Select .field (Issue ::additionalData ), getSecurityIssue ())
570+ .set (Select .field (Issue ::severity ), "low" ).create ();
571+ issues .addAll (Set .of (highIssue , mediumIssue , lowIssue ));
572+
573+ issueCache .addCodeIssues ("a/b/c" , issues );
574+
575+ var actual = cut .getCountsSuffix (productTreeNode , issueCache );
576+
577+ assertEquals ("3 unique vulnerabilities: 0 critical, 1 high, 1 medium, 1 low" , actual );
578+ }
579+
580+ private AdditionalData getSecurityIssue () {
581+ return Instancio .of (AdditionalData .class ).set (Select .field (AdditionalData ::isSecurityType ), true ).create ();
582+ }
557583}
0 commit comments