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);
}
;
}
}