Files
adas-core/adas-core.Test/Repositories/PumpObservationRepositoryTest.cs
T

416 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using adas_core.Domain.Enums;
using adas_core.Domain.Models.AppSettings;
using adas_core.Domain.Models.Pumps;
using adas_core.Infrastructure.Repositories;
using Microsoft.Extensions.Options;
using MongoDB.Bson;
using MongoDB.Driver;
namespace adas_core.Test.Repositories;
[TestFixture]
[Category("Integration")]
public class PumpObservationRepositoryTest
{
private PumpObservationRepository _repo;
private IOptions<ApiSettings> _apiSettings;
private static readonly DateTime Now = DateTime.UtcNow;
private static readonly ObjectId PatientId = ObjectId.GenerateNewId();
// -------------------------------------------------------------------
// INIT SETUP DE LA COLECCIÓN CON DATOS DE PRUEBA
// -------------------------------------------------------------------
[OneTimeSetUp]
public async Task Init()
{
_apiSettings = Options.Create(new ApiSettings
{
PumpObservations = "pump_observations"
});
await IntegrationDb.Database.DropCollectionAsync("pump_observations");
await IntegrationDb.Database.CreateCollectionAsync("pump_observations");
_repo = new PumpObservationRepository(
_apiSettings,
IntegrationDb.Database
);
await _repo.CreateIndexes();
var samples = new List<PumpObservation>
{
new()
{
Id = ObjectId.GenerateNewId(),
PatientId = PatientId,
DeviceId = "Device-A",
Name = "PumpX",
Time = Now.AddSeconds(-1),
MessageType = PumpEnum.PumpMessageType.Observation
},
new()
{
Id = ObjectId.GenerateNewId(),
PatientId = PatientId,
DeviceId = "Device-A",
Name = "PumpY",
Time = Now.AddSeconds(-2),
MessageType = PumpEnum.PumpMessageType.Observation
},
new()
{
Id = ObjectId.GenerateNewId(),
PatientId = PatientId,
DeviceId = "Device-A",
Name = "PumpX",
Time = Now.AddSeconds(-3),
MessageType = PumpEnum.PumpMessageType.Observation
}
};
await _repo.InsertManyAsync(samples);
var count = await _repo.Collection.CountDocumentsAsync(_ => true);
Assert.That(count, Is.EqualTo(3));
}
// -------------------------------------------------------------------
// FIND LAST OBSERVATIONS (LÍMITE = 2)
// -------------------------------------------------------------------
[Test]
public async Task FindLastObservations_ReturnsTwo()
{
var list = await _repo.FindLastObservations(PatientId, "PumpX");
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(2));
Assert.That(list[0].Time, Is.GreaterThanOrEqualTo(list[1].Time));
}
// -------------------------------------------------------------------
// INSERT
// -------------------------------------------------------------------
[Test]
public async Task InsertAsync_Works()
{
var pump = new PumpObservation
{
Id = ObjectId.GenerateNewId(),
PatientId = ObjectId.GenerateNewId(),
DeviceId = "Device-B",
Time = Now
};
await _repo.InsertAsync(pump);
var found = await _repo.Collection.FindAsync(x => x.Id == pump.Id);
Assert.That(found.FirstOrDefault(), Is.Not.Null);
}
[Test]
public async Task InsertManyAsync_Works()
{
var list = new List<PumpObservation>
{
new() { Id = ObjectId.GenerateNewId(), DeviceId="D", Time=Now },
new() { Id = ObjectId.GenerateNewId(), DeviceId="D", Time=Now }
};
await _repo.InsertManyAsync(list);
var count = await _repo.Collection.CountDocumentsAsync(x => list.Select(y => y.Id).Contains(x.Id));
Assert.That(count, Is.EqualTo(2));
}
// -------------------------------------------------------------------
// FIND METHODS
// -------------------------------------------------------------------
[Test]
public async Task FindByDeviceIdAsync_ReturnsOrdered()
{
var result = await _repo.FindByDeviceIdAsync("Device-A");
var pumpObservations = result.ToList();
using (Assert.EnterMultipleScope())
{
Assert.That(pumpObservations, Is.Not.Empty);
Assert.That(pumpObservations.First().Time, Is.GreaterThanOrEqualTo(pumpObservations.Last().Time));
}
}
[Test]
public async Task FindByPatientAsync_ReturnsOrdered()
{
var result = await _repo.FindByPatientAsync(PatientId);
var pumpObservations = result.ToList();
using (Assert.EnterMultipleScope())
{
Assert.That(pumpObservations, Is.Not.Empty);
Assert.That(pumpObservations.First().Time, Is.GreaterThanOrEqualTo(pumpObservations.Last().Time));
}
}
[Test]
public async Task FindLastByDeviceIdAsync_Works()
{
var obs = await _repo.FindLastByDeviceIdAsync("Device-A");
Assert.That(obs, Is.Not.Null);
Assert.That(obs.DeviceId, Is.EqualTo("Device-A"));
}
[Test]
public async Task FindByPatientId_Works()
{
var list = await _repo.FindByPatientId(PatientId);
Assert.That(list.Any(), Is.True);
}
// -------------------------------------------------------------------
// AGGREGATED LAST OBSERVATIONS
// -------------------------------------------------------------------
[Test]
public async Task AggregatedPatientLastObservations_DistinctByName()
{
var result = await _repo.AggregatedPatientLastObservations(PatientId);
using (Assert.EnterMultipleScope())
{
Assert.That(result, Is.Not.Empty);
Assert.That(result, Has.Count.LessThanOrEqualTo(2));
}
}
// -------------------------------------------------------------------
// DELETE METHODS
// -------------------------------------------------------------------
[Test]
public async Task DeleteByPatientId_Works()
{
var pid = ObjectId.GenerateNewId();
await _repo.InsertAsync(new PumpObservation
{
Id = ObjectId.GenerateNewId(),
PatientId = pid,
DeviceId = "Z",
Time = Now
});
await _repo.DeleteByPatientId(pid);
var list = await _repo.FindByPatientId(pid);
Assert.That(list.Any(), Is.False);
}
[Test]
public async Task DeleteOlderThanDaysAsync_Works()
{
var pid = ObjectId.GenerateNewId();
await _repo.InsertAsync(new PumpObservation
{
Id = ObjectId.GenerateNewId(),
PatientId = pid,
Name = "TestOld",
Time = Now.AddDays(-10)
});
var deleted = await _repo.DeleteOlderThanDaysAsync(5);
Assert.That(deleted, Is.GreaterThanOrEqualTo(1));
}
[Test]
public async Task DeleteOlderNumberAsync_Works()
{
const string name = "HistoryPump";
var obs = Enumerable.Range(0, 5).Select(i =>
new PumpObservation
{
Id = ObjectId.GenerateNewId(),
DeviceId = "H",
Name = name,
Time = Now.AddSeconds(-i)
});
await _repo.InsertManyAsync(obs);
var deleted = await _repo.DeleteOlderNumberAsync(name, 2);
Assert.That(deleted, Is.EqualTo(3));
}
[Test]
public async Task DeleteKeepLastNAsync_Works()
{
var items = Enumerable.Range(0, 8).Select(i =>
new PumpObservation
{
Id = ObjectId.GenerateNewId(),
DeviceId = "Device-Clean",
Time = Now.AddSeconds(-i)
});
await _repo.InsertManyAsync(items);
var deleted = await _repo.DeleteKeepLastNAsync(3);
Assert.That(deleted, Is.EqualTo(5));
}
// -------------------------------------------------------------------
// UPDATE METHOD
// -------------------------------------------------------------------
[Test]
public async Task UpdateManyObjectIdByFieldAsync_Works()
{
var oldId = ObjectId.GenerateNewId();
var newId = ObjectId.GenerateNewId();
await _repo.InsertAsync(new PumpObservation
{
Id = ObjectId.GenerateNewId(),
PatientId = oldId,
DeviceId = "UpdateTest",
Time = Now
});
var updated = await _repo.UpdateManyObjectIdByFieldAsync("PatientId", newId, oldId);
Assert.That(updated, Is.EqualTo(1));
var found = await _repo.FindByPatientId(newId);
Assert.That(found.Any(), Is.True);
}
// -------------------------------------------------------------------
// AGGREGATION: LAST OBSERVATION TIME PER PATIENT
// -------------------------------------------------------------------
[Test]
public async Task FindAllLastPatientObservationTimeAsync_Works()
{
var dict = await _repo.FindAllLastPatientObservationTimeAsync();
Assert.That(dict, Is.Not.Null);
using (Assert.EnterMultipleScope())
{
Assert.That(dict.ContainsKey(PatientId), Is.True);
Assert.That(dict[PatientId], Is.LessThanOrEqualTo(DateTime.UtcNow));
}
}
[Test]
public async Task FindByDeviceIdAsync_EmptyWhenOutOfDateRange()
{
var from = Now.AddYears(-1);
var to = Now.AddYears(-1).AddHours(1);
var result = await _repo.FindByDeviceIdAsync("Device-A", from, to);
Assert.That(result, Is.Empty);
}
[Test]
public async Task FindByPatientAsync_RespectsLimit()
{
var result = await _repo.FindByPatientAsync(PatientId, limit: 1);
var list = result.ToList();
Assert.That(list, Has.Count.EqualTo(1));
}
[Test]
public async Task FindLastByDeviceIdAsync_ReturnsNullWhenNotExists()
{
var obs = await _repo.FindLastByDeviceIdAsync("Device-DoesNotExist");
Assert.That(obs, Is.Null);
}
[Test]
public async Task InsertManyAsync_IgnoresEmptyList()
{
var empty = new List<PumpObservation>();
Func<Task> act = () => _repo.InsertManyAsync(empty);
Assert.That(act, Throws.Nothing);
}
[Test]
public async Task DeleteOlderNumberAsync_DoesNothingWhenCountBelowLimit()
{
const string name = "LimitTestPump";
var obs = new PumpObservation
{
Id = ObjectId.GenerateNewId(),
DeviceId = "Device-X",
Name = name,
Time = Now
};
await _repo.InsertAsync(obs);
var deleted = await _repo.DeleteOlderNumberAsync(name, maxCount: 5);
Assert.That(deleted, Is.Zero);
}
[Test]
public async Task DeleteOlderThanDaysAsync_DoesNotDeleteRecentObservations()
{
var obs = new PumpObservation
{
Id = ObjectId.GenerateNewId(),
PatientId = PatientId,
DeviceId = "Device-Recent",
Name = "RecentPump",
Time = Now.AddMinutes(-1) // reciente
};
await _repo.InsertAsync(obs);
var deleted = await _repo.DeleteOlderThanDaysAsync(10);
Assert.That(deleted, Is.Zero);
}
[Test]
public async Task AggregatedPatientLastObservations_RemovesDuplicatesByCodeAndName()
{
var patient = ObjectId.GenerateNewId();
var p1 = new PumpObservation
{
Id = ObjectId.GenerateNewId(),
PatientId = patient,
DeviceId = "DevA",
Code = "C1",
Name = "PumpA",
Time = Now
};
var p2 = new PumpObservation
{
Id = ObjectId.GenerateNewId(),
PatientId = patient,
DeviceId = "DevA",
Code = "C1",
Name = "PumpA",
Time = Now.AddSeconds(-1)
};
await _repo.InsertManyAsync([p1, p2]);
var result = await _repo.AggregatedPatientLastObservations(patient);
Assert.That(result, Has.Count.EqualTo(1));
}
}