using System.Net; using System.Text.Json; using JdeScoping.Client.Services; using JdeScoping.Core.ApiContracts; using JdeScoping.Core.ApiContracts.Results; using JdeScoping.Core.Models.Auth; using RichardSzalay.MockHttp; using Shouldly; namespace JdeScoping.Client.Tests.Services; public class AuthApiClientTests { private readonly MockHttpMessageHandler _mockHttp; private readonly AuthApiClient _client; public AuthApiClientTests() { _mockHttp = new MockHttpMessageHandler(); var httpClient = new HttpClient(_mockHttp) { BaseAddress = new Uri("http://localhost/") }; _client = new AuthApiClient(httpClient); } // Route verification tests [Fact] public async Task GetPublicKeyAsync_CallsCorrectRoute() { // Arrange var request = _mockHttp.Expect(HttpMethod.Get, $"http://localhost/{ApiRoutes.Auth.PublicKey}") .Respond("application/json", JsonSerializer.Serialize(new PublicKeyResponse("-----BEGIN PUBLIC KEY-----\ntest\n-----END PUBLIC KEY-----"))); // Act await _client.GetPublicKeyAsync(); // Assert _mockHttp.GetMatchCount(request).ShouldBe(1); } [Fact] public async Task LoginAsync_CallsCorrectRoute_WithPostMethod() { // Arrange var request = _mockHttp.Expect(HttpMethod.Post, $"http://localhost/{ApiRoutes.Auth.Login}") .Respond("application/json", JsonSerializer.Serialize(new LoginResultModel(true, null, null))); // Act await _client.LoginAsync(new EncryptedLoginRequest("encrypted")); // Assert _mockHttp.GetMatchCount(request).ShouldBe(1); } [Fact] public async Task LogoutAsync_CallsCorrectRoute_WithPostMethod() { // Arrange var request = _mockHttp.Expect(HttpMethod.Post, $"http://localhost/{ApiRoutes.Auth.Logout}") .Respond(HttpStatusCode.NoContent); // Act await _client.LogoutAsync(); // Assert _mockHttp.GetMatchCount(request).ShouldBe(1); } [Fact] public async Task GetCurrentUserAsync_CallsCorrectRoute() { // Arrange var user = new UserInfoDto { Username = "testuser", FirstName = "Test", LastName = "User" }; var request = _mockHttp.Expect(HttpMethod.Get, $"http://localhost/{ApiRoutes.Auth.Me}") .Respond("application/json", JsonSerializer.Serialize(user)); // Act await _client.GetCurrentUserAsync(); // Assert _mockHttp.GetMatchCount(request).ShouldBe(1); } // Success tests [Fact] public async Task GetPublicKeyAsync_Success_ReturnsPublicKey() { // Arrange var publicKey = "-----BEGIN PUBLIC KEY-----\nMIIBIjAN...\n-----END PUBLIC KEY-----"; _mockHttp.When(HttpMethod.Get, "*") .Respond("application/json", JsonSerializer.Serialize(new PublicKeyResponse(publicKey))); // Act var result = await _client.GetPublicKeyAsync(); // Assert result.IsSuccess.ShouldBeTrue(); result.Value.PublicKeyPem.ShouldBe(publicKey); } [Fact] public async Task LoginAsync_Success_ReturnsLoginResult() { // Arrange var user = new UserInfoDto { Username = "testuser", FirstName = "Test", LastName = "User" }; var loginResult = new LoginResultModel(true, null, user); _mockHttp.When(HttpMethod.Post, "*") .Respond("application/json", JsonSerializer.Serialize(loginResult)); // Act var result = await _client.LoginAsync(new EncryptedLoginRequest("encrypted")); // Assert result.IsSuccess.ShouldBeTrue(); result.Value.Success.ShouldBeTrue(); result.Value.User?.Username.ShouldBe("testuser"); } [Fact] public async Task LogoutAsync_Success_ReturnsUnit() { // Arrange _mockHttp.When(HttpMethod.Post, "*") .Respond(HttpStatusCode.NoContent); // Act var result = await _client.LogoutAsync(); // Assert result.IsSuccess.ShouldBeTrue(); } [Fact] public async Task GetCurrentUserAsync_Success_ReturnsUserInfo() { // Arrange var userInfo = new UserInfoDto { Username = "testuser", FirstName = "Test", LastName = "User" }; _mockHttp.When(HttpMethod.Get, "*") .Respond("application/json", JsonSerializer.Serialize(userInfo)); // Act var result = await _client.GetCurrentUserAsync(); // Assert result.IsSuccess.ShouldBeTrue(); result.Value.Username.ShouldBe("testuser"); } }