Exemple #1
0
        public async Task Test_EFDataProvider_AuditEntityDisabledAsync()
        {
            var dp = new EntityFrameworkDataProvider();

            dp.AuditTypeMapper = t =>
            {
                if (t == typeof(Order))
                {
                    return(typeof(OrderAudit));
                }
                if (t == typeof(Orderline))
                {
                    return(typeof(OrderlineAudit));
                }
                return(null);
            };

            dp.AuditEntityAction = (ev, entry, obj) =>
            {
                // return false to avoid saving
                return(false);
            };

            Audit.Core.Configuration.Setup()
            .UseCustomProvider(dp);
            var id = Guid.NewGuid().ToString();

            using (var ctx = new AuditPerTableContext())
            {
                var o = new Order()
                {
                    Number     = id,
                    Status     = "Pending",
                    OrderLines = new Collection <Orderline>()
                    {
                        new Orderline()
                        {
                            Product = "p1: " + id, Quantity = 2
                        },
                        new Orderline()
                        {
                            Product = "p2: " + id, Quantity = 3
                        }
                    }
                };
                await ctx.AddAsync(o);

                await ctx.SaveChangesAsync();
            }

            using (var ctx = new AuditPerTableContext())
            {
                var order = await ctx.Order.SingleAsync(a => a.Number.Equals(id));

                var orderlineAudits = ctx.OrderlineAudit.AsNoTracking().Where(a => a.OrderId.Equals(order.Id)).ToList();
                Assert.AreEqual(0, orderlineAudits.Count);
            }
        }
Exemple #2
0
        public void Test_EFDataProvider_ProxiedLazyLoading()
        {
            var evs = new List <AuditEvent>();

            Audit.Core.Configuration.AddCustomAction(ActionType.OnEventSaved, scope =>
            {
                evs.Add(scope.Event);
            });

            var dp = new EntityFrameworkDataProvider();

            dp.AuditTypeMapper = t =>
            {
                if (t == typeof(Order))
                {
                    return(typeof(OrderAudit));
                }
                if (t == typeof(Orderline))
                {
                    return(typeof(OrderlineAudit));
                }
                return(null);
            };

            dp.AuditEntityAction = (ev, entry, obj) =>
            {
                var ab = obj as AuditBase;
                if (ab != null)
                {
                    ab.AuditDate   = DateTime.UtcNow;
                    ab.UserName    = ev.Environment.UserName;
                    ab.AuditStatus = entry.Action;
                }
                return(true);
            };

            Audit.Core.Configuration.Setup()
            .UseCustomProvider(dp);
            var id = Guid.NewGuid().ToString();

            using (var ctx = new AuditPerTableContext())
            {
                var o = ctx.Order.FirstOrDefault();
                o.Number = id;
                ctx.SaveChanges();
            }

            using (var ctx = new AuditPerTableContext())
            {
                var orderAudits = ctx.OrderAudit.AsNoTracking().Where(a => a.Number.Equals(id)).OrderByDescending(a => a.AuditDate).ToList();
                Assert.AreEqual(1, orderAudits.Count);
                Assert.AreEqual("Update", orderAudits[0].AuditStatus);
                Assert.AreEqual(id, orderAudits[0].Number);
            }
            Assert.AreEqual(1, evs.Count);
            Assert.AreEqual(1, evs[0].GetEntityFrameworkEvent().Entries.Count);
            Assert.IsTrue(evs[0].GetEntityFrameworkEvent().Entries[0].GetEntry().Entity.GetType().FullName.StartsWith("Castle.Proxies."));
        }
Exemple #3
0
        internal static ICreationPolicyConfigurator UseEntityFramework(this IConfigurator configurator, Func <Type, Type> auditTypeMapper = null, Func <AuditEvent, EventEntry, object, bool> auditEntityAction = null, bool ignoreMatchedProperties = false)
        {
            var efdp = new EntityFrameworkDataProvider()
            {
                AuditTypeMapper         = auditTypeMapper,
                IgnoreMatchedProperties = ignoreMatchedProperties,
                AuditEntityAction       = auditEntityAction
            };

            Configuration.DataProvider = efdp;
            return(new CreationPolicyConfigurator());
        }
Exemple #4
0
        internal static ICreationPolicyConfigurator UseEntityFramework(this IConfigurator configurator, Func <Type, EventEntry, Type> auditTypeMapper, Func <AuditEvent, EventEntry, object, bool> auditEntityAction, Func <Type, bool> ignoreMatchedPropertiesFunc,
                                                                       Func <AuditEventEntityFramework, DbContext> dbContextBuilder)
        {
            var efdp = new EntityFrameworkDataProvider()
            {
                AuditTypeMapper             = auditTypeMapper,
                IgnoreMatchedPropertiesFunc = ignoreMatchedPropertiesFunc,
                AuditEntityAction           = auditEntityAction,
                DbContextBuilder            = dbContextBuilder
            };

            Configuration.DataProvider = efdp;
            return(new CreationPolicyConfigurator());
        }
        /// <summary>
        /// Store the audits logs in the same EntityFramework model as the audited entities.
        /// </summary>
        internal static ICreationPolicyConfigurator UseEntityFramework(this IConfigurator configurator, Func <Type, EventEntry, Type> auditTypeMapper = null, Action <AuditEvent, EventEntry, object> auditEntityAction = null, bool ignoreMatchedProperties = false)
        {
            var efdp = new EntityFrameworkDataProvider()
            {
                AuditTypeMapper         = auditTypeMapper,
                IgnoreMatchedProperties = ignoreMatchedProperties
            };

            if (auditEntityAction != null)
            {
                efdp.AuditEntityAction = (auditEvent, entry, auditEntity) =>
                {
                    auditEntityAction.Invoke(auditEvent, entry, auditEntity);
                    return(true);
                };
            }
            Configuration.DataProvider = efdp;
            return(new CreationPolicyConfigurator());
        }
        /// <summary>
        /// Store the audits logs in the same EntityFramework model as the audited entities.
        /// </summary>
        internal static ICreationPolicyConfigurator UseEntityFramework(this IConfigurator configurator, Func <Type, EventEntry, Type> auditTypeMapper, Action <AuditEvent, EventEntry, object> auditEntityAction, Func <Type, bool> ignoreMatchedPropertiesFunc,
                                                                       Func <EventEntry, Type> explicitMapper)
        {
            var efdp = new EntityFrameworkDataProvider()
            {
                AuditTypeMapper             = auditTypeMapper,
                IgnoreMatchedPropertiesFunc = ignoreMatchedPropertiesFunc,
                ExplicitMapper = explicitMapper
            };

            if (auditEntityAction != null)
            {
                efdp.AuditEntityAction = (auditEvent, entry, auditEntity) =>
                {
                    auditEntityAction.Invoke(auditEvent, entry, auditEntity);
                    return(Task.FromResult(true));
                };
            }
            Configuration.DataProvider = efdp;
            return(new CreationPolicyConfigurator());
        }
Exemple #7
0
        public async Task Test_EFDataProvider_Async()
        {
            var dp = new EntityFrameworkDataProvider();

            dp.AuditTypeMapper = t =>
            {
                if (t == typeof(Order))
                {
                    return(typeof(OrderAudit));
                }
                if (t == typeof(Orderline))
                {
                    return(typeof(OrderlineAudit));
                }
                return(null);
            };
            dp.AuditEntityAction = (ev, entry, obj) =>
            {
                var ab = obj as AuditBase;
                if (ab != null)
                {
                    ab.AuditDate   = DateTime.UtcNow;
                    ab.UserName    = ev.Environment.UserName;
                    ab.AuditStatus = entry.Action;
                }
                return(true);
            };

            Audit.Core.Configuration.Setup()
            .UseCustomProvider(dp);
            var id = Guid.NewGuid().ToString();

            using (var ctx = new AuditPerTableContext())
            {
                var o = new Order()
                {
                    Number     = id,
                    Status     = "Pending",
                    OrderLines = new Collection <Orderline>()
                    {
                        new Orderline()
                        {
                            Product = "p1: " + id, Quantity = 2
                        },
                        new Orderline()
                        {
                            Product = "p2: " + id, Quantity = 3
                        }
                    }
                };
                await ctx.AddAsync(o);

                await ctx.SaveChangesAsync();
            }

            using (var ctx = new AuditPerTableContext())
            {
                var orderAudit = await ctx.OrderAudit.AsNoTracking().SingleOrDefaultAsync(a => a.Number.Equals(id));

                Assert.NotNull(orderAudit);
                var orderlineAudits = await ctx.OrderlineAudit.AsNoTracking().Where(a => a.OrderId.Equals(orderAudit.Id)).ToListAsync();

                Assert.AreEqual(2, orderlineAudits.Count);
                Assert.AreEqual("p1: " + id, orderlineAudits[0].Product);
                Assert.AreEqual("p2: " + id, orderlineAudits[1].Product);
                Assert.AreEqual("Insert", orderAudit.AuditStatus);
                Assert.AreEqual("Insert", orderlineAudits[0].AuditStatus);
                Assert.AreEqual("Insert", orderlineAudits[1].AuditStatus);
                Assert.AreEqual(orderlineAudits[0].UserName, orderlineAudits[1].UserName);
                Assert.AreEqual(orderlineAudits[0].UserName, orderAudit.UserName);
                Assert.IsFalse(string.IsNullOrWhiteSpace(orderlineAudits[0].UserName));
                Assert.IsFalse(string.IsNullOrWhiteSpace(orderlineAudits[1].UserName));
            }

            using (var ctx = new AuditPerTableContext())
            {
                var o = ctx.Order.Single(a => a.Number.Equals(id));
                o.Status = "Cancelled";
                await ctx.SaveChangesAsync();
            }

            using (var ctx = new AuditPerTableContext())
            {
                var orderAudits = await ctx.OrderAudit.AsNoTracking().Where(a => a.Number.Equals(id)).OrderByDescending(a => a.AuditDate).ToListAsync();

                Assert.AreEqual(2, orderAudits.Count);
                Assert.AreEqual("Update", orderAudits[0].AuditStatus);
                Assert.AreEqual("Cancelled", orderAudits[0].Status);
                Assert.AreEqual("Pending", orderAudits[1].Status);
                Assert.AreEqual("Insert", orderAudits[1].AuditStatus);
            }

            using (var ctx = new AuditPerTableContext())
            {
                var order = await ctx.Order.SingleAsync(a => a.Number.Equals(id));

                var ol = await ctx.Orderline.SingleAsync(a => a.OrderId.Equals(order.Id) && a.Product.StartsWith("p1"));

                ctx.Remove(ol);
                await ctx.SaveChangesAsync();
            }

            using (var ctx = new AuditPerTableContext())
            {
                var order = await ctx.Order.SingleAsync(a => a.Number.Equals(id));

                var orderlineAudits = await ctx.OrderlineAudit.AsNoTracking().Where(a => a.OrderId.Equals(order.Id)).OrderByDescending(a => a.AuditDate).ToListAsync();

                Assert.AreEqual(3, orderlineAudits.Count);
                Assert.AreEqual("Delete", orderlineAudits[0].AuditStatus);
                Assert.IsTrue(orderlineAudits[0].Product.StartsWith("p1"));
            }
        }