Skip to content

Commit 9f475ea

Browse files
1 parent 919025f commit 9f475ea

File tree

8 files changed

+247
-233
lines changed

8 files changed

+247
-233
lines changed

src/ConnectedMode.UnitTests/SlCoreConnectionAdapterTests.cs

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

21-
using NSubstitute.ExceptionExtensions;
2221
using SonarLint.VisualStudio.ConnectedMode.UI.Credentials;
2322
using SonarLint.VisualStudio.ConnectedMode.UI.OrganizationSelection;
24-
using SonarLint.VisualStudio.ConnectedMode.UI.Resources;
2523
using SonarLint.VisualStudio.Core;
2624
using SonarLint.VisualStudio.SLCore;
2725
using SonarLint.VisualStudio.SLCore.Common.Models;
@@ -64,7 +62,7 @@ public async Task ValidateConnectionAsync_SwitchesToBackgroundThread()
6462

6563
await slCoreConnectionAdapter.ValidateConnectionAsync(sonarQubeConnectionInfo, "myToken");
6664

67-
await threadHandlingMock.Received(1).RunOnBackgroundThread(Arg.Any<Func<Task<ValidateConnectionResponse>>>());
65+
await threadHandlingMock.Received(1).RunOnBackgroundThread(Arg.Any<Func<Task<AdapterResponse>>>());
6866
}
6967

7068
[TestMethod]
@@ -75,8 +73,7 @@ public async Task ValidateConnectionAsync_GettingConnectionConfigurationSLCoreSe
7573
var response = await testSubject.ValidateConnectionAsync(sonarQubeConnectionInfo, "myToken");
7674

7775
logger.Received(1).LogVerbose($"[{nameof(IConnectionConfigurationSLCoreService)}] {SLCoreStrings.ServiceProviderNotInitialized}");
78-
response.success.Should().BeFalse();
79-
response.message.Should().Be(UiResources.ValidatingConnectionFailedText);
76+
response.Success.Should().BeFalse();
8077
}
8178

8279
[TestMethod]
@@ -135,7 +132,7 @@ public async Task ValidateConnectionAsync_ReturnsResponseFromSlCore(bool success
135132

136133
var response = await testSubject.ValidateConnectionAsync(sonarCloudConnectionInfo, "token");
137134

138-
response.Should().BeEquivalentTo(expectedResponse);
135+
response.Success.Should().Be(success);
139136
}
140137

141138
[TestMethod]
@@ -148,8 +145,7 @@ public async Task ValidateConnectionAsync_SlCoreValidationThrowsException_Return
148145
var response = await testSubject.ValidateConnectionAsync(sonarCloudConnectionInfo, "token");
149146

150147
logger.Received(1).LogVerbose($"{Resources.ValidateCredentials_Fails}: {exceptionMessage}");
151-
response.success.Should().BeFalse();
152-
response.message.Should().Be(exceptionMessage);
148+
response.Success.Should().BeFalse();
153149
}
154150

155151
[TestMethod]
@@ -160,7 +156,7 @@ public async Task GetOrganizationsAsync_SwitchesToBackgroundThread()
160156

161157
await slCoreConnectionAdapter.GetOrganizationsAsync(new TokenCredentialsModel("token"));
162158

163-
await threadHandlingMock.Received(1).RunOnBackgroundThread(Arg.Any<Func<Task<AdapterResponse<List<OrganizationDisplay>>>>>());
159+
await threadHandlingMock.Received(1).RunOnBackgroundThread(Arg.Any<Func<Task<AdapterResponseWithData<List<OrganizationDisplay>>>>>());
164160
}
165161

166162
[TestMethod]

src/ConnectedMode.UnitTests/UI/Credentials/CredentialsViewModelTests.cs

Lines changed: 17 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.IO;
2323
using SonarLint.VisualStudio.ConnectedMode.UI;
2424
using SonarLint.VisualStudio.ConnectedMode.UI.Credentials;
25+
using SonarLint.VisualStudio.ConnectedMode.UI.OrganizationSelection;
2526
using SonarLint.VisualStudio.ConnectedMode.UI.Resources;
2627
using SonarLint.VisualStudio.SLCore.Service.Connection;
2728

@@ -275,26 +276,26 @@ public void AccountSecurityUrl_ConnectionIsSonarQube_ReturnsSonarQubeUrl()
275276
}
276277

277278
[TestMethod]
278-
public async Task ValidateConnectionAsync_TokenIsProvided_ShouldValidateConnectionWithToken()
279+
public async Task AdapterValidateConnectionAsync_TokenIsProvided_ShouldValidateConnectionWithToken()
279280
{
280281
MockAdapterValidateConnectionAsync();
281282
testSubject.SelectedAuthenticationType = UiResources.AuthenticationTypeOptionToken;
282283
testSubject.Token = "dummyToken";
283284

284-
await testSubject.ValidateConnectionAsync();
285+
await testSubject.AdapterValidateConnectionAsync();
285286

286287
await slCoreConnectionAdapter.Received(1).ValidateConnectionAsync(testSubject.ConnectionInfo, testSubject.Token);
287288
}
288289

289290
[TestMethod]
290-
public async Task ValidateConnectionAsync_CredentialsAreProvided_ShouldValidateConnectionWithToken()
291+
public async Task AdapterValidateConnectionAsync_CredentialsAreProvided_ShouldValidateConnectionWithToken()
291292
{
292293
MockAdapterValidateConnectionAsync();
293294
testSubject.SelectedAuthenticationType = UiResources.AuthenticationTypeOptionCredentials;
294295
testSubject.Username = "username";
295296
testSubject.Password = "password";
296297

297-
await testSubject.ValidateConnectionAsync();
298+
await testSubject.AdapterValidateConnectionAsync();
298299

299300
await slCoreConnectionAdapter.Received(1).ValidateConnectionAsync(testSubject.ConnectionInfo, testSubject.Username, testSubject.Password);
300301
}
@@ -304,74 +305,24 @@ public async Task ValidateConnectionAsync_CredentialsAreProvided_ShouldValidateC
304305
[DataRow(false)]
305306
public async Task ValidateConnectionAsync_ReturnsResponseFromSlCore(bool success)
306307
{
307-
MockAdapterValidateConnectionAsync(success);
308+
progressReporterViewModel.ExecuteTaskWithProgressAsync(Arg.Any<TaskToPerformParams<AdapterResponse>>()).Returns(new AdapterResponse(success));
308309

309310
var response = await testSubject.ValidateConnectionAsync();
310311

311312
response.Should().Be(success);
312313
}
313314

314315
[TestMethod]
315-
public async Task ValidateConnectionAsync_UpdatesProgress()
316-
{
317-
MockAdapterValidateConnectionAsync();
318-
319-
await testSubject.ValidateConnectionAsync();
320-
321-
Received.InOrder(() =>
322-
{
323-
progressReporterViewModel.ProgressStatus = UiResources.ValidatingConnectionProgressText;
324-
slCoreConnectionAdapter.ValidateConnectionAsync(Arg.Any<ConnectionInfo>(), Arg.Any<string>());
325-
progressReporterViewModel.ProgressStatus = null;
326-
});
327-
}
328-
329-
[TestMethod]
330-
public async Task ValidateConnectionAsync_AdapterValidationThrowsException_SetsProgressToNull()
331-
{
332-
testSubject.ProgressReporterViewModel.ProgressStatus.Returns(UiResources.ValidatingConnectionProgressText);
333-
334-
await RunAdapterValidationThrowingException();
335-
336-
testSubject.ProgressReporterViewModel.Received(1).ProgressStatus = null;
337-
}
338-
339-
[TestMethod]
340-
public async Task ValidateConnectionAsync_AdapterValidationFails_UpdatesWarning()
341-
{
342-
var warning = "wrong credentials";
343-
MockAdapterValidateConnectionAsync(success:false, message: warning);
344-
345-
await testSubject.ValidateConnectionAsync();
346-
347-
progressReporterViewModel.Received(1).Warning = warning;
348-
}
349-
350-
[TestMethod]
351-
public async Task ValidateConnectionAsync_AdapterValidationSucceeds_DoesNotUpdateWarning()
316+
public async Task ValidateConnectionAsync_ReturnsResponseFromSlCore()
352317
{
353-
var warning = "correct credentials";
354-
MockAdapterValidateConnectionAsync(success: true, message: warning);
355-
356318
await testSubject.ValidateConnectionAsync();
357319

358-
progressReporterViewModel.DidNotReceive().Warning = warning;
359-
}
360-
361-
[TestMethod]
362-
public async Task ValidateConnectionAsync_ResetsPreviousWarningBeforeValidation()
363-
{
364-
var warning = "correct credentials";
365-
MockAdapterValidateConnectionAsync(success: false, message: warning);
366-
367-
await testSubject.ValidateConnectionAsync();
368-
369-
Received.InOrder(() =>
370-
{
371-
progressReporterViewModel.Warning = null;
372-
slCoreConnectionAdapter.ValidateConnectionAsync(Arg.Any<ConnectionInfo>(), Arg.Any<string>());
373-
progressReporterViewModel.Warning = warning;
374-
});
320+
await progressReporterViewModel.Received(1)
321+
.ExecuteTaskWithProgressAsync(Arg.Is<TaskToPerformParams<AdapterResponse>>(x =>
322+
x.TaskToPerform == testSubject.AdapterValidateConnectionAsync &&
323+
x.ProgressStatus == UiResources.ValidatingConnectionProgressText &&
324+
x.WarningText == UiResources.ValidatingConnectionFailedText &&
325+
x.AfterProgressUpdated == testSubject.AfterProgressStatusUpdated));
375326
}
376327

377328
[TestMethod]
@@ -381,7 +332,7 @@ public void UpdateProgressStatus_RaisesEvents()
381332
testSubject.PropertyChanged += eventHandler;
382333
eventHandler.ReceivedCalls().Should().BeEmpty();
383334

384-
testSubject.UpdateProgressStatus(null);
335+
testSubject.AfterProgressStatusUpdated();
385336

386337
eventHandler.Received().Invoke(testSubject, Arg.Is<PropertyChangedEventArgs>(x => x.PropertyName == nameof(testSubject.IsConfirmationEnabled)));
387338
}
@@ -415,26 +366,12 @@ public void GetCredentialsModel_SelectedAuthenticationTypeIsCredentials_ReturnsM
415366
((UsernamePasswordModel)credentialsModel).Password.Should().Be(testSubject.Password);
416367
}
417368

418-
private void MockAdapterValidateConnectionAsync(bool success = true, string message = null)
369+
private void MockAdapterValidateConnectionAsync(bool success = true)
419370
{
420371
slCoreConnectionAdapter.ValidateConnectionAsync(Arg.Any<ConnectionInfo>(), Arg.Any<string>())
421-
.Returns(new ValidateConnectionResponse(success, message));
372+
.Returns(new AdapterResponse(success));
422373
slCoreConnectionAdapter.ValidateConnectionAsync(Arg.Any<ConnectionInfo>(), Arg.Any<string>(), Arg.Any<string>())
423-
.Returns(new ValidateConnectionResponse(success, message));
424-
}
425-
426-
private async Task RunAdapterValidationThrowingException()
427-
{
428-
slCoreConnectionAdapter.When(x => x.ValidateConnectionAsync(Arg.Any<ConnectionInfo>(), Arg.Any<string>()))
429-
.Do(x => throw new Exception("testing"));
430-
try
431-
{
432-
await testSubject.ValidateConnectionAsync();
433-
}
434-
catch (Exception)
435-
{
436-
// this is only for testing purposes
437-
}
374+
.Returns(new AdapterResponse(success));
438375
}
439376
}
440377
}

src/ConnectedMode.UnitTests/UI/OrganizationSelection/OrganizationSelectionViewModelTests.cs

Lines changed: 17 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -164,119 +164,53 @@ public void AddOrganization_AddsToList()
164164
}
165165

166166
[TestMethod]
167-
public async Task LoadOrganizationsAsync_UpdatesProgress()
167+
public async Task LoadOrganizationsAsync_AddsOrganization()
168168
{
169-
MockAdapterLoadOrganizationsAsync();
170-
171169
await testSubject.LoadOrganizationsAsync();
172170

173-
Received.InOrder(() =>
174-
{
175-
progressReporterViewModel.ProgressStatus = UiResources.LoadingOrganizationsProgressText;
176-
slCoreConnectionAdapter.GetOrganizationsAsync(Arg.Any<ICredentialsModel>());
177-
progressReporterViewModel.ProgressStatus = null;
178-
});
179-
}
180-
181-
[TestMethod]
182-
public async Task LoadOrganizationsAsync_AdapterThrowsException_SetsProgressToNull()
183-
{
184-
testSubject.ProgressReporterViewModel.ProgressStatus.Returns(UiResources.LoadingOrganizationsProgressText);
185-
186-
await ExecuteLoadOrganizationsAsyncThrowingException();
187-
188-
testSubject.ProgressReporterViewModel.Received(1).ProgressStatus = null;
171+
await progressReporterViewModel.Received(1)
172+
.ExecuteTaskWithProgressAsync(
173+
Arg.Is<TaskToPerformParams<AdapterResponseWithData<List<OrganizationDisplay>>>>(x =>
174+
x.TaskToPerform == testSubject.AdapterLoadOrganizationsAsync &&
175+
x.ProgressStatus == UiResources.LoadingOrganizationsProgressText &&
176+
x.WarningText == UiResources.LoadingOrganizationsFailedText &&
177+
x.AfterSuccess == testSubject.UpdateOrganizations));
189178
}
190179

191180
[TestMethod]
192-
public async Task LoadOrganizationsAsync_AdapterReturnsFailedResponse_UpdatesWarning()
193-
{
194-
MockAdapterLoadOrganizationsAsync(success: false);
195-
196-
await testSubject.LoadOrganizationsAsync();
197-
198-
progressReporterViewModel.Received(1).Warning = UiResources.LoadingOrganizationsFailedText;
199-
}
200-
201-
[TestMethod]
202-
public async Task LoadOrganizationsAsync_AdapterSucceeds_DoesNotUpdateWarning()
203-
{
204-
MockAdapterLoadOrganizationsAsync(success: true);
205-
206-
await testSubject.LoadOrganizationsAsync();
207-
208-
progressReporterViewModel.DidNotReceive().Warning = UiResources.LoadingOrganizationsFailedText;
209-
}
210-
211-
[TestMethod]
212-
public async Task LoadOrganizationsAsync_ResetsPreviousWarningBeforeCallingAdapter()
213-
{
214-
MockAdapterLoadOrganizationsAsync(success: false);
215-
216-
await testSubject.LoadOrganizationsAsync();
217-
218-
Received.InOrder(() =>
219-
{
220-
progressReporterViewModel.Warning = null;
221-
slCoreConnectionAdapter.GetOrganizationsAsync(Arg.Any<ICredentialsModel>());
222-
progressReporterViewModel.Warning = UiResources.LoadingOrganizationsFailedText;
223-
});
224-
}
225-
226-
[TestMethod]
227-
public async Task LoadOrganizationsAsync_AdapterSucceeds_AddsOrganization()
181+
public void UpdateOrganizations_AddsOrganization()
228182
{
229183
var loadedOrganizations = new List<OrganizationDisplay> { new("key", "name") };
230-
MockAdapterLoadOrganizationsAsync(success: true, organizations: loadedOrganizations);
184+
var response = new AdapterResponseWithData<List<OrganizationDisplay>>(true, loadedOrganizations);
231185

232-
await testSubject.LoadOrganizationsAsync();
186+
testSubject.UpdateOrganizations(response);
233187

234188
testSubject.Organizations.Should().BeEquivalentTo(loadedOrganizations);
235189
}
236190

237191
[TestMethod]
238-
public async Task LoadOrganizationsAsync_AdapterSucceeds_ClearsPreviousOrganizations()
192+
public void UpdateOrganizations_ClearsPreviousOrganizations()
239193
{
240194
testSubject.Organizations.Add(new("key", "name"));
241195
var loadedOrganizations = new List<OrganizationDisplay> { new("new_key", "new_name") };
242-
MockAdapterLoadOrganizationsAsync(success: true, organizations: loadedOrganizations);
196+
var response = new AdapterResponseWithData<List<OrganizationDisplay>>(true, loadedOrganizations);
243197

244-
await testSubject.LoadOrganizationsAsync();
198+
testSubject.UpdateOrganizations(response);
245199

246200
testSubject.Organizations.Should().BeEquivalentTo(loadedOrganizations);
247201
}
248202

249203
[TestMethod]
250-
public async Task LoadOrganizationsAsync_AdapterSucceeds_RaisesEvents()
204+
public void UpdateOrganizations_RaisesEvents()
251205
{
252-
MockAdapterLoadOrganizationsAsync(success: true);
253206
var eventHandler = Substitute.For<PropertyChangedEventHandler>();
254207
testSubject.PropertyChanged += eventHandler;
255208
eventHandler.ReceivedCalls().Should().BeEmpty();
209+
var response = new AdapterResponseWithData<List<OrganizationDisplay>>(true, []);
256210

257-
await testSubject.LoadOrganizationsAsync();
211+
testSubject.UpdateOrganizations(response);
258212

259213
eventHandler.Received().Invoke(testSubject,
260214
Arg.Is<PropertyChangedEventArgs>(x => x.PropertyName == nameof(testSubject.NoOrganizationExists)));
261215
}
262-
263-
private void MockAdapterLoadOrganizationsAsync(bool success = true, List<OrganizationDisplay> organizations = null)
264-
{
265-
slCoreConnectionAdapter.GetOrganizationsAsync(Arg.Any<ICredentialsModel>())
266-
.Returns(new AdapterResponse<List<OrganizationDisplay>>(success, organizations ?? []));
267-
}
268-
269-
private async Task ExecuteLoadOrganizationsAsyncThrowingException()
270-
{
271-
slCoreConnectionAdapter.When(x => x.GetOrganizationsAsync(Arg.Any<ICredentialsModel>()))
272-
.Do(x => throw new Exception("testing"));
273-
try
274-
{
275-
await testSubject.LoadOrganizationsAsync();
276-
}
277-
catch (Exception)
278-
{
279-
// this is only for testing purposes
280-
}
281-
}
282216
}

0 commit comments

Comments
 (0)