Se hicieron cambios en los filtros, se limpian los json para evtiar subir nulos y se arreglo el error que tenia con admision

This commit is contained in:
jrojas
2024-11-26 15:54:28 +01:00
parent 8c3be106f9
commit 7c08e6e218
122 changed files with 3745 additions and 1905 deletions
@@ -1,5 +1,8 @@
using System.Security.Claims;
using audit_logs.Models;
using audit_logs.Models.DTO;
using audit_logs.Utils;
using MongoDB.Bson;
namespace audit_test.Repository;
@@ -10,7 +13,7 @@ using audit_logs.Services;
public class AuditServiceIntegrationTests
{
private AuditService _service;
// private AuditRecordRepository _repository;
// private AuditRecordRepository _repository;
[Order(1)]
[SetUp]
@@ -78,11 +81,11 @@ public class AuditServiceIntegrationTests
foreach (var rec in records)
{
await _service.AuditLogRepository.InsertOneAsync(rec);
await _service.AuditLogRepository.InsertOneAsync(rec);
}
// Test retrieval method
var allRecords = await _service.AuditLogRepository.GetAllAuditRecordsAsync();
var allRecords = await _service.AuditLogRepository.GetAllAuditRecordsAsync();
// Assert
Assert.AreEqual(2, allRecords.Count, "All records should be retrieved.");
@@ -91,15 +94,21 @@ public class AuditServiceIntegrationTests
}
[Test]
public async Task DetectChangesAsync_DetectsAndRecordsChanges()
public async Task DetectChangesAsync_DetectsAndRecordsChanges() //este es el que da problemas
{
// Arrange
// Arrange
var user = new ClaimsPrincipal(new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, "testUser"),
new Claim("IpAddress", "127.0.0.1")
}));
// Variables de auditoría
AuditLogData auditLogData = new();
auditLogData.OriginalJson = "{ \"Username\": \"oldUser\", \"Email\": \"old@example.com\", \"address\": 15 }";
auditLogData.ModifiedJson =
"{ \"Username\": \"newUser\", \"Email\": \"old@example.com\", \"PhoneNumber\": \"123456789\" }";
auditLogData.OriginalJson = "{\"nhc\":\"C469\",\"person\":{\"admTime\":\"2024-11-26T12:03:36.276Z\",\"birthDate\":\"2024-11-02\",\"firstName\":\"Carlos Vi\",\"secondName\":\"Rey\",\"gender\":\"Male\",\"allergies\":\"\",\"ids\":{\"MR\":\"C469\"},\"historicalIds\":{}},\"unitId\":\"662760a96bdc7150b49fe29d\",\"admissionDate\":\"2024-11-26T12:03:36.276Z\",\"allergies\":\"\",\"diagnosis\":{\"optionType\":null,\"name\":\"Absceso amebiano del cerebro\",\"iconDefault\":null,\"iconLight\":null,\"iconDark\":null,\"color\":null,\"bgColor\":null,\"description\":\"A06.6\",\"initDate\":null,\"endDate\":null},\"origin\":{\"optionType\":null,\"name\":\"3A ucip\",\"iconDefault\":null,\"iconLight\":null,\"iconDark\":null,\"color\":null,\"bgColor\":null,\"description\":null,\"initDate\":null,\"endDate\":null},\"pointOfCareId\":null,\"languageBarrier\":\"\",\"originAux\":\"\",\"diagnosisAux\":\"Absceso amebiano del cerebro\"}";
// auditLogData.ModifiedJson = "{\"nhc\":\"H987541\",\"patientLocation\":{\"unitName\":\"SMACST\",\"bed\":\"SMT 2\",\"room\":\"SMT 2\"},\"person\":{\"admTime\":\"2024-11-26T10:31:37.018Z\",\"birthDate\":\"2024-11-01\",\"firstName\":\"Carlos\",\"secondName\":\"Borja\",\"gender\":\"Male\",\"allergies\":[{\"optionType\":null,\"name\":\"Sí\",\"iconDefault\":\"icCheck\",\"iconLight\":null,\"iconDark\":null,\"color\":null,\"bgColor\":null,\"description\":null,\"initDate\":null,\"endDate\":null}],\"ids\":{\"MR\":\"H987541\"},\"historicalIds\":{}},\"unitId\":\"662760a96bdc7150b49fe29d\",\"admissionDate\":\"2024-11-26T10:31:37.018Z\",\"allergies\":[{\"optionType\":null,\"name\":\"Sí\",\"iconDefault\":\"icCheck\",\"iconLight\":null,\"iconDark\":null,\"color\":null,\"bgColor\":null,\"description\":null,\"initDate\":null,\"endDate\":null}],\"diagnosis\":{\"optionType\":null,\"name\":\"Absceso amebiano del cerebro\",\"iconDefault\":null,\"iconLight\":null,\"iconDark\":null,\"color\":null,\"bgColor\":null,\"description\":\"A06.6\",\"initDate\":null,\"endDate\":null},\"origin\":{\"optionType\":null,\"name\":\"3A ucip\",\"iconDefault\":null,\"iconLight\":null,\"iconDark\":null,\"color\":null,\"bgColor\":null,\"description\":null,\"initDate\":null,\"endDate\":null},\"pointOfCareId\":\"662761fc6bdc7150b49fe29f\",\"languageBarrier\":\"\",\"originAux\":\"\",\"diagnosisAux\":\"Absceso amebiano del cerebro\"}";
auditLogData.ModifiedJson = null;//"{\"nhc\":\"C469\",\"person\":{\"admTime\":\"2024-11-26T12:03:36.276Z\",\"birthDate\":\"2024-11-01\",\"firstName\":\"Carlos V\",\"secondName\":\"Rey\",\"gender\":\"Male\",\"allergies\":\"\",\"ids\":{\"MR\":\"C469\"},\"historicalIds\":{}},\"unitId\":\"662760a96bdc7150b49fe29d\",\"admissionDate\":\"2024-11-26T12:03:36.276Z\",\"allergies\":\"\",\"diagnosis\":{\"optionType\":null,\"name\":\"Absceso amebiano del cerebro\",\"iconDefault\":null,\"iconLight\":null,\"iconDark\":null,\"color\":null,\"bgColor\":null,\"description\":\"A06.6\",\"initDate\":null,\"endDate\":null},\"origin\":{\"optionType\":null,\"name\":\"3A ucip\",\"iconDefault\":null,\"iconLight\":null,\"iconDark\":null,\"color\":null,\"bgColor\":null,\"description\":null,\"initDate\":null,\"endDate\":null},\"pointOfCareId\":null,\"languageBarrier\":\"\",\"originAux\":\"\",\"diagnosisAux\":\"Absceso amebiano del cerebro\"}";
auditLogData.EntityType = "User";
auditLogData.RecordId = "1";
auditLogData.UserId = "123";
@@ -111,12 +120,9 @@ public class AuditServiceIntegrationTests
// Act - Llamar a DetectChangesAsync para que identifique cambios
await _service.CreateAuditLogAsync(auditLogData);
// Act - Registrar la auditoría usando los cambios detectados
// List<AuditRecord.Change> changes = new JsonComparer().GetDifferences(originalJson, modifiedJson);
//await _service.RecordAuditAsync(entityType, recordId, userId, actionType, reason,actionTime, changes, );
// Retrieve all records to validate insertion
var allRecords = await _service.AuditLogRepository.GetAllAuditRecordsAsync();
var allRecords = await _service.AuditLogRepository.GetAllAuditRecordsAsync();
// Assert
Assert.AreEqual(1, allRecords.Count, "Debe haber exactamente un registro de auditoría en la base de datos.");
@@ -128,80 +134,237 @@ public class AuditServiceIntegrationTests
Assert.AreEqual(auditLogData.Reason, storedRecord.Reason);
// Verificar que los cambios detectados sean correctos
Assert.That(storedRecord.Changes.Count, Is.EqualTo(3), "Debería detectar tres cambios.");
Assert.That(storedRecord.Changes.Count, Is.EqualTo(10), "Debería detectar tres cambios.");
var changeUsername = storedRecord.Changes.Find(c => c.Field == "Username");
Assert.NotNull(changeUsername, "Debe existir un cambio en el campo 'Username'.");
Assert.AreEqual("oldUser", changeUsername.OldValue.AsString);
Assert.AreEqual("newUser", changeUsername.NewValue.AsString);
Assert.AreEqual("string", changeUsername.ValueType);
var changePhoneNumber = storedRecord.Changes.Find(c => c.Field == "PhoneNumber");
Assert.NotNull(changePhoneNumber, "Debe existir un cambio en el campo 'PhoneNumber'.");
Assert.IsTrue(changePhoneNumber.OldValue.IsBsonNull, "El valor anterior de 'PhoneNumber' debe ser nulo.");
Assert.AreEqual("123456789", changePhoneNumber.NewValue.AsString);
Assert.AreEqual("string", changePhoneNumber.ValueType);
}
[Test]
public async Task GetAuditLogsAsync_ReturnsPaginatedRecords()
{
// Arrange - Insert multiple audit records to test pagination
var records = new List<AuditRecord>();
for (int i = 1; i <= 20; i++)
public async Task GetAuditLogsAsync_ReturnsPaginatedRecords()
{
records.Add(new AuditRecord
// Arrange - Insert multiple audit records to test pagination
var records = new List<AuditRecord>();
for (int i = 1; i <= 20; i++)
{
EntityType = "TestEntity",
RecordId = i.ToString(),
UserId = "User" + i,
ActionType = "Create",
ActionTime = DateTime.UtcNow,
Reason = "Test Reason " + i,
Changes = new List<AuditRecord.Change>
records.Add(new AuditRecord
{
new AuditRecord.Change
EntityType = "TestEntity",
RecordId = i.ToString(),
UserId = "User" + i,
ActionType = "Create",
ActionTime = DateTime.UtcNow,
Reason = "Test Reason " + i,
Changes = new List<AuditRecord.Change>
{
Field = "Field" + i,
OldValue = "OldValue" + i,
NewValue = "NewValue" + i,
ValueType = "String"
new AuditRecord.Change
{
Field = "Field" + i,
OldValue = "OldValue" + i,
NewValue = "NewValue" + i,
ValueType = "String"
}
}
}
});
});
}
foreach (var record in records)
{
await _service.AuditLogRepository.InsertOneAsync(record);
}
// Act - Retrieve the first page with a page size of 5
int pageNumber = 1;
int pageSize = 5;
SpecificAuditLogFilterDto auditLogParametersDto = new SpecificAuditLogFilterDto();
auditLogParametersDto.pageNumber=1;
auditLogParametersDto.pageSize = 5;
var paginatedResult = await _service.GetAuditLogsBySpecificFilterAsync(auditLogParametersDto);
// Assert - Check that the pagination returns the correct number of records and page information
Assert.AreEqual(pageSize, paginatedResult.Records.Count(), "The number of records should match the page size.");
Assert.AreEqual(20, paginatedResult.TotalRecords,"The total number of records should match the inserted records.");
Assert.AreEqual(4, paginatedResult.TotalPages, "The total pages should be calculated correctly.");
Assert.AreEqual(pageNumber, paginatedResult.CurrentPage, "The current page should be correct.");
// Further assertions to check that the records and changes are the expected ones
var firstRecord = paginatedResult.Records.First();
Assert.AreEqual("TestEntity", firstRecord.EntityType);
Assert.AreEqual("1", firstRecord.RecordId);
Assert.AreEqual("User1", firstRecord.UserId);
Assert.AreEqual("Create", firstRecord.ActionType);
// Verify the changes for the first record
Assert.IsNotNull(firstRecord.Changes);
Assert.AreEqual(1, firstRecord.Changes.Count, "There should be exactly one change in the first record.");
var firstChange = firstRecord.Changes.First();
Assert.AreEqual("Field1", firstChange.Field);
Assert.AreEqual("OldValue1", firstChange.OldValue);
Assert.AreEqual("NewValue1", firstChange.NewValue);
Assert.AreEqual("String", firstChange.ValueType);
}
foreach (var record in records)
[Test]
public async Task CreateAuditLogAsync_CreatesCorrectAuditLog()
{
await _service.AuditLogRepository.InsertOneAsync(record);
// Arrange
var user = new ClaimsPrincipal(new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, "testUser"),
new Claim("IpAddress", "127.0.0.1")
}));
var dataOriginal = new
{
Id = ObjectId.GenerateNewId(),
Name = "OldName",
Email = "old@example.com"
};
var dataModified = new
{
Id = dataOriginal.Id,
Name = "NewName",
Email = "new@example.com"
};
string reason = "Updating user details";
// Act
await _service.CreateAuditLogAsync(user, dataOriginal, dataModified, reason);
// Assert - Retrieve audit logs to validate
var allRecords = await _service.AuditLogRepository.GetAllAuditRecordsAsync();
Assert.AreEqual(1, allRecords.Count, "There should be exactly one audit log entry.");
var storedRecord = allRecords[0];
// Validate stored record
Assert.AreEqual("AnonymousType", storedRecord.EntityType);
Assert.AreEqual(dataOriginal.Id.ToString(), storedRecord.RecordId);
Assert.AreEqual("testUser", storedRecord.UserId);
Assert.AreEqual("update", storedRecord.ActionType);
Assert.AreEqual(reason, storedRecord.Reason);
Assert.AreEqual("127.0.0.1", storedRecord.UserIpAddress);
// Validate changes
Assert.AreEqual(2, storedRecord.Changes.Count, "There should be exactly two detected changes.");
var nameChange = storedRecord.Changes.Find(c => c.Field == "Name");
Assert.NotNull(nameChange, "There should be a change in the 'Name' field.");
Assert.AreEqual("OldName", nameChange.OldValue.AsString);
Assert.AreEqual("NewName", nameChange.NewValue.AsString);
Assert.AreEqual("string", nameChange.ValueType);
var emailChange = storedRecord.Changes.Find(c => c.Field == "Email");
Assert.NotNull(emailChange, "There should be a change in the 'Email' field.");
Assert.AreEqual("old@example.com", emailChange.OldValue.AsString);
Assert.AreEqual("new@example.com", emailChange.NewValue.AsString);
Assert.AreEqual("string", emailChange.ValueType);
}
// Act - Retrieve the first page with a page size of 5
int pageNumber = 1;
int pageSize = 5;
var paginatedResult = await _service.GetAuditLogsAsync(pageNumber, pageSize);
[Test]
public async Task CreateAuditLogAsync_WithNullIpAndDataOriginal_CreatesCorrectAuditLog()
{
// Arrange
var user = new ClaimsPrincipal(new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, "testUser"),
// IP Address claim is not included to simulate a null IP scenario
}));
// Assert - Check that the pagination returns the correct number of records and page information
Assert.AreEqual(pageSize, paginatedResult.Records.Count(), "The number of records should match the page size.");
Assert.AreEqual(20, paginatedResult.TotalRecords, "The total number of records should match the inserted records.");
Assert.AreEqual(4, paginatedResult.TotalPages, "The total pages should be calculated correctly.");
Assert.AreEqual(pageNumber, paginatedResult.CurrentPage, "The current page should be correct.");
// Set dataOriginal to null to simulate scenario
object dataOriginal = null;
// Further assertions to check that the records and changes are the expected ones
var firstRecord = paginatedResult.Records.First();
Assert.AreEqual("TestEntity", firstRecord.EntityType);
Assert.AreEqual("1", firstRecord.RecordId);
Assert.AreEqual("User1", firstRecord.UserId);
Assert.AreEqual("Create", firstRecord.ActionType);
var dataModified = new
{
Id = ObjectId.GenerateNewId(),
Name = "NewName",
Email = "new@example.com"
};
// Verify the changes for the first record
Assert.IsNotNull(firstRecord.Changes);
Assert.AreEqual(1, firstRecord.Changes.Count, "There should be exactly one change in the first record.");
var firstChange = firstRecord.Changes.First();
Assert.AreEqual("Field1", firstChange.Field);
Assert.AreEqual("OldValue1", firstChange.OldValue.AsString);
Assert.AreEqual("NewValue1", firstChange.NewValue.AsString);
Assert.AreEqual("String", firstChange.ValueType);
}
string reason = "Creating new user";
// Act
await _service.CreateAuditLogAsync(user, dataOriginal, dataModified, reason);
// Assert - Retrieve audit logs to validate
var allRecords = await _service.AuditLogRepository.GetAllAuditRecordsAsync();
Assert.AreEqual(1, allRecords.Count, "There should be exactly one audit log entry.");
var storedRecord = allRecords[0];
// Validate stored record
Assert.AreEqual("AnonymousType", storedRecord.EntityType);
Assert.AreEqual(dataModified.Id.ToString(), storedRecord.RecordId);
Assert.AreEqual("testUser", storedRecord.UserId);
Assert.AreEqual("create", storedRecord.ActionType); // Action type should be 'create' as original data is null
Assert.AreEqual(reason, storedRecord.Reason);
// Validate changes - expecting changes in name and email as it's a creation
Assert.AreEqual(3, storedRecord.Changes.Count, "There should be exactly two detected changes.");
var nameChange = storedRecord.Changes.Find(c => c.Field == "Name");
Assert.NotNull(nameChange, "There should be a change in the 'Name' field.");
Assert.IsTrue(nameChange.OldValue.IsBsonNull, "Old value should be null for new creations.");
Assert.AreEqual("NewName", nameChange.NewValue.AsString);
Assert.AreEqual("string", nameChange.ValueType);
var emailChange = storedRecord.Changes.Find(c => c.Field == "Email");
Assert.NotNull(emailChange, "There should be a change in the 'Email' field.");
Assert.IsTrue(emailChange.OldValue.IsBsonNull, "Old value should be null for new creations.");
Assert.AreEqual("new@example.com", emailChange.NewValue.AsString);
Assert.AreEqual("string", emailChange.ValueType);
}
[Test]
public async Task CreateAuditLogAsync_WithNullIpAndDataModified_CreatesCorrectAuditLog()
{
// Arrange
var user = new ClaimsPrincipal(new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, "testUser"),
// IP Address claim is not included to simulate a null IP scenario
}));
// Set dataModified to null to simulate the scenario
object? dataModified = null;
var dataOriginal = new
{
Id = ObjectId.GenerateNewId(),
Name = "OldName",
Email = "old@example.com"
};
string reason = "Deleting user";
// Act
await _service.CreateAuditLogAsync(user, dataOriginal, dataModified, reason);
// Assert - Retrieve audit logs to validate
var allRecords = await _service.AuditLogRepository.GetAllAuditRecordsAsync();
Assert.AreEqual(1, allRecords.Count, "There should be exactly one audit log entry.");
var storedRecord = allRecords[0];
// Validate stored record
Assert.AreEqual("AnonymousType", storedRecord.EntityType);
Assert.AreEqual(dataOriginal.Id.ToString(), storedRecord.RecordId);
Assert.AreEqual("testUser", storedRecord.UserId);
Assert.AreEqual("delete", storedRecord.ActionType); // Action type should be 'delete' as modified data is null
Assert.AreEqual(reason, storedRecord.Reason);
// Validate changes - expecting no changes as it's a deletion
Assert.AreEqual(3, storedRecord.Changes.Count, "There should be exactly two detected changes.");
var nameChange = storedRecord.Changes.Find(c => c.Field == "Name");
Assert.NotNull(nameChange, "There should be a change in the 'Name' field.");
Assert.AreEqual("OldName", nameChange.OldValue.AsString, "Old value should be 'OldName'.");
Assert.IsTrue(nameChange.NewValue.IsBsonNull, "New value should be null for deletions.");
Assert.AreEqual("string", nameChange.ValueType);
var emailChange = storedRecord.Changes.Find(c => c.Field == "Email");
Assert.NotNull(emailChange, "There should be a change in the 'Email' field.");
Assert.AreEqual("old@example.com", emailChange.OldValue.AsString, "Old value should be 'old@example.com'.");
Assert.IsTrue(emailChange.NewValue.IsBsonNull, "New value should be null for deletions.");
Assert.AreEqual("string", emailChange.ValueType);
}
}