Skip to content

Commit 0d530bd

Browse files
SLVS-1387 Make sure the initial list of projects is restored when the filter is cleared.
It doesn't make sense when the filter is cleared to reload all the projects by asking SlCore, because the chance that the list of projects changed is low. Instead the advantage can be considerable for users that have more than 10.000 projects.
1 parent 65d6028 commit 0d530bd

File tree

2 files changed

+48
-6
lines changed

2 files changed

+48
-6
lines changed

src/ConnectedMode.UnitTests/UI/ProjectSelection/ProjectSelectionViewModelTests.cs

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,15 +125,16 @@ await progressReporterViewModel.Received(1)
125125
.ExecuteTaskWithProgressAsync(
126126
Arg.Is<TaskToPerformParams<AdapterResponseWithData<List<ServerProject>>>>(x =>
127127
x.ProgressStatus == UiResources.SearchingProjectInProgressText &&
128-
x.WarningText == UiResources.SearchingProjectFailedText &&
129-
x.AfterSuccess == testSubject.InitProjects));
128+
x.WarningText == UiResources.SearchingProjectFailedText));
130129
}
131130

132131
[TestMethod]
133-
public void ProjectSearchTerm_WithEmptyTerm_ShouldNotUpdateSearchResult()
132+
public void ProjectSearchTerm_WithEmptyTerm_ShouldRestoreInitialListOfProjects()
134133
{
135134
var viewModel = CreateInitializedTestSubjectWitNotMockedProgress();
135+
slCoreConnectionAdapter.FuzzySearchProjectsAsync(testSubject.ServerConnection, Arg.Any<string>()).Returns(new AdapterResponseWithData<List<ServerProject>>(true, []));
136136

137+
viewModel.ProjectSearchTerm = "myProject";
137138
viewModel.ProjectSearchTerm = "";
138139

139140
viewModel.ProjectResults.Should().BeEquivalentTo(AnInitialListOfProjects);
@@ -196,6 +197,34 @@ await progressReporterViewModel.Received(1)
196197
x.AfterSuccess == testSubject.InitProjects));
197198
}
198199

200+
[TestMethod]
201+
public async Task InitializeProjectWithProgressAsync_OnSuccess_CachesInitialServerProjects()
202+
{
203+
var viewModel = CreateTestSubjectWithNotMockedProgress();
204+
MockTrySonarQubeConnection(AConnectionInfo, success: true);
205+
var expectedServerProjects = new List<ServerProject> { new("proj1", "name1"), new("proj2", "name2") };
206+
slCoreConnectionAdapter.GetAllProjectsAsync(Arg.Any<ServerConnection>())
207+
.Returns(new AdapterResponseWithData<List<ServerProject>>(true, expectedServerProjects));
208+
209+
await viewModel.InitializeProjectWithProgressAsync();
210+
211+
viewModel.InitialServerProjects.Should().BeEquivalentTo(expectedServerProjects);
212+
}
213+
214+
[TestMethod]
215+
public async Task InitializeProjectWithProgressAsync_OnFailure_InitialServerProjectsIsEmpty()
216+
{
217+
var viewModel = CreateTestSubjectWithNotMockedProgress();
218+
MockTrySonarQubeConnection(AConnectionInfo, success: true);
219+
var expectedServerProjects = new List<ServerProject> { new("proj1", "name1"), new("proj2", "name2") };
220+
slCoreConnectionAdapter.GetAllProjectsAsync(Arg.Any<ServerConnection>())
221+
.Returns(new AdapterResponseWithData<List<ServerProject>>(false, expectedServerProjects));
222+
223+
await viewModel.InitializeProjectWithProgressAsync();
224+
225+
viewModel.InitialServerProjects.Should().BeEmpty();
226+
}
227+
199228
[TestMethod]
200229
public async Task AdapterGetAllProjectsAsync_GettingServerConnectionSucceeded_CallsAdapterWithCredentialsForServerConnection()
201230
{
@@ -264,8 +293,13 @@ private void MockTrySonarQubeConnection(ConnectionInfo connectionInfo, bool succ
264293

265294
private ProjectSelectionViewModel CreateInitializedTestSubjectWitNotMockedProgress()
266295
{
267-
var viewModel = new ProjectSelectionViewModel(AConnectionInfo, connectedModeServices, new ProgressReporterViewModel(logger));
296+
var viewModel = CreateTestSubjectWithNotMockedProgress();
268297
viewModel.InitProjects(new AdapterResponseWithData<List<ServerProject>>(true, AnInitialListOfProjects));
269298
return viewModel;
270299
}
300+
301+
private ProjectSelectionViewModel CreateTestSubjectWithNotMockedProgress()
302+
{
303+
return new ProjectSelectionViewModel(AConnectionInfo, connectedModeServices, new ProgressReporterViewModel(logger));
304+
}
271305
}

src/ConnectedMode/UI/ProjectSelection/ProjectSelectionViewModel.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public ServerProject SelectedProject
6363

6464
public bool IsProjectSelected => SelectedProject != null;
6565
public ServerConnection ServerConnection { get; private set; }
66+
public List<ServerProject> InitialServerProjects { get; private set; } = [];
6667

6768
private string projectSearchTerm;
6869
private ServerProject selectedProject;
@@ -93,9 +94,15 @@ internal async Task<AdapterResponseWithData<List<ServerProject>>> AdapterGetAllP
9394
}
9495

9596
internal void InitProjects(AdapterResponseWithData<List<ServerProject>> response)
97+
{
98+
FillProjects(response.ResponseData);
99+
InitialServerProjects = response.ResponseData;
100+
}
101+
102+
private void FillProjects(List<ServerProject> projects)
96103
{
97104
ProjectResults.Clear();
98-
foreach (var serverProject in response.ResponseData.OrderBy(p => p.Name))
105+
foreach (var serverProject in projects.OrderBy(p => p.Name))
99106
{
100107
ProjectResults.Add(serverProject);
101108
}
@@ -107,6 +114,7 @@ private void SearchForProject()
107114
{
108115
if (string.IsNullOrEmpty(ProjectSearchTerm))
109116
{
117+
FillProjects(InitialServerProjects);
110118
return;
111119
}
112120

@@ -120,7 +128,7 @@ private async Task SearchForProjectWithProgressAsync()
120128
UiResources.SearchingProjectInProgressText,
121129
UiResources.SearchingProjectFailedText)
122130
{
123-
AfterSuccess = InitProjects
131+
AfterSuccess = response => FillProjects(response.ResponseData)
124132
};
125133
await ProgressReporterViewModel.ExecuteTaskWithProgressAsync(initializeProjectsParams);
126134
}

0 commit comments

Comments
 (0)