Skip to content

Commit 8d0f9a6

Browse files
SLVS-2519 Add back label that is shown when no findings are displayed
1 parent 07d0d05 commit 8d0f9a6

File tree

7 files changed

+49
-48
lines changed

7 files changed

+49
-48
lines changed

src/IssueViz.Security.UnitTests/DependencyRisks/GroupDependencyRiskViewModelTest.cs

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -71,27 +71,6 @@ public void InitializeRisks_InitializesRisks()
7171
testSubject.Risks.Should().ContainSingle(vm => vm.DependencyRisk == dependencyRisk2);
7272
}
7373

74-
[TestMethod]
75-
public void InitializeRisks_RaisesPropertyChanged()
76-
{
77-
testSubject.InitializeRisks();
78-
79-
eventHandler.Received(1).Invoke(Arg.Any<object>(), Arg.Is<PropertyChangedEventArgs>(p => p.PropertyName == nameof(testSubject.HasRisks)));
80-
}
81-
82-
[TestMethod]
83-
public void HasRisks_ReturnsTrue_WhenThereAreRisks()
84-
{
85-
MockRisksInStore(CreateDependencyRisk());
86-
87-
testSubject.InitializeRisks();
88-
89-
testSubject.HasRisks.Should().BeTrue();
90-
}
91-
92-
[TestMethod]
93-
public void HasRisks_ReturnsFalse_WhenThereAreNoRisks() => testSubject.HasRisks.Should().BeFalse();
94-
9574
[TestMethod]
9675
public void InitializeRisks_DefaultFilters_FilteredRisksContainsOnlyOpen()
9776
{
@@ -111,7 +90,6 @@ public void InitializeRisks_NoRisks_FilteredRisksIsEmpty()
11190

11291
testSubject.InitializeRisks();
11392

114-
testSubject.HasRisks.Should().BeFalse();
11593
VerifyRisks();
11694
VerifyFilteredRisks();
11795
VerifyUpdatedBothRiskLists();
@@ -125,7 +103,6 @@ public void InitializeRisks_PassAllFilter_FilteredRisksContainsAll()
125103

126104
testSubject.InitializeRisks();
127105

128-
testSubject.HasRisks.Should().BeTrue();
129106
VerifyRisks(risks);
130107
VerifyFilteredRisks(risks);
131108
VerifyUpdatedBothRiskLists();
@@ -140,7 +117,6 @@ public void InitializeRisks_FixedRisks_FilteredRisksDoNotContainRisksAlreadyFixe
140117

141118
testSubject.InitializeRisks();
142119

143-
testSubject.HasRisks.Should().BeTrue();
144120
testSubject.Risks.Should().NotContain(vm => vm.DependencyRisk.Status == DependencyRiskStatus.Fixed);
145121
VerifyRisks(risks);
146122
VerifyFilteredRisks(risks);
@@ -151,7 +127,6 @@ private void VerifyUpdatedBothRiskLists()
151127
dependencyRisksStore.Received().GetAll();
152128
ReceivedEvent(nameof(testSubject.FilteredIssues));
153129
ReceivedEvent(nameof(testSubject.Risks));
154-
ReceivedEvent(nameof(testSubject.HasRisks));
155130
}
156131

157132
private void SetInitialRisks(IDependencyRisk[] state)

src/IssueViz.Security.UnitTests/ReportView/ReportViewModelTest.cs

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1919
*/
2020

21+
using System.ComponentModel;
2122
using System.Windows;
2223
using SonarLint.VisualStudio.Core;
2324
using SonarLint.VisualStudio.Core.Analysis;
@@ -45,6 +46,7 @@ public class ReportViewModelTest
4546
private IMessageBox messageBox;
4647
private ITelemetryManager telemetryManager;
4748
private IThreadHandling threadHandling;
49+
private PropertyChangedEventHandler eventHandler;
4850

4951
[TestInitialize]
5052
public void Initialize()
@@ -57,6 +59,7 @@ public void Initialize()
5759
messageBox = Substitute.For<IMessageBox>();
5860
telemetryManager = Substitute.For<ITelemetryManager>();
5961
threadHandling = Substitute.ForPartsOf<NoOpThreadHandler>();
62+
eventHandler = Substitute.For<PropertyChangedEventHandler>();
6063

6164
testSubject = CreateTestSubject();
6265
}
@@ -309,6 +312,7 @@ public void HotspotsAddedInStore_DoesNotUpdateDependencyRisks()
309312
localHotspotsStore.IssuesChanged += Raise.EventWith(testSubject, new IssuesChangedEventArgs([], []));
310313

311314
dependencyRisksStore.DidNotReceive().GetAll();
315+
VerifyHasGroupsUpdated();
312316
}
313317

314318
[TestMethod]
@@ -362,6 +366,7 @@ public void HotspotsRemovedFromStore_DoesNotUpdateDependencyRisks()
362366
localHotspotsStore.IssuesChanged += Raise.EventWith(testSubject, new IssuesChangedEventArgs([], []));
363367

364368
dependencyRisksStore.DidNotReceive().GetAll();
369+
VerifyHasGroupsUpdated();
365370
}
366371

367372
[TestMethod]
@@ -402,6 +407,7 @@ public void DependencyRisksAddedInStore_DoesNotUpdateHotspots()
402407
dependencyRisksStore.DependencyRisksChanged += Raise.Event<EventHandler>();
403408

404409
localHotspotsStore.DidNotReceive().GetAll();
410+
VerifyHasGroupsUpdated();
405411
}
406412

407413
[TestMethod]
@@ -441,17 +447,34 @@ public void DependencyRisksRemovedFromStore_DoesNotUpdateHotspots()
441447
dependencyRisksStore.DependencyRisksChanged += Raise.Event<EventHandler>();
442448

443449
localHotspotsStore.DidNotReceive().GetAll();
450+
VerifyHasGroupsUpdated();
444451
}
445452

446-
private ReportViewModel CreateTestSubject() =>
447-
new(activeSolutionBoundTracker,
453+
[TestMethod]
454+
public void HasRisks_ReturnsTrue_WhenThereAreRisks()
455+
{
456+
MockRisksInStore(CreateDependencyRisk());
457+
testSubject = CreateTestSubject();
458+
459+
testSubject.HasGroups.Should().BeTrue();
460+
}
461+
462+
[TestMethod]
463+
public void HasRisks_ReturnsFalse_WhenThereAreNoRisks() => testSubject.HasGroups.Should().BeFalse();
464+
465+
private ReportViewModel CreateTestSubject()
466+
{
467+
var reportViewModel = new ReportViewModel(activeSolutionBoundTracker,
448468
dependencyRisksStore,
449469
localHotspotsStore,
450470
showDependencyRiskInBrowserHandler,
451471
changeDependencyRiskStatusHandler,
452472
messageBox,
453473
telemetryManager,
454474
threadHandling);
475+
reportViewModel.PropertyChanged += eventHandler;
476+
return reportViewModel;
477+
}
455478

456479
private static IDependencyRisk CreateDependencyRisk(Guid? id = null, bool isResolved = false)
457480
{
@@ -476,18 +499,18 @@ private static LocalHotspot CreateMockedHotspot(string filePath)
476499

477500
private void MockHotspotsInStore(params LocalHotspot[] hotspots) => localHotspotsStore.GetAllLocalHotspots().Returns(hotspots);
478501

479-
private void VerifyExpectedHotspotGroupViewModel(GroupFileViewModel groupFileVm, params LocalHotspot[] expectedHotspots)
502+
private static void VerifyExpectedHotspotGroupViewModel(GroupFileViewModel groupFileVm, params LocalHotspot[] expectedHotspots)
480503
{
481504
groupFileVm.Should().NotBeNull();
482-
groupFileVm.FilePath.Should().Be(expectedHotspots.First().Visualization.Issue.PrimaryLocation.FilePath);
505+
groupFileVm.FilePath.Should().Be(expectedHotspots[0].Visualization.Issue.PrimaryLocation.FilePath);
483506
groupFileVm.FilteredIssues.Should().HaveCount(expectedHotspots.Length);
484507
foreach (var expectedHotspot in expectedHotspots)
485508
{
486509
groupFileVm.FilteredIssues.Should().ContainSingle(vm => ((HotspotViewModel)vm).LocalHotspot == expectedHotspot);
487510
}
488511
}
489512

490-
private void VerifyExpectedDependencyRiskGroupViewModel(GroupDependencyRiskViewModel dependencyRiskGroupVm, params IDependencyRisk[] expectedDependencyRisks)
513+
private static void VerifyExpectedDependencyRiskGroupViewModel(GroupDependencyRiskViewModel dependencyRiskGroupVm, params IDependencyRisk[] expectedDependencyRisks)
491514
{
492515
dependencyRiskGroupVm.Should().NotBeNull();
493516
dependencyRiskGroupVm.FilteredIssues.Should().HaveCount(expectedDependencyRisks.Length);
@@ -496,4 +519,6 @@ private void VerifyExpectedDependencyRiskGroupViewModel(GroupDependencyRiskViewM
496519
dependencyRiskGroupVm.FilteredIssues.Should().ContainSingle(vm => ((DependencyRiskViewModel)vm).DependencyRisk == expectedDependencyRisk);
497520
}
498521
}
522+
523+
private void VerifyHasGroupsUpdated() => eventHandler.Received().Invoke(Arg.Any<object>(), Arg.Is<PropertyChangedEventArgs>(p => p.PropertyName == nameof(testSubject.HasGroups)));
499524
}

src/IssueViz.Security/DependencyRisks/GroupDependencyRiskViewModel.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ public GroupDependencyRiskViewModel(IDependencyRisksStore dependencyRisksStore)
3939
public string Title => Resources.DependencyRisksGroupTitle;
4040
public ObservableCollection<DependencyRiskViewModel> Risks => risks;
4141
public ObservableCollection<IIssueViewModel> FilteredIssues => filteredRisks;
42-
public bool HasRisks => risks.Count > 0;
4342

4443
public void InitializeRisks()
4544
{
@@ -56,7 +55,6 @@ public void InitializeRisks()
5655
}
5756
RefreshFiltering();
5857
RaisePropertyChanged(nameof(Risks));
59-
RaisePropertyChanged(nameof(HasRisks));
6058
}
6159

6260
public void Dispose() { }

src/IssueViz.Security/ReportView/ReportViewControl.xaml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
xmlns:hotspots="clr-namespace:SonarLint.VisualStudio.IssueVisualization.Security.ReportView.Hotspots"
1212
xmlns:imaging="clr-namespace:Microsoft.VisualStudio.Imaging;assembly=Microsoft.VisualStudio.Imaging"
1313
xmlns:vsimagecatalog="clr-namespace:Microsoft.VisualStudio.Imaging;assembly=Microsoft.VisualStudio.ImageCatalog"
14+
xmlns:core="clr-namespace:SonarLint.VisualStudio.Core;assembly=SonarLint.VisualStudio.Core"
1415
DataContext="{Binding RelativeSource={RelativeSource Mode=Self}, Path=ReportViewModel}">
1516
<UserControl.Resources>
1617
<ResourceDictionary>
@@ -25,6 +26,7 @@
2526
<reportView:FileNameToMonikerConverter x:Key="FileNameToMonikerConverter" />
2627
<hotspots:HotspotTooltipConverter x:Key="HotspotTooltipConverter" />
2728
<wpf:BoolToVisibilityConverter x:Key="TrueToVisibleConverter" FalseValue="Collapsed" TrueValue="Visible" />
29+
<wpf:BoolToVisibilityConverter x:Key="TrueToCollapsedConverter" FalseValue="Visible" TrueValue="Collapsed"/>
2830
<wpf:EnglishPluralizationConverter x:Key="EnglishPluralizationConverter" />
2931
<wpf:PascalCaseEnumToSpacedStringConverter x:Key="PascalCaseEnumToSpacedStringConverter" />
3032

@@ -377,23 +379,21 @@
377379
</TreeView.Resources>
378380
</TreeView>
379381

380-
<!--TODO by SLVS-2519 show a more generic message when no issues exist-->
381-
<!--<Grid Grid.Row="1" Background="{DynamicResource {x:Static vsShell:VsBrushes.BrandedUIBackgroundKey}}"
382+
<Grid Grid.Row="1" Background="{DynamicResource {x:Static vsShell:VsBrushes.BrandedUIBackgroundKey}}"
382383
Panel.ZIndex="1000"
383-
Visibility="{Binding Path=GroupDependencyRisk.HasRisks, Converter={StaticResource TrueToCollapsedConverter}}">
384+
Visibility="{Binding Path=HasGroups, Converter={StaticResource TrueToCollapsedConverter}}">
384385
<StackPanel VerticalAlignment="Center">
385386
<TextBlock Style="{StaticResource OverlayTitleTextStyle}"
386-
Text="{x:Static res:Resources.NoDependencyRiskFoundTitle}"
387+
Text="{x:Static res:Resources.NoFindingsToDisplayTitle}"
387388
Margin="0,10" />
388389
<TextBlock Style="{StaticResource OverlayTextBlockStyle}">
389390
<Run Text="{x:Static res:Resources.NoDependencyRiskFoundText}" /><Run Text=" (see " />
390-
<Hyperlink NavigateUri="{x:Static core:DocumentationLinks.DependencyRisksUri}"
391+
<Hyperlink NavigateUri="{x:Static core:DocumentationLinks.ConnectedModeUri}"
391392
RequestNavigate="Hyperlink_OnRequestNavigate">
392393
documentation
393-
</Hyperlink>
394-
<Run Text="). " />
394+
</Hyperlink><Run Text="). " />
395395
</TextBlock>
396396
</StackPanel>
397-
</Grid>-->
397+
</Grid>
398398
</Grid>
399399
</UserControl>

src/IssueViz.Security/ReportView/ReportViewModel.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public ReportViewModel(
6969
}
7070

7171
public ObservableCollection<IGroupViewModel> GroupViewModels { get; } = [];
72+
public bool HasGroups => GroupViewModels.Count > 0;
7273

7374
public IIssueViewModel SelectedItem
7475
{
@@ -151,17 +152,19 @@ private void InitializeDependencyRisks()
151152
{
152153
var groupDependencyRisk = new GroupDependencyRiskViewModel(dependencyRisksStore);
153154
groupDependencyRisk.InitializeRisks();
154-
if (groupDependencyRisk.HasRisks)
155+
if (groupDependencyRisk.FilteredIssues.Any())
155156
{
156157
GroupViewModels.Add(groupDependencyRisk);
157158
}
159+
RaisePropertyChanged(nameof(HasGroups));
158160
}
159161

160162
private void InitializeHotspots()
161163
{
162164
var hotspots = hotspotsStore.GetAllLocalHotspots().Select(x => new HotspotViewModel(x));
163165
var groups = GetGroupViewModel(hotspots);
164166
groups.ToList().ForEach(g => GroupViewModels.Add(g));
167+
RaisePropertyChanged(nameof(HasGroups));
165168
}
166169

167170
private ObservableCollection<IGroupViewModel> GetGroupViewModel(IEnumerable<IIssueViewModel> issueViewModels)

src/IssueViz.Security/Resources.Designer.cs

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/IssueViz.Security/Resources.resx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -252,10 +252,10 @@ Please check the logs for more details.</value>
252252
<value>Severity impact:</value>
253253
</data>
254254
<data name="NoDependencyRiskFoundText" xml:space="preserve">
255-
<value>Please ensure that your solution is bound to a SonarQube project that contains dependency risks</value>
255+
<value>Please ensure that your solution is bound to a SonarQube project</value>
256256
</data>
257-
<data name="NoDependencyRiskFoundTitle" xml:space="preserve">
258-
<value>No Dependency Risks were found.</value>
257+
<data name="NoFindingsToDisplayTitle" xml:space="preserve">
258+
<value>No findings to display.</value>
259259
</data>
260260
<data name="IssueText" xml:space="preserve">
261261
<value>issue</value>

0 commit comments

Comments
 (0)