Creado apartir del commit b888de6c92056de294456f581a56e25e734d4ab7 de develop
This commit is contained in:
@@ -0,0 +1,381 @@
|
||||
using System.Security.Claims;
|
||||
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.AppSettings;
|
||||
using adas_core.Domain.Models.MongoModels;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using MongoDB.Bson;
|
||||
using Moq;
|
||||
using Options = Microsoft.Extensions.Options.Options;
|
||||
|
||||
namespace adas_core.Test.Services;
|
||||
|
||||
[TestFixture]
|
||||
public class ConfigObservationServiceTest
|
||||
{
|
||||
private ConfigObservationService _service = null!;
|
||||
private Mock<IConfigObservationRepository> _repo = null!;
|
||||
private Mock<IUnitService> _unitSvc = null!;
|
||||
private Mock<ILocalAuditService> _auditSvc = null!;
|
||||
private Mock<IHttpContextAccessor> _http = null!;
|
||||
private Mock<ICacheService> _cache = null!;
|
||||
private Mock<ILogger<ConfigObservationService>> _logger = null!;
|
||||
|
||||
private IOptions<ApiSettings> _settings = null!;
|
||||
private IOptions<CacheSettings> _cacheSettings = null!;
|
||||
|
||||
private static readonly ObjectId Id = ObjectId.GenerateNewId();
|
||||
|
||||
private static readonly ConfigObservation ConfigList = new()
|
||||
{
|
||||
Id = Id,
|
||||
Name = "FC",
|
||||
Code = "147842",
|
||||
CodingSystem = "MDC",
|
||||
ParentCode = "69965",
|
||||
ParentName = "MDC_DEV_MON_PHYSIO_MULTI_PARAM_MDS",
|
||||
MinAlert = 60,
|
||||
MaxAlert = 100,
|
||||
ForceAlert = true
|
||||
};
|
||||
|
||||
private readonly List<ConfigObservation> _allConfigList =
|
||||
[
|
||||
new() { Id = ObjectId.GenerateNewId(), Name = "Hemoglobina", Code = "12345", CodingSystem = "SNM" },
|
||||
new() { Id = ObjectId.GenerateNewId(), Name = "Glucemia", Code = "54321", CodingSystem = "SNM", OriginalName = "GLU" },
|
||||
new() { Id = ObjectId.GenerateNewId(), Name = "Sodio", OriginalName = "Sodio" },
|
||||
new()
|
||||
{
|
||||
Id = ObjectId.GenerateNewId(),
|
||||
Name = "ph",
|
||||
Code = "555",
|
||||
CodingSystem = "MG4",
|
||||
ParentCode = "3333",
|
||||
ParentCodingSystem = "SNM"
|
||||
},
|
||||
new()
|
||||
{
|
||||
Id = ObjectId.GenerateNewId(),
|
||||
Name = "SOFA",
|
||||
Code = "278061009",
|
||||
OriginalName = "SOFA",
|
||||
CodingSystem = "SNM",
|
||||
MinAlert = 10,
|
||||
MinWarn = 14
|
||||
},
|
||||
ConfigList,
|
||||
new() { Id = ObjectId.GenerateNewId(), Name = "Alarm_BlueCode", CodingSystem = "ADAS_EVENT" }
|
||||
];
|
||||
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
_repo = new Mock<IConfigObservationRepository>();
|
||||
_unitSvc = new Mock<IUnitService>();
|
||||
_auditSvc = new Mock<ILocalAuditService>();
|
||||
_http = new Mock<IHttpContextAccessor>();
|
||||
_cache = new Mock<ICacheService>();
|
||||
_logger = new Mock<ILogger<ConfigObservationService>>();
|
||||
|
||||
var user = new ClaimsPrincipal(
|
||||
new ClaimsIdentity([new Claim(ClaimTypes.Name, "TestUser")], "mock"));
|
||||
|
||||
_http.Setup(x => x.HttpContext).Returns(new DefaultHttpContext { User = user });
|
||||
|
||||
_settings = Options.Create(new ApiSettings
|
||||
{
|
||||
ConfigObservation = new ConfigObservationSettings
|
||||
{
|
||||
IgnoreUnknownObservation = false,
|
||||
Refresh = null
|
||||
},
|
||||
});
|
||||
|
||||
_cacheSettings = Options.Create(new CacheSettings());
|
||||
|
||||
// KEY: mock cache to execute repository calls
|
||||
_cache.Setup(c => c.GetOrSetObjectAsync(
|
||||
It.IsAny<string>(),
|
||||
It.IsAny<Func<Task<ICollection<ConfigObservation>>>>(),
|
||||
It.IsAny<TimeSpan?>(),
|
||||
It.IsAny<CancellationToken>()))
|
||||
.Returns((string _, Func<Task<ICollection<ConfigObservation>>> f, TimeSpan? __, CancellationToken ___) => f());
|
||||
|
||||
_cache.Setup(c => c.GetOrSetObjectAsync(
|
||||
It.IsAny<string>(),
|
||||
It.IsAny<Func<Task<ConfigObservation>>>(),
|
||||
It.IsAny<TimeSpan?>(),
|
||||
It.IsAny<CancellationToken>()))
|
||||
.Returns((string _, Func<Task<ConfigObservation>> f, TimeSpan? __, CancellationToken ___) => f());
|
||||
|
||||
_service = new ConfigObservationService(
|
||||
_repo.Object,
|
||||
_settings,
|
||||
_cacheSettings,
|
||||
_logger.Object,
|
||||
_unitSvc.Object,
|
||||
_http.Object,
|
||||
_auditSvc.Object,
|
||||
_cache.Object);
|
||||
|
||||
_repo.Setup(x => x.FindAll()).ReturnsAsync([ConfigList]);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// TESTS
|
||||
// ---------------------------------------------------------
|
||||
|
||||
[Test]
|
||||
public async Task Get_config_observation_item_by_codingSystem_only_return_null()
|
||||
{
|
||||
var obs = new PatientObservation
|
||||
{
|
||||
CodingSystem = "ADAS_EVENT",
|
||||
Code = "Pump_X",
|
||||
Name = "Alarm_Pump_X"
|
||||
};
|
||||
|
||||
var result = await _service.Get(obs);
|
||||
|
||||
Assert.That(result, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Get_config_observation_item_by_code_and_codingSystem()
|
||||
{
|
||||
_repo.Setup(x => x.FindAll()).ReturnsAsync(_allConfigList);
|
||||
|
||||
var obs = new BasePatientObservation
|
||||
{
|
||||
Name = "Hemo^GBr",
|
||||
Code = "12345",
|
||||
CodingSystem = "SNM"
|
||||
};
|
||||
|
||||
var result = await _service.Get(obs);
|
||||
|
||||
Assert.That(result, Is.Not.Null);
|
||||
Assert.That(result!.Name, Is.EqualTo("Hemoglobina"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Get_config_observation_item_by_name()
|
||||
{
|
||||
_repo.Setup(x => x.FindAll()).ReturnsAsync(_allConfigList);
|
||||
|
||||
var obs = new BasePatientObservation { Name = "Hemoglobina" };
|
||||
|
||||
var result = await _service.Get(obs);
|
||||
|
||||
Assert.That(result!.Name, Is.EqualTo("Hemoglobina"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Get_config_observation_item_by_name_not_exist_returns_null()
|
||||
{
|
||||
_repo.Setup(x => x.FindAll()).ReturnsAsync(_allConfigList);
|
||||
|
||||
var obs = new BasePatientObservation { Name = "XXX" };
|
||||
|
||||
var result = await _service.Get(obs);
|
||||
|
||||
Assert.That(result, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Get_config_by_code_and_parent()
|
||||
{
|
||||
_repo.Setup(x => x.FindAll()).ReturnsAsync(_allConfigList);
|
||||
|
||||
var obs = new BasePatientObservation
|
||||
{
|
||||
Code = "555",
|
||||
CodingSystem = "MG4",
|
||||
ParentData = new ParentDataClass
|
||||
{
|
||||
Code = "3333",
|
||||
CodingSystem = "SNM"
|
||||
}
|
||||
};
|
||||
|
||||
var result = await _service.Get(obs);
|
||||
|
||||
Assert.That(result!.Name, Is.EqualTo("ph"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Map_unknown_ignore_true_returns_null()
|
||||
{
|
||||
_settings.Value.ConfigObservation!.IgnoreUnknownObservation = true;
|
||||
_repo.Setup(x => x.FindAll()).ReturnsAsync([]);
|
||||
|
||||
var result = await _service.Map(new BasePatientObservation { Name = "XX" });
|
||||
|
||||
Assert.That(result, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Map_unknown_ignore_false_returns_obs()
|
||||
{
|
||||
_settings.Value.ConfigObservation!.IgnoreUnknownObservation = false;
|
||||
_repo.Setup(x => x.FindAll()).ReturnsAsync([]);
|
||||
|
||||
var obs = new BasePatientObservation { Name = "XX" };
|
||||
|
||||
var result = await _service.Map(obs);
|
||||
|
||||
Assert.That(result, Is.EqualTo(obs));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Map_threshold_Ok()
|
||||
{
|
||||
_repo.Setup(x => x.FindAll()).ReturnsAsync(_allConfigList);
|
||||
|
||||
var obs = new PatientObservation
|
||||
{
|
||||
Name = "SOFA",
|
||||
CodingSystem = "SNM",
|
||||
Value = 14
|
||||
};
|
||||
|
||||
var result = await _service.Map(obs);
|
||||
|
||||
Assert.That(result!.Status, Is.EqualTo(StatusEnum.Type.Ok));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Map_threshold_Warning()
|
||||
{
|
||||
_repo.Setup(x => x.FindAll()).ReturnsAsync(_allConfigList);
|
||||
|
||||
var obs = new PatientObservation
|
||||
{
|
||||
Name = "SOFA",
|
||||
CodingSystem = "SNM",
|
||||
Value = 13
|
||||
};
|
||||
|
||||
var result = await _service.Map(obs);
|
||||
|
||||
Assert.That(result!.Status, Is.EqualTo(StatusEnum.Type.Warning));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Map_threshold_Alert()
|
||||
{
|
||||
_repo.Setup(x => x.FindAll()).ReturnsAsync(_allConfigList);
|
||||
|
||||
var obs = new PatientObservation
|
||||
{
|
||||
Name = "SOFA",
|
||||
CodingSystem = "SNM",
|
||||
Value = 9
|
||||
};
|
||||
|
||||
var result = await _service.Map(obs);
|
||||
|
||||
Assert.That(result!.Status, Is.EqualTo(StatusEnum.Type.Alert));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Map_parent_ok()
|
||||
{
|
||||
_repo.Setup(x => x.FindById(Id)).ReturnsAsync(ConfigList);
|
||||
|
||||
var fc = new PatientObservation
|
||||
{
|
||||
Id = Id,
|
||||
Name = "FC",
|
||||
Value = 70
|
||||
};
|
||||
|
||||
var result = await _service.Map(fc);
|
||||
|
||||
Assert.That(result!.Status, Is.EqualTo(StatusEnum.Type.Ok));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task UpdateConfig_ok()
|
||||
{
|
||||
var newCfg = new ConfigObservation
|
||||
{
|
||||
Id = Id,
|
||||
Name = "New",
|
||||
Code = "X",
|
||||
CodingSystem = "S"
|
||||
};
|
||||
|
||||
_repo.Setup(r => r.FindById(Id)).ReturnsAsync(ConfigList);
|
||||
_repo.Setup(r => r.Update(It.IsAny<ConfigObservation>())).ReturnsAsync(newCfg);
|
||||
|
||||
var result = await _service.UpdateConfig(newCfg);
|
||||
|
||||
Assert.That(result!.Name, Is.EqualTo("New"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task UpdateConfig_notfound()
|
||||
{
|
||||
_repo
|
||||
.Setup(r => r.FindById(Id))
|
||||
.ReturnsAsync((ConfigObservation?)null);
|
||||
|
||||
Func<Task> act = () => _service.UpdateConfig(new ConfigObservation { Id = Id });
|
||||
|
||||
Assert.ThrowsAsync<NotFoundException>(act);
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public async Task CreateConfig_ok()
|
||||
{
|
||||
_repo.Setup(r => r.InsertOneAsyncAndReturn(ConfigList)).Returns(Task.FromResult(ConfigList));
|
||||
|
||||
var result = await _service.CreateConfig(ConfigList);
|
||||
|
||||
Assert.That(result, Is.EqualTo(ConfigList));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CreateConfig_duplicate_throws()
|
||||
{
|
||||
_repo.Setup(r => r.FindById(It.IsAny<ObjectId>())).ReturnsAsync(ConfigList);
|
||||
|
||||
|
||||
Func<Task> act = () => _service.CreateConfig(ConfigList);
|
||||
|
||||
Assert.ThrowsAsync<BadRequestException>(act);
|
||||
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task RemoveConfigItem_ok()
|
||||
{
|
||||
var deleted = new ConfigObservation { Id = ObjectId.GenerateNewId(), Name = "X" };
|
||||
|
||||
_repo.Setup(r => r.FindById(It.IsAny<ObjectId>())).ReturnsAsync(ConfigList);
|
||||
_repo.Setup(r => r.Delete(It.IsAny<ObjectId>())).ReturnsAsync(deleted);
|
||||
|
||||
var result = await _service.RemoveConfigItem(ObjectId.GenerateNewId());
|
||||
|
||||
Assert.That(result, Is.EqualTo(deleted));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task RemoveConfigItem_null()
|
||||
{
|
||||
_repo.Setup(r => r.FindById(Id)).ReturnsAsync(ConfigList);
|
||||
_repo.Setup(r => r.Delete(Id)).ReturnsAsync((ConfigObservation?)null);
|
||||
|
||||
var result = await _service.RemoveConfigItem(Id);
|
||||
|
||||
Assert.That(result, Is.Null);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user