Skip to content

Commit 7950fe4

Browse files
SLVS-1473 Refactor AliveConnectionTracker (#5717)
1 parent 2745d75 commit 7950fe4

File tree

5 files changed

+244
-39
lines changed

5 files changed

+244
-39
lines changed

src/ConnectedMode.UnitTests/Persistence/ServerConnectionsRepositoryTests.cs

Lines changed: 103 additions & 0 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.IO;
2223
using System.IO.Abstractions;
2324
using SonarLint.VisualStudio.ConnectedMode.Binding;
@@ -338,6 +339,32 @@ public void TryAdd_WritingThrowsException_DoesNotUpdateConnectionAndWritesLog()
338339
logger.Received(1).WriteLine($"Failed updating the {ServerConnectionsRepository.ConnectionsFileName}: {exceptionMsg}");
339340
}
340341

342+
[TestMethod]
343+
public void TryAdd_DoesNotAddConnection_DoesNotInvokeConnectionChangedEvent()
344+
{
345+
MockReadingFile(new ServerConnectionsListJsonModel());
346+
jsonFileHandler.TryWriteToFile(Arg.Any<string>(), Arg.Any<ServerConnectionsListJsonModel>()).Returns(false);
347+
var eventHandler = Substitute.For<EventHandler>();
348+
testSubject.ConnectionChanged += eventHandler;
349+
350+
testSubject.TryAdd(sonarCloudServerConnection);
351+
352+
eventHandler.DidNotReceive().Invoke(testSubject, Arg.Any<EventArgs>());
353+
}
354+
355+
[TestMethod]
356+
public void TryAdd_AddsConnection_InvokesConnectionChangedEvent()
357+
{
358+
MockReadingFile(new ServerConnectionsListJsonModel());
359+
jsonFileHandler.TryWriteToFile(Arg.Any<string>(), Arg.Any<ServerConnectionsListJsonModel>()).Returns(true);
360+
var eventHandler = Substitute.For<EventHandler>();
361+
testSubject.ConnectionChanged += eventHandler;
362+
363+
testSubject.TryAdd(sonarCloudServerConnection);
364+
365+
eventHandler.Received().Invoke(testSubject, Arg.Any<EventArgs>());
366+
}
367+
341368
[TestMethod]
342369
public void TryDelete_FileCouldNotBeRead_ReturnsFalse()
343370
{
@@ -439,6 +466,32 @@ public void TryDelete_WritingThrowsException_DoesNotUpdateConnectionAndWritesLog
439466
logger.Received(1).WriteLine($"Failed updating the {ServerConnectionsRepository.ConnectionsFileName}: {exceptionMsg}");
440467
}
441468

469+
[TestMethod]
470+
public void TryDelete_DoesNotDeleteConnection_DoesNotInvokeConnectionChangedEvent()
471+
{
472+
var sonarQube = MockFileWithOneSonarQubeConnection();
473+
jsonFileHandler.TryWriteToFile(Arg.Any<string>(), Arg.Any<ServerConnectionsListJsonModel>()).Returns(false);
474+
var eventHandler = Substitute.For<EventHandler>();
475+
testSubject.ConnectionChanged += eventHandler;
476+
477+
testSubject.TryDelete(sonarQube.Id);
478+
479+
eventHandler.DidNotReceive().Invoke(testSubject, Arg.Any<EventArgs>());
480+
}
481+
482+
[TestMethod]
483+
public void TryDelete_DeletesConnection_InvokesConnectionChangedEvent()
484+
{
485+
var sonarQube = MockFileWithOneSonarQubeConnection();
486+
jsonFileHandler.TryWriteToFile(Arg.Any<string>(), Arg.Any<ServerConnectionsListJsonModel>()).Returns(true);
487+
var eventHandler = Substitute.For<EventHandler>();
488+
testSubject.ConnectionChanged += eventHandler;
489+
490+
testSubject.TryDelete(sonarQube.Id);
491+
492+
eventHandler.Received(1).Invoke(testSubject, Arg.Any<EventArgs>());
493+
}
494+
442495
[TestMethod]
443496
public void TryUpdateSettingsById_FileCouldNotBeRead_ReturnsFalse()
444497
{
@@ -505,6 +558,32 @@ public void TryUpdateSettingsById_WritingThrowsException_DoesNotUpdateConnection
505558
logger.Received(1).WriteLine($"Failed updating the {ServerConnectionsRepository.ConnectionsFileName}: {exceptionMsg}");
506559
}
507560

561+
[TestMethod]
562+
public void TryUpdateSettingsById_DoesNotUpdateConnection_DoesNotInvokeConnectionChangedEvent()
563+
{
564+
var sonarQube = MockFileWithOneSonarQubeConnection();
565+
jsonFileHandler.TryWriteToFile(Arg.Any<string>(), Arg.Any<ServerConnectionsListJsonModel>()).Returns(false);
566+
var eventHandler = Substitute.For<EventHandler>();
567+
testSubject.ConnectionChanged += eventHandler;
568+
569+
testSubject.TryDelete(sonarQube.Id);
570+
571+
eventHandler.DidNotReceive().Invoke(testSubject, Arg.Any<EventArgs>());
572+
}
573+
574+
[TestMethod]
575+
public void TryUpdateSettingsById_UpdatesConnection_InvokesConnectionChangedEvent()
576+
{
577+
var sonarQube = MockFileWithOneSonarQubeConnection();
578+
jsonFileHandler.TryWriteToFile(Arg.Any<string>(), Arg.Any<ServerConnectionsListJsonModel>()).Returns(true);
579+
var eventHandler = Substitute.For<EventHandler>();
580+
testSubject.ConnectionChanged += eventHandler;
581+
582+
testSubject.TryUpdateSettingsById(sonarQube.Id, new ServerConnectionSettings(true));
583+
584+
eventHandler.Received(1).Invoke(testSubject, Arg.Any<EventArgs>());
585+
}
586+
508587
[TestMethod]
509588
public void TryUpdateCredentialsById_ConnectionDoesNotExist_DoesNotUpdateCredentials()
510589
{
@@ -540,6 +619,30 @@ public void TryUpdateCredentialsById_SonarQubeConnectionExists_UpdatesCredential
540619
credentialsLoader.Received(1).Save(newCredentials, sonarQube.ServerUri);
541620
}
542621

622+
[TestMethod]
623+
public void TryUpdateCredentialsById_DoesNotUpdateCredentials_DoesNotInvokeConnectionChangedEvent()
624+
{
625+
MockReadingFile(new ServerConnectionsListJsonModel());
626+
var eventHandler = Substitute.For<EventHandler<ServerConnectionUpdatedEventArgs>>();
627+
testSubject.CredentialsChanged += eventHandler;
628+
629+
testSubject.TryUpdateCredentialsById("non-existingConn", Substitute.For<ICredentials>());
630+
631+
eventHandler.DidNotReceive().Invoke(testSubject, Arg.Any<ServerConnectionUpdatedEventArgs>());
632+
}
633+
634+
[TestMethod]
635+
public void TryUpdateCredentialsById_UpdatesCredentials_InvokesConnectionChangedEvent()
636+
{
637+
var sonarQube = MockFileWithOneSonarQubeConnection();
638+
var eventHandler = Substitute.For<EventHandler<ServerConnectionUpdatedEventArgs>>();
639+
testSubject.CredentialsChanged += eventHandler;
640+
641+
testSubject.TryUpdateCredentialsById(sonarQube.Id, Substitute.For<ICredentials>());
642+
643+
eventHandler.Received(1).Invoke(testSubject, Arg.Is<ServerConnectionUpdatedEventArgs>(args => args.ServerConnection == sonarQube));
644+
}
645+
543646
[TestMethod]
544647
[DataRow(true)]
545648
[DataRow(false)]

src/ConnectedMode/Persistence/ServerConnectionsRepository.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ internal class ServerConnectionsRepository : IServerConnectionsRepository
4343
private readonly string connectionsStorageFilePath;
4444
private static readonly object LockObject = new();
4545

46+
public event EventHandler ConnectionChanged;
47+
public event EventHandler<ServerConnectionUpdatedEventArgs> CredentialsChanged;
48+
4649
[ImportingConstructor]
4750
public ServerConnectionsRepository(
4851
IJsonFileHandler jsonFileHandle,
@@ -127,6 +130,7 @@ public bool TryUpdateCredentialsById(string connectionId, ICredentials credentia
127130
if (wasFound)
128131
{
129132
credentialsLoader.Save(credentials, serverConnection.CredentialsUri);
133+
OnCredentialsChanged(serverConnection);
130134
return true;
131135
}
132136
}
@@ -229,7 +233,12 @@ private bool SafeUpdateConnectionsFile(Func<List<ServerConnection>, bool> tryUpd
229233
if (tryUpdateConnectionModels(serverConnections))
230234
{
231235
var model = serverConnectionModelMapper.GetServerConnectionsListJsonModel(serverConnections);
232-
return jsonFileHandle.TryWriteToFile(connectionsStorageFilePath, model);
236+
var wasSaved = jsonFileHandle.TryWriteToFile(connectionsStorageFilePath, model);
237+
if (wasSaved)
238+
{
239+
OnConnectionChanged();
240+
}
241+
return wasSaved;
233242
}
234243
}
235244
catch (Exception ex) when (!ErrorHandler.IsCriticalException(ex))
@@ -240,4 +249,7 @@ private bool SafeUpdateConnectionsFile(Func<List<ServerConnection>, bool> tryUpd
240249
return false;
241250
}
242251
}
252+
253+
private void OnConnectionChanged() => ConnectionChanged?.Invoke(this, EventArgs.Empty);
254+
private void OnCredentialsChanged(ServerConnection serverConnection) => CredentialsChanged?.Invoke(this, new ServerConnectionUpdatedEventArgs(serverConnection));
243255
}

src/Core/Binding/IServerConnectionsRepository.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,17 @@ public interface IServerConnectionsRepository
2929
bool TryUpdateSettingsById(string connectionId, ServerConnectionSettings connectionSettings);
3030
bool TryUpdateCredentialsById(string connectionId, ICredentials credentials);
3131
bool ConnectionsFileExists();
32+
event EventHandler ConnectionChanged;
33+
event EventHandler<ServerConnectionUpdatedEventArgs> CredentialsChanged;
3234
}
35+
36+
public class ServerConnectionUpdatedEventArgs : EventArgs
37+
{
38+
public ServerConnectionUpdatedEventArgs(ServerConnection serverConnection)
39+
{
40+
ServerConnection = serverConnection;
41+
}
42+
43+
public ServerConnection ServerConnection { get; }
44+
}
45+

0 commit comments

Comments
 (0)