public async Task Test_MVC_AuditActionFilter_Core_InsertOnEnd() { // Mock out the context to run the action filter. var request = new Mock <HttpRequest>(); request.SetupGet(r => r.Scheme).Returns("http"); request.SetupGet(r => r.Host).Returns(new HostString("200.10.10.20:1010")); request.SetupGet(r => r.Path).Returns("/home/index"); var httpResponse = new Mock <HttpResponse>(); httpResponse.SetupGet(c => c.StatusCode).Returns(200); var itemsDict = new Dictionary <object, object>(); var httpContext = new Mock <HttpContext>(); httpContext.SetupGet(c => c.Request).Returns(request.Object); httpContext.SetupGet(c => c.Items).Returns(() => itemsDict); httpContext.SetupGet(c => c.Response).Returns(() => httpResponse.Object); var ci = new Mock <ConnectionInfo>(); ci.SetupGet(_ => _.RemoteIpAddress).Returns(() => null); httpContext.SetupGet(c => c.Connection).Returns(() => ci.Object); var actionContext = new ActionContext() { HttpContext = httpContext.Object, RouteData = new RouteData(), ActionDescriptor = new ControllerActionDescriptor() { ActionName = "index", ControllerName = "home" } }; var args = new Dictionary <string, object>() { { "test1", "value1" } }; var filters = new List <IFilterMetadata>(); var controller = new Mock <Controller>(); var dataProvider = new Mock <AuditDataProvider>(); dataProvider.Setup(x => x.InsertEventAsync(It.IsAny <AuditEvent>())).ReturnsAsync(() => Task.FromResult(Guid.NewGuid())); Audit.Core.Configuration.DataProvider = dataProvider.Object; Audit.Core.Configuration.CreationPolicy = EventCreationPolicy.InsertOnEnd; var filter = new AuditAttribute() { IncludeHeaders = true, IncludeModel = true, EventTypeName = "TestEvent" }; var actionExecutingContext = new ActionExecutingContext(actionContext, filters, args, controller.Object); var actionExecutedContext = new ActionExecutedContext(actionContext, filters, controller.Object); actionExecutedContext.Result = new ObjectResult("this is the result"); var resultExecuting = new ResultExecutingContext(actionContext, new List <IFilterMetadata>(), new RedirectResult("url"), controller.Object); var resultExecute = new ResultExecutedContext(actionContext, new List <IFilterMetadata>(), new RedirectResult("url"), controller.Object); await filter.OnActionExecutionAsync(actionExecutingContext, async() => await Task.FromResult(actionExecutedContext)); var scopeFromController = AuditAttribute.GetCurrentScope(httpContext.Object); var actionFromController = scopeFromController.Event.GetMvcAuditAction(); await filter.OnResultExecutionAsync(resultExecuting, () => Task.FromResult <ResultExecutedContext>(resultExecute)); var action = itemsDict["__private_AuditAction__"] as AuditAction; var scope = itemsDict["__private_AuditScope__"] as AuditScope; //Assert dataProvider.Verify(p => p.InsertEvent(It.IsAny <AuditEvent>()), Times.Never); dataProvider.Verify(p => p.InsertEventAsync(It.IsAny <AuditEvent>()), Times.Once); dataProvider.Verify(p => p.ReplaceEvent(It.IsAny <object>(), It.IsAny <AuditEvent>()), Times.Never); dataProvider.Verify(p => p.ReplaceEventAsync(It.IsAny <object>(), It.IsAny <AuditEvent>()), Times.Never); Assert.AreEqual(action, actionFromController); Assert.AreEqual(scope, scopeFromController); Assert.AreEqual("http://200.10.10.20:1010/home/index", action.RequestUrl); Assert.AreEqual("home", action.ControllerName); Assert.AreEqual("value1", action.ActionParameters["test1"]); Assert.AreEqual(200, action.ResponseStatusCode); }
public async Task Test_MVC_AuditActionFilter_Core_IgnoreParam() { // Mock out the context to run the action filter. var request = new Mock <HttpRequest>(); request.SetupGet(r => r.Scheme).Returns("http"); request.SetupGet(r => r.Host).Returns(new HostString("200.10.10.20:1010")); request.SetupGet(r => r.Path).Returns("/home/index"); var httpResponse = new Mock <HttpResponse>(); httpResponse.SetupGet(c => c.StatusCode).Returns(200); var itemsDict = new Dictionary <object, object>(); var httpContext = new Mock <HttpContext>(); httpContext.SetupGet(c => c.Request).Returns(request.Object); httpContext.SetupGet(c => c.Items).Returns(() => itemsDict); httpContext.SetupGet(c => c.Response).Returns(() => httpResponse.Object); var actionContext = new ActionContext() { HttpContext = httpContext.Object, RouteData = new RouteData(), ActionDescriptor = new ControllerActionDescriptor() { ActionName = "index", ControllerName = "home", ControllerTypeInfo = typeof(MockMethodInfo).GetTypeInfo(), MethodInfo = typeof(MockMethodInfo).GetMethod("Method1_IgnoredParam") } }; var args = new Dictionary <string, object>() { { "test1", "value1" }, { "x", new AuditAttribute() { EventTypeName = "TEST_REFERENCE_TYPE" } } }; var filters = new List <IFilterMetadata>(); var controller = new Mock <Controller>(); var dataProvider = new Mock <AuditDataProvider>(); dataProvider.Setup(x => x.InsertEventAsync(It.IsAny <AuditEvent>())).ReturnsAsync(() => Task.FromResult(Guid.NewGuid())); Audit.Core.Configuration.DataProvider = dataProvider.Object; Audit.Core.Configuration.CreationPolicy = EventCreationPolicy.InsertOnStartReplaceOnEnd; var filter = new AuditAttribute() { IncludeHeaders = true, IncludeModel = true, EventTypeName = "TestEvent", SerializeActionParameters = true }; var actionExecutingContext = new ActionExecutingContext(actionContext, filters, args, controller.Object); var actionExecutedContext = new ActionExecutedContext(actionContext, filters, controller.Object); actionExecutedContext.Result = new ObjectResult("this is the result"); var resultExecuting = new ResultExecutingContext(actionContext, new List <IFilterMetadata>(), new RedirectResult("url"), controller.Object); var resultExecute = new ResultExecutedContext(actionContext, new List <IFilterMetadata>(), new RedirectResult("url"), controller.Object); await filter.OnActionExecutionAsync(actionExecutingContext, async() => await Task.FromResult(actionExecutedContext)); await filter.OnResultExecutionAsync(resultExecuting, () => Task.FromResult <ResultExecutedContext>(resultExecute)); //Assert var action = itemsDict["__private_AuditAction__"] as AuditAction; var scope = itemsDict["__private_AuditScope__"] as AuditScope; //Assert dataProvider.Verify(p => p.InsertEvent(It.IsAny <AuditEvent>()), Times.Never); dataProvider.Verify(p => p.InsertEventAsync(It.IsAny <AuditEvent>()), Times.Once); dataProvider.Verify(p => p.ReplaceEvent(It.IsAny <object>(), It.IsAny <AuditEvent>()), Times.Never); dataProvider.Verify(p => p.ReplaceEventAsync(It.IsAny <object>(), It.IsAny <AuditEvent>()), Times.Once); Assert.AreEqual(1, action.ActionParameters.Count); Assert.AreEqual("TEST_REFERENCE_TYPE", (action.ActionParameters["x"] as AuditAttribute).EventTypeName); Assert.AreEqual(200, action.ResponseStatusCode); }