Files
adas-core/adas-core.Test/Services/RecordingServiceTest.cs
2026-06-26 10:29:23 +02:00

203 lines
8.4 KiB
C#

using System.Net;
using System.Text;
using adas_core.Application.Services;
using adas_core.Application.Services.Interfaces;
using adas_core.Domain.Models;
using adas_core.Domain.Models.AppSettings;
using adas_core.Domain.Models.Recording;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Moq;
using Moq.Protected;
using Newtonsoft.Json;
using Error = EasyNetQ.SystemMessages.Error;
using Options = Microsoft.Extensions.Options.Options;
namespace adas_core.Test.Services;
[TestFixture]
public class RecordingServiceTest
{
/// <summary>
/// Sets up the test environment for <see cref="RecordingService"/> by initializing configuration options, creating mock
/// dependencies (logger, HTTP client factory, publisher, authentication, client message, subscribers, and patient services),
/// and configuring the publisher mock to successfully send both regular messages and errors.
/// </summary>
[SetUp]
public void Setup()
{
_optionsApiSettings = Options.Create(_apiSettings);
_optionsRabbitMqSettings = Options.Create(_rabbitMqSettings);
_optionsRecordingSettings = Options.Create(_recordingSettings);
_publisherServiceMock = new Mock<IPublisherService>();
_logger = new Mock<ILogger<RecordingService>>();
_authServiceMock = new Mock<IAuthService>();
_httpClientFactoryMock = new Mock<IHttpClientFactory>();
_httpMessageHandlerMock = new Mock<HttpMessageHandler>();
_clientMessageServiceMock = new Mock<IClientMessageService>();
_subscribersServiceMock = new Mock<ISubscribersService>();
_patientServiceMock = new Mock<Lazy<IPatientService>>();
var client = new HttpClient(_httpMessageHandlerMock.Object);
_httpClientFactoryMock.Setup(c => c.CreateClient(It.IsAny<string>())).Returns(client);
_recordingService = new RecordingService(
_optionsRabbitMqSettings,
_optionsRecordingSettings,
_logger.Object,
_httpClientFactoryMock.Object,
_publisherServiceMock.Object,
_authServiceMock.Object,
_optionsApiSettings,
_clientMessageServiceMock.Object,
_subscribersServiceMock.Object,
_patientServiceMock.Object
);
// Set up the mock object to return a specific value when a method is called
_publisherServiceMock.Setup(x => x.SendMessage(It.IsAny<object>(), It.IsAny<string>())).ReturnsAsync(true);
_publisherServiceMock.Setup(x => x.SendMessageError(It.IsAny<Error>(), It.IsAny<string>())).ReturnsAsync(true);
}
private RecordingService _recordingService = null!;
//Mock<PublisherService> mockSingleton = null!;
private Mock<IHttpClientFactory> _httpClientFactoryMock = null!;
private Mock<HttpMessageHandler> _httpMessageHandlerMock = null!;
private Mock<IPublisherService> _publisherServiceMock = null!;
private Mock<IAuthService> _authServiceMock = null!;
private Mock<Lazy<IPatientService>> _patientServiceMock = null!;
private readonly RabbitMqSettings _rabbitMqSettings = new()
{
RecordingQueue = "recordings"
};
private IOptions<RabbitMqSettings> _optionsRabbitMqSettings = null!;
private readonly RecordingSettings _recordingSettings = new()
{
RecordingApiUrl = "http://localhost:8082"
};
private IOptions<RecordingSettings> _optionsRecordingSettings = null!;
private readonly ApiSettings _apiSettings = new()
{
StartRecordingWithoutPatientNumber = false
};
private IOptions<ApiSettings> _optionsApiSettings = null!;
private Mock<ILogger<RecordingService>> _logger = null!;
private Mock<IClientMessageService> _clientMessageServiceMock = null!;
private Mock<ISubscribersService> _subscribersServiceMock = null!;
/// <summary>
/// Verifies that <see cref="RecordingService.GetRecordings"/> returns an empty collection of <see cref="RecordingData"/> when the HTTP response indicates an unauthorized (401) status, ensuring the service correctly handles failed authentication scenarios by yielding no recordings rather than throwing or returning null.
/// </summary>
[Test]
public async Task GetRecordings_Return_Empty()
{
var httpResponseMessage = new HttpResponseMessage
{
StatusCode = HttpStatusCode.Unauthorized,
Content = new StringContent("Content text.")
};
var recordingData = new List<RecordingData>();
_authServiceMock.Setup(s => s.GetToken()).ReturnsAsync("abc");
_httpMessageHandlerMock.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(httpResponseMessage);
var result = await _recordingService.GetRecordings(4);
Assert.That(result, Is.Not.Null);
//Assert.AreEqual(result, recordingData);
Assert.That(result, Is.EqualTo(recordingData));
}
/// <summary>
/// Verifies that <see cref="RecordingService.GetRecordings"/> returns the expected <see cref="RecordingData"/> list
/// when the HTTP endpoint responds with a successful payload containing a recording and its associated patient.
/// Asserts that the returned items match the source data for status, room identifier, and patient identity fields.
/// </summary>
[Test]
public async Task GetRecordings_Return_RecordingData()
{
var patient = new Patient
{
Id = "id",
FirstName = "firstName",
LastName = "lastName"
};
var recordingData = new List<RecordingData>
{
new()
{
Patient = patient,
RoomId = 4,
Status = "INITIALIZED"
}
};
var httpResponseMessage = new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent(JsonConvert.SerializeObject(recordingData), Encoding.UTF8, "application/json")
};
_httpMessageHandlerMock.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(httpResponseMessage);
_authServiceMock.Setup(s => s.GetToken()).ReturnsAsync("abc");
var result = await _recordingService.GetRecordings(4);
Assert.That(result, Is.Not.Null);
using (Assert.EnterMultipleScope())
{
Assert.That(recordingData[0].Status, Is.EqualTo(result![0].Status));
Assert.That(recordingData[0].Patient?.Id, Is.EqualTo(result[0].Patient?.Id));
Assert.That(recordingData[0].Patient?.LastName, Is.EqualTo(result[0].Patient?.LastName));
Assert.That(recordingData[0].Patient?.FirstName, Is.EqualTo(result[0].Patient?.FirstName));
Assert.That(recordingData[0].RoomId, Is.EqualTo(result[0].RoomId));
}
}
/// <summary>
/// Tests that calling <c>SaveRequest</c> on the recording service throws a <see cref="NotImplementedException"/> when supplied with an <see cref="ApiRequest"/>, using a mocked HTTP message handler that returns a successful response.
/// </summary>
[Test]
public Task SaveRequest()
{
ApiRequest apiRequest = new();
var httpResponseMessage = new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent("Content text.")
};
_httpMessageHandlerMock.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(httpResponseMessage);
Func<Task> act = async () => await _recordingService.SaveRequest(apiRequest);
Assert.ThrowsAsync<NotImplementedException>(act);
return Task.CompletedTask;
}
}