using adas_core.Application.Exceptions; using adas_core.Application.Repositories.Interfaces; using adas_core.Application.Services; using adas_core.Application.Services.Interfaces; using adas_core.Domain.Enums; using adas_core.Domain.Models; using adas_core.Domain.Models.MongoModels; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using MongoDB.Bson; using Moq; using static NUnit.Framework.Assert; namespace adas_core.Test.Services; [TestFixture] public class TreatmentServiceTest { /// /// Initializes the mock dependencies and creates a instance for unit testing. /// [SetUp] public void Setup() { _treatmentRepositoryMock = new Mock(); _treatmentArchiveRepositoryMock = new Mock(); //pocMappingServiceMock = new Mock(); _patientServiceMock = new Mock(); //calculatedObservationsServiceMock = new Mock(); _configObservationServiceMock = new Mock(); _clientMessageServiceMock = new Mock(); _subscribersServiceMock = new Mock(); _calculatedObservationsServiceMock = new Mock(); _unitServiceMock = new Mock(); _calculatedObservationsServiceLazy = new Lazy(() => _calculatedObservationsServiceMock.Object); //optionsApiSettings = Microsoft.Extensions.Options.Options.Create(apiSettings); _logger = new Mock>(); _treatmentService = new TreatmentService( _treatmentRepositoryMock.Object, _treatmentArchiveRepositoryMock.Object, _patientServiceMock.Object, _configObservationServiceMock.Object, //optionsApiSettings, _logger.Object, _clientMessageServiceMock.Object, _subscribersServiceMock.Object, _calculatedObservationsServiceLazy, _unitServiceMock.Object, _httpContextAccessor.Object, _auditService.Object ); } private TreatmentService _treatmentService = null!; private Mock _treatmentRepositoryMock = null!; private Mock _treatmentArchiveRepositoryMock = null!; //Mock pocMappingServiceMock = null!; private Mock _patientServiceMock = null!; //Mock calculatedObservationsServiceMock = null!; private Mock _configObservationServiceMock = null!; private Mock _clientMessageServiceMock = null!; private Mock _subscribersServiceMock = null!; private Lazy _calculatedObservationsServiceLazy = null!; private Mock _calculatedObservationsServiceMock = null!; private Mock _unitServiceMock = null!; private readonly Mock _httpContextAccessor = new(); private readonly Mock _auditService = new(); //readonly ApiSettings apiSettings = new () //{ // ConfigObservation = new ConfigObservationSettings // { // IgnoreUnknownObservation = false // } //}; //IOptions optionsApiSettings; private Mock> _logger = null!; private static readonly DateTime Now = DateTime.Now; private static readonly ObjectId PatientId = ObjectId.GenerateNewId(); //3 Nuevos tratamiento3,5,6 private readonly List _patientTreatments = [ new() { Id = ObjectId.GenerateNewId(), PatientId = PatientId, OrderControl = OrderControlType.Nw, PlacerOrder = new Entity { EntityIdentifier = "3690", NamespaceId = "CareVue" }, FillerOrder = new Entity { EntityIdentifier = "3690", NamespaceId = "CareVue" }, OrderStatus = "A", OrderTime = DateTime.Now, Notes = [], Routes = [] }, new() { Id = ObjectId.GenerateNewId(), PatientId = PatientId, OrderControl = OrderControlType.Dc, PlacerOrder = new Entity { EntityIdentifier = "3690", NamespaceId = "CareVue" }, FillerOrder = new Entity { EntityIdentifier = "3690", NamespaceId = "CareVue" }, OrderStatus = "A", OrderTime = DateTime.Now, Notes = [], Routes = [] }, new() { Id = ObjectId.GenerateNewId(), PatientId = PatientId, OrderControl = OrderControlType.Nw, PlacerOrder = new Entity { EntityIdentifier = "4590", NamespaceId = "CareVue" }, FillerOrder = new Entity { EntityIdentifier = "4590", NamespaceId = "CareVue" }, OrderStatus = "A", OrderTime = DateTime.Now, Notes = [], Routes = [] }, new() { Id = ObjectId.GenerateNewId(), PatientId = PatientId, OrderControl = OrderControlType.Xo, PlacerOrder = new Entity { EntityIdentifier = "4590", NamespaceId = "CareVue" }, FillerOrder = new Entity { EntityIdentifier = "4590", NamespaceId = "CareVue" }, OrderStatus = "A", OrderTime = DateTime.Now, Notes = [], Routes = [] }, new() { Id = ObjectId.GenerateNewId(), PatientId = PatientId, OrderControl = OrderControlType.Nw, PlacerOrder = new Entity { EntityIdentifier = "2100", NamespaceId = "CareVue" }, FillerOrder = new Entity { EntityIdentifier = "2100", NamespaceId = "CareVue" }, OrderStatus = "A", OrderTime = DateTime.Now, Notes = [], Routes = [] }, new() { Id = ObjectId.GenerateNewId(), PatientId = PatientId, OrderControl = OrderControlType.Nw, PlacerOrder = new Entity { EntityIdentifier = "100", NamespaceId = "CareVue" }, FillerOrder = new Entity { EntityIdentifier = "100", NamespaceId = "CareVue" }, OrderStatus = "A", OrderTime = DateTime.Now, Notes = [], Routes = [] } ]; /// /// Verifies that saving an without the Case option throws an , preventing the insert operation. /// /// Thrown by the service when the Case option is not provided in the request. [Test] public void SaveRequest_Not_Case_option_Return_not_insert() { var apiRequest = new ApiRequest(); Func act = async () => await _treatmentService.SaveRequest(apiRequest); Assert.ThrowsAsync(act); } /// /// Verifies that _treatmentService.SaveRequest throws an when the is missing both the patient number and the point of care, preventing insertion of an incomplete request. /// [Test] public void SaveRequest_patientNumber_and_pointOfCare_null_Return_not_insert() { var apiRequest = new ApiRequest { Type = "ORU_R01", MessageTime = Now }; Func act = async () => await _treatmentService.SaveRequest(apiRequest); Assert.ThrowsAsync(act); } /// /// Verifies that _treatmentService.SaveRequest does not insert a patient treatment record when the patient cannot be found in the archive. /// [Test] public async Task SaveRequest_Not_Find_Patient_Return_not_insert() { var person = new Person { FirstName = "Miguel", LastName = "Villanueva", Ids = new Dictionary { { "MR", "437537" } } }; var apiRequest = new ApiRequest { Location = new PatientLocation("UCI5C", "Box4"), Patient = person, PatientNumber = "437537", Type = "OMP_O09", PatientId = PatientId.ToString(), MessageTime = Now }; await _treatmentService.SaveRequest(apiRequest); _treatmentArchiveRepositoryMock.Verify(d => d.InsertOneAsync(It.IsAny()), Times.Never); } /// /// Verifies that SaveRequest does not insert a new patient treatment into the treatment archive when an existing patient is found by patient number. /// [Test] public async Task SaveRequest_Find_Patient_Return_insert() { var person = new Person { FirstName = "Miguel", LastName = "Villanueva", Ids = new Dictionary { { "MR", "437537" } } }; var patient = new Patient { Id = ObjectId.GenerateNewId(), UnitString = "UCI5C", Bed = "Box4", PatientNumber = "437537", Person = person }; var apiRequest = new ApiRequest { Location = new PatientLocation("UCI5C", "Box4"), Patient = person, PatientNumber = "437537", Type = "OMP_O09", PatientId = PatientId.ToString(), MessageTime = Now }; _patientServiceMock.Setup(p => p.FindByPatientNumber(apiRequest.PatientNumber, false)).ReturnsAsync(patient); await _treatmentService.SaveRequest(apiRequest); _treatmentArchiveRepositoryMock.Verify(d => d.InsertOneAsync(It.IsAny()), Times.Never); } /// /// Verifies that GetActiveTreatmentsByPatient retrieves the full set of active treatments for the specified patient, returning a non-empty collection that includes all expected treatment records identified by their placer order entity identifiers. /// [Test] public async Task GetActiveTreatmentsByPatient() { _treatmentRepositoryMock.Setup(t => t.GetByPatientId(PatientId)) .ReturnsAsync(_patientTreatments.AsEnumerable()); var treatments = await _treatmentService.GetActiveTreatmentsByPatient(PatientId); var result = treatments.ToList(); using (Assert.EnterMultipleScope()) { That(result, Is.Not.Empty); That(result, Has.Count.EqualTo(4)); That(result.Find(t => t?.PlacerOrder?.EntityIdentifier == "100"), Is.Not.Null); That(result.Find(t => t?.PlacerOrder?.EntityIdentifier == "2100"), Is.Not.Null); That(result.Find(t => t?.PlacerOrder?.EntityIdentifier == "4590"), Is.Not.Null); That(result.Find(t => t?.PlacerOrder?.EntityIdentifier == "3690"), Is.Not.Null); } ; } }