381 lines
11 KiB
C#
381 lines
11 KiB
C#
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);
|
|
}
|
|
} |