Compare commits

...

11 Commits

Author SHA1 Message Date
Developer 02
5f9926e911 refactor(AuthClientTests): Umbenennung der Variablennamen 2025-02-04 20:50:34 +01:00
Developer 02
319763040c refactor(ISenderHandler): Umbenennung in IAuthSenderHandler.
- umbenannt in SendMessageAsync als SendKeyAsync
2025-02-04 20:45:01 +01:00
Developer 02
e474cf38d4 feat(AuthClient): implementiert IAsyncDisposable 2025-02-04 20:41:20 +01:00
Developer 02
5092890f14 fix(AuthClientTest): Ersetzte client_receiver.ReceiveMessageAsync Aktion mit sender_client.SendMessageAsync in ReceiveMessage_ShouldCallOnMessageReceived Test
- Verzögerung für die Dauer des Nachrichtenempfangs in ReceiveMessage_ShouldCallOnMessageReceived hinzugefügt.
2025-02-04 20:01:51 +01:00
Developer 02
27c2c0b4cb refactor(IAuthClientHandler): umbenannt in IListenHandler 2025-02-04 19:47:40 +01:00
Developer 02
9d609dd5ac feat(ISenderHandler): Erstellt um Absenderaktionen an den Hub zu behandeln
- Eingebaut in AuthHub und AuthClient
2025-02-04 19:40:09 +01:00
Developer 02
360d91353b Revert "feat(AuthClientTests): Es wurde eine clientPool-Warteschlange erstellt, um die Injektion von Abhängigkeiten und die Bereitstellung von Diensten zu trennen."
This reverts commit 5886e076f4.
2025-02-04 16:09:19 +01:00
Developer 02
7c5a545926 Revert "fix(AuthClientTests): aktualisiert, um Enqueue-Methode zu verwenden, um neue Instanzen zum clientPool hinzuzufügen"
This reverts commit 18d7c475ff.
2025-02-04 16:08:26 +01:00
Developer 02
18d7c475ff fix(AuthClientTests): aktualisiert, um Enqueue-Methode zu verwenden, um neue Instanzen zum clientPool hinzuzufügen 2025-02-04 10:49:37 +01:00
Developer 02
5886e076f4 feat(AuthClientTests): Es wurde eine clientPool-Warteschlange erstellt, um die Injektion von Abhängigkeiten und die Bereitstellung von Diensten zu trennen.
- Dies macht die Messung realistischer.
2025-02-04 10:48:04 +01:00
Developer 02
8e979fa14d feat(AuthClientTests): Testserver hinzugefügt 2025-02-04 10:11:34 +01:00
7 changed files with 93 additions and 31 deletions

View File

@@ -1,6 +1,6 @@
namespace DigitalData.Auth.Abstractions; namespace DigitalData.Auth.Abstractions;
public interface IAuthClient : IAuthClientHandler public interface IAuthClient : IAuthListenHandler, IAuthSenderHandler
{ {
bool IsConnected { get; } bool IsConnected { get; }

View File

@@ -1,6 +0,0 @@
namespace DigitalData.Auth.Abstractions;
public interface IAuthClientHandler
{
Task ReceiveMessageAsync(string user, string message);
}

View File

@@ -0,0 +1,6 @@
namespace DigitalData.Auth.Abstractions;
public interface IAuthListenHandler
{
Task ReceiveKeyAsync(string topic, string key);
}

View File

@@ -0,0 +1,6 @@
namespace DigitalData.Auth.Abstractions;
public interface IAuthSenderHandler
{
Task SendKeyAsync(string topic, string key);
}

View File

@@ -5,7 +5,7 @@ using Microsoft.Extensions.Options;
namespace DigitalData.Auth.Client; namespace DigitalData.Auth.Client;
public class AuthClient : IAuthClient public class AuthClient : IAuthClient, IAsyncDisposable
{ {
private readonly HubConnection _connection; private readonly HubConnection _connection;
@@ -21,7 +21,7 @@ public class AuthClient : IAuthClient
.WithUrl(paramsOptions.Value.Url) .WithUrl(paramsOptions.Value.Url)
.Build(); .Build();
_connection.On<string, string>(nameof(ReceiveMessageAsync), ReceiveMessageAsync); _connection.On<string, string>(nameof(ReceiveKeyAsync), ReceiveKeyAsync);
_logger = logger; _logger = logger;
@@ -61,5 +61,13 @@ public class AuthClient : IAuthClient
} }
} }
public Task ReceiveMessageAsync(string user, string message) => Task.Run(() => _params.Events.OnMessageReceived(user, message, _logger)); public Task ReceiveKeyAsync(string user, string message) => Task.Run(() => _params.Events.OnMessageReceived(user, message, _logger));
public Task SendKeyAsync(string user, string message) => _connection.InvokeAsync(nameof(SendKeyAsync), user, message);
public virtual async ValueTask DisposeAsync()
{
await _connection.StopAsync();
await _connection.DisposeAsync();
}
} }

View File

@@ -1,33 +1,77 @@
using DigitalData.Auth.Abstractions; using DigitalData.Auth.Abstractions;
using DigitalData.Auth.API.Hubs;
using DigitalData.Auth.Client; using DigitalData.Auth.Client;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace DigitalData.Auth.Tests.Client; namespace DigitalData.Auth.Tests.Client;
// TODO: The test checks if the services are working. Performance measurement is ignored. Update it to measure performance as well.
[TestFixture] [TestFixture]
public class AuthClientTests public class AuthClientTests
{ {
private static readonly string HubUrl = "https://localhost:7192/auth-hub"; private string _hubUrl;
private Func<Action<ClientParams>, ServiceProvider> Build; private Func<Action<ClientParams>, ServiceProvider> Build;
private WebApplication? _app = null;
private static int AvailablePort
{
get
{
using var listener = new System.Net.Sockets.TcpListener(System.Net.IPAddress.Loopback, 0);
listener.Start();
int port = ((System.Net.IPEndPoint)listener.LocalEndpoint).Port;
listener.Stop();
return port;
}
}
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
Build = options => new ServiceCollection() Build = options => new ServiceCollection()
.AddAuthHubClient(options) .AddAuthHubClient(options)
.BuildServiceProvider(); .BuildServiceProvider();
// Create and run test server
// Create builder and add SignalR service
var builder = WebApplication.CreateBuilder();
builder.Services.AddSignalR();
// Listen AvailablePort and map hub
var _app = builder.Build();
var url = $"http://localhost:{AvailablePort}";
var hubRoute = "/auth-hub";
_hubUrl = url + hubRoute;
_app.Urls.Add(url);
_app.MapHub<AuthHub>(hubRoute);
_app.Start();
}
[TearDown]
public async Task TearDown()
{
// Stop test server
if (_app is not null)
{
await _app.StopAsync();
await _app.DisposeAsync();
Console.WriteLine("Test server stopped.");
}
} }
[Test] [Test]
public async Task StartAsync_ShouldConnectSuccessfully() public async Task StartAsync_ShouldConnectSuccessfully()
{ {
// Arrange // Arrange
using var provider = Build(opt => opt.Url = HubUrl); using var provider = Build(opt => opt.Url = _hubUrl);
var client = provider.GetRequiredService<IAuthClient>(); var client = provider.GetRequiredService<IAuthClient>();
// Act // Act
await client.TryStartAsync(); await client.StartAsync();
// Assert // Assert
Assert.Multiple(() => Assert.Multiple(() =>
@@ -42,37 +86,41 @@ public class AuthClientTests
public async Task ReceiveMessage_ShouldCallOnMessageReceived() public async Task ReceiveMessage_ShouldCallOnMessageReceived()
{ {
// Arrange // Arrange
string rcv_user = string.Empty; string rcv_topic = string.Empty;
string rcv_msg = string.Empty; string rcv_key = string.Empty;
// Sender client // Sender client
using var provider_sender = Build(opt => opt.Url = HubUrl); using var provider_sender = Build(opt => opt.Url = _hubUrl);
var sender_client = provider_sender.GetRequiredService<IAuthClient>(); var sender_client = provider_sender.GetRequiredService<IAuthClient>();
await sender_client.TryStartAsync(); await sender_client.StartAsync();
// Receiver client // Receiver client
using var provider_receiver = Build(opt => using var provider_receiver = Build(opt =>
{ {
opt.Url = HubUrl; opt.Url = _hubUrl;
opt.Events.OnMessageReceived = (user, message, logger) => opt.Events.OnMessageReceived = (topic, key, logger) =>
{ {
rcv_user = user; rcv_topic = topic;
rcv_msg = message; rcv_key = key;
}; };
}); });
var client_receiver = provider_receiver.GetRequiredService<IAuthClient>(); var client_receiver = provider_receiver.GetRequiredService<IAuthClient>();
await client_receiver.StartAsync();
string user = "user"; string topic = "topic";
string message = "message"; string key = "key";
// Act // Act
await client_receiver.ReceiveMessageAsync(user, message); await sender_client.SendKeyAsync(topic, key);
// delay fort getting answer
await Task.Delay(2000);
// Assert // Assert
Assert.Multiple(() => Assert.Multiple(() =>
{ {
Assert.That(rcv_user, Is.EqualTo(user)); Assert.That(rcv_topic, Is.EqualTo(topic));
Assert.That(rcv_msg, Is.EqualTo(message)); Assert.That(rcv_key, Is.EqualTo(key));
}); });
} }
} }

View File

@@ -3,14 +3,14 @@ using Microsoft.AspNetCore.SignalR;
namespace DigitalData.Auth.API.Hubs; namespace DigitalData.Auth.API.Hubs;
public class AuthHub : Hub<IAuthClientHandler> public class AuthHub : Hub<IAuthListenHandler>, IAuthSenderHandler
{ {
public async Task SendMessage(string user, string message) public async Task SendKeyAsync(string user, string message)
=> await Clients.All.ReceiveMessageAsync(user, message); => await Clients.All.ReceiveKeyAsync(user, message);
public async Task SendMessageToCaller(string user, string message) public async Task SendMessageToCaller(string user, string message)
=> await Clients.Caller.ReceiveMessageAsync(user, message); => await Clients.Caller.ReceiveKeyAsync(user, message);
public async Task SendMessageToGroup(string user, string message) public async Task SendMessageToGroup(string user, string message)
=> await Clients.Group("Auth.API Consumers").ReceiveMessageAsync(user, message); => await Clients.Group("Auth.API Consumers").ReceiveKeyAsync(user, message);
} }