public void TestWithValidValues() { // ARRANGE IAuditHeader paramAuditHeader = Create.AuditHeader(); const string paramTableName = "Organisation"; const string paramColumnName = "Id"; Guid paramRecordId = Guid.NewGuid(); const string paramNewValue = "New Value"; // ACT IAuditDetail auditDetail = AuditDetail.CreateForCreate( paramAuditHeader, paramTableName, paramColumnName, paramRecordId, paramNewValue); // ASSERT Assert.IsNotNull(auditDetail); Assert.AreNotEqual(paramRecordId, auditDetail.Id); Assert.AreSame(paramAuditHeader, auditDetail.AuditHeader); Assert.AreEqual(paramTableName, auditDetail.TableName); Assert.AreEqual(paramColumnName, auditDetail.ColumnName); Assert.AreEqual(paramRecordId, auditDetail.RecordId); Assert.IsNull(auditDetail.OldValue); Assert.AreEqual(paramNewValue, auditDetail.NewValue); Assert.AreEqual(EDatabaseAction.Create, auditDetail.DatabaseAction); }
public async Task Test_Commit_Writes_Record() { // ARRANGE Mock <ILogger <VirtualBridgeData> > loggerMock = MockFactory.CreateLoggerMock <VirtualBridgeData>(); Mock <ILogger <AuditHeaderRepository> > auditHeaderRepositoryLoggerMock = MockFactory.CreateLoggerMock <AuditHeaderRepository>(); DbContextOptions <DataContext> dbOptions = TestUtils.DbContextOptionsInMemory <TestBeginCommit>( nameof(this.Test_Commit_Writes_Record)); await using DataContext dataContext = new DataContext(dbOptions); AuditHeaderRepository auditHeaderRepository = new AuditHeaderRepository( logger: auditHeaderRepositoryLoggerMock.Object, dataContext: dataContext); Mock <IOrganisationRepository> organisationRepositoryMock = MockFactory.CreateRepositoryMock <IOrganisationRepository>(); VirtualBridgeData data = new VirtualBridgeData( logger: loggerMock.Object, dataContext: dataContext, auditHeaderRepository: auditHeaderRepository, organisationRepository: organisationRepositoryMock.Object); IWho who = Create.Who(); // ACT IAuditHeaderWithAuditDetails auditHeader = await data.BeginTransactionAsync( who : who, auditEvent : EAuditEvent.OrganisationMaintenance) .ConfigureAwait(false); auditHeader.AuditDetails.Add( AuditDetail.CreateForCreate( auditHeader: auditHeader, tableName: "Organisation", columnName: "Name", recordId: Guid.NewGuid(), newValue: "NewValue")); await data.CommitTransactionAsync(who, auditHeader) .ConfigureAwait(false); // ASSERT int auditHeadersCount = await dataContext.AuditHeaders.CountAsync() .ConfigureAwait(false); int auditDetailsCount = await dataContext.AuditDetails.CountAsync() .ConfigureAwait(false); Assert.AreEqual(1, auditHeadersCount); Assert.AreEqual(1, auditDetailsCount); }
/// <summary> /// Audits the create. /// </summary> /// <param name="auditHeader">Audit Header.</param> /// <param name="newObject">New value.</param> /// <param name="recordId">Record Id.</param> internal static void AuditCreate( IAuditHeaderWithAuditDetails?auditHeader, BaseDto newObject, Guid recordId) { if (auditHeader == null) { return; } Type type = newObject.GetType(); PropertyDescriptorCollection propertyDescriptors = TypeDescriptor.GetProperties(type); foreach (PropertyInfo propertyInfo in type.GetProperties().OrderBy(p => p.MetadataToken)) { if (!PropertyUtilities. IsAuditableColumn(propertyDescriptors, propertyInfo)) { continue; } string newValue = propertyInfo.GetValueAsString(newObject); PropertyDescriptor propertyDescriptor = propertyDescriptors[propertyInfo.Name]; TableAttribute?tableAttribute = (TableAttribute?)propertyDescriptor.Attributes[typeof(TableAttribute)]; string tableName = tableAttribute == null ? type.Name : tableAttribute.Name; ColumnAttribute?columnAttribute = (ColumnAttribute?)propertyDescriptor.Attributes[typeof(ColumnAttribute)]; string columnName = columnAttribute == null ? propertyInfo.Name : columnAttribute.Name; IAuditDetail auditDetail = AuditDetail.CreateForCreate( auditHeader: auditHeader, tableName: tableName, columnName: columnName, recordId: recordId, newValue: newValue); auditHeader.AuditDetails.Add(auditDetail); } }
/// <summary> /// Audits the create. /// </summary> /// <param name="auditHeader">Audit Header.</param> /// <param name="newObject">New value.</param> /// <param name="recordId">Record Id.</param> internal static void AuditCreate( IAuditHeaderWithAuditDetails?auditHeader, BaseDto newObject, Guid recordId) { if (auditHeader == null) { return; } Type type = newObject.GetType(); string tableName = type.Name; // TODO:[SJW] Assumed table name matches type name PropertyDescriptorCollection propertyDescriptors = TypeDescriptor.GetProperties(type); foreach (PropertyInfo propertyInfo in type.GetProperties().OrderBy(p => p.MetadataToken)) { if (!PropertyUtilities.IsAuditableColumn(propertyDescriptors, propertyInfo)) { continue; } string newValue = propertyInfo.GetGetMethod().Invoke(newObject, null) == null ? string.Empty : propertyInfo.GetGetMethod().Invoke(newObject, null).ToString(); PropertyDescriptor propertyDescriptor = propertyDescriptors[propertyInfo.Name]; ColumnAttribute? columnAttribute = (ColumnAttribute?)propertyDescriptor.Attributes[typeof(ColumnAttribute)]; string columnName = columnAttribute == null ? propertyInfo.Name : columnAttribute.Name ?? string.Empty; IAuditDetail auditDetail = AuditDetail.CreateForCreate( auditHeader: auditHeader, tableName: tableName, columnName: columnName, recordId: recordId, newValue: newValue); auditHeader.AuditDetails.Add(auditDetail); } }