public async Task Test_AuditApiActionFilter_InheritedResultType()
        {
            // Mock out the context to run the action filter.
            var request = new Mock <HttpRequest>();

            request.SetupGet(r => r.ContentType).Returns("application/json");
            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("/api/values");
            request.SetupGet(r => r.Headers).Returns(new HeaderDictionary(new Dictionary <string, StringValues> {
                { "content-type", "application/json" }
            }));
            request.Setup(c => c.ContentLength).Returns(123);

            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     = "get",
                    ControllerName = "values",
                    Parameters     = new List <ParameterDescriptor>(),
                    MethodInfo     = typeof(ActionFilterUnitTest).GetMethods().First()
                }
            };
            var args       = new Dictionary <string, object>();
            var filters    = new List <IFilterMetadata>();
            var controller = new Mock <Controller>();

            Audit.Core.Configuration.DataProvider   = new DynamicDataProvider();
            Audit.Core.Configuration.CreationPolicy = EventCreationPolicy.InsertOnEnd;

            var filter = new AuditApiAttribute()
            {
                IncludeResponseBody = true
            };

            var actionExecutingContext = new ActionExecutingContext(actionContext, filters, args, controller.Object);
            var actionExecutedContext  = new ActionExecutedContext(actionContext, filters, controller.Object);

            actionExecutedContext.Result = new OkObjectResult("this is the result");

            await filter.OnActionExecutionAsync(actionExecutingContext, async() => await Task.FromResult(actionExecutedContext));

            var action = itemsDict["__private_AuditApiAction__"] as AuditApiAction;

            //Assert
            Assert.AreEqual("this is the result", action.ResponseBody.Value);
        }
Esempio n. 2
0
        public void Test_AuditApiActionFilter()
        {
            // Mock out the context to run the action filter.
            var request = new Mock <HttpRequest>();

            request.SetupGet(r => r.ContentType).Returns("application/json");
            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("/api/values");
            request.SetupGet(r => r.Headers).Returns(new HeaderDictionary(new Dictionary <string, StringValues> {
                { "content-type", "application/json" }
            }));
            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     = "get",
                    ControllerName = "values"
                }
            };
            var args = new Dictionary <string, object>()
            {
                { "test1", "value1" }
            };
            var filters      = new List <IFilterMetadata>();
            var controller   = new Mock <Controller>();
            var dataProvider = new Mock <AuditDataProvider>();

            AuditConfiguration.SetDataProvider(dataProvider.Object);

            var filter = new AuditApiAttribute()
            {
                IncludeHeaders      = true,
                IncludeModelState   = true,
                IncludeResponseBody = true,
                EventTypeName       = "TestEvent"
            };

            var actionExecutingContext = new ActionExecutingContext(actionContext, filters, args, controller.Object);

            filter.OnActionExecuting(actionExecutingContext);

            var actionExecutedContext = new ActionExecutedContext(actionContext, filters, controller.Object);

            actionExecutedContext.Result = new ObjectResult("this is the result");
            filter.OnActionExecuted(actionExecutedContext);

            var action = itemsDict["__private_AuditApiAction__"] as AuditApiAction;
            var scope  = itemsDict["__private_AuditApiScope__"] as AuditScope;

            //Assert
            dataProvider.Verify(p => p.InsertEvent(It.IsAny <AuditEvent>()), Times.Once);
            Assert.Equal("http://200.10.10.20:1010/api/values", action.RequestUrl);
            Assert.Equal("application/json", action.Headers["content-type"]);
            Assert.Equal("values", action.ControllerName);
            Assert.Equal("value1", action.ActionParameters["test1"]);
            Assert.Equal("this is the result", action.ResponseBody);
        }
        public async Task Test_AuditApiActionFilter_InsertOnStartReplaceOnEnd()
        {
            // Mock out the context to run the action filter.
            var request = new Mock <HttpRequest>();

            request.SetupGet(r => r.ContentType).Returns("application/json");
            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("/api/values");
            request.SetupGet(r => r.Headers).Returns(new HeaderDictionary(new Dictionary <string, StringValues> {
                { "content-type", "application/json" }
            }));
            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     = "get",
                    ControllerName = "values"
                }
            };
            var args = new Dictionary <string, object>()
            {
                { "test1", "value1" },
                { "x", new AuditApiAttribute()
                  {
                      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 AuditApiAttribute()
            {
                IncludeHeaders            = true,
                IncludeModelState         = true,
                IncludeResponseBody       = 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");

            await filter.OnActionExecutionAsync(actionExecutingContext, async() => await Task.FromResult(actionExecutedContext));

            var action = itemsDict["__private_AuditApiAction__"] as AuditApiAction;

            //Assert
            Assert.AreEqual("TEST_REFERENCE_TYPE", (action.ActionParameters["x"] as AuditApiAttribute).EventTypeName);
            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("http://200.10.10.20:1010/api/values", action.RequestUrl);
            Assert.AreEqual("application/json", action.Headers["content-type"]);
            Assert.AreEqual("values", action.ControllerName);
            Assert.AreEqual("value1", action.ActionParameters["test1"]);
            Assert.AreEqual("this is the result", action.ResponseBody.Value);
        }
        public void Test_AuditApiActionFilter_ShouldIncludeResponseBody()
        {
            var testCases = new List <TestExcludeCase>()
            {
                new TestExcludeCase {
                    ExcludeList = new [] { HttpStatusCode.OK }, IncludeList = null, IncludeBoolean = true, ExpectInclude_200 = false, ExpectInclude_400 = true
                },
                new TestExcludeCase {
                    ExcludeList = new [] { HttpStatusCode.OK }, IncludeList = null, IncludeBoolean = false, ExpectInclude_200 = false, ExpectInclude_400 = true
                },

                new TestExcludeCase {
                    ExcludeList = new [] { HttpStatusCode.OK }, IncludeList = new [] { HttpStatusCode.OK }, IncludeBoolean = true, ExpectInclude_200 = false, ExpectInclude_400 = false
                },
                new TestExcludeCase {
                    ExcludeList = new [] { HttpStatusCode.OK }, IncludeList = new [] { HttpStatusCode.OK }, IncludeBoolean = false, ExpectInclude_200 = false, ExpectInclude_400 = false
                },

                new TestExcludeCase {
                    ExcludeList = new [] { HttpStatusCode.OK }, IncludeList = new [] { HttpStatusCode.BadRequest }, IncludeBoolean = true, ExpectInclude_200 = false, ExpectInclude_400 = true
                },
                new TestExcludeCase {
                    ExcludeList = new [] { HttpStatusCode.OK }, IncludeList = new [] { HttpStatusCode.BadRequest }, IncludeBoolean = false, ExpectInclude_200 = false, ExpectInclude_400 = true
                },

                new TestExcludeCase {
                    ExcludeList = null, IncludeList = new [] { HttpStatusCode.BadRequest }, IncludeBoolean = true, ExpectInclude_200 = false, ExpectInclude_400 = true
                },
                new TestExcludeCase {
                    ExcludeList = null, IncludeList = new [] { HttpStatusCode.BadRequest }, IncludeBoolean = false, ExpectInclude_200 = false, ExpectInclude_400 = true
                },

                new TestExcludeCase {
                    ExcludeList = null, IncludeList = null, IncludeBoolean = true, ExpectInclude_200 = true, ExpectInclude_400 = true
                },
                new TestExcludeCase {
                    ExcludeList = null, IncludeList = null, IncludeBoolean = false, ExpectInclude_200 = false, ExpectInclude_400 = false
                },

                new TestExcludeCase {
                    ExcludeList = new HttpStatusCode[] { }, IncludeList = null, IncludeBoolean = true, ExpectInclude_200 = true, ExpectInclude_400 = true
                },
                new TestExcludeCase {
                    ExcludeList = new HttpStatusCode[] { }, IncludeList = null, IncludeBoolean = false, ExpectInclude_200 = true, ExpectInclude_400 = true
                },

                new TestExcludeCase {
                    ExcludeList = null, IncludeList = new HttpStatusCode[] { }, IncludeBoolean = true, ExpectInclude_200 = false, ExpectInclude_400 = false
                },
                new TestExcludeCase {
                    ExcludeList = null, IncludeList = new HttpStatusCode[] { }, IncludeBoolean = false, ExpectInclude_200 = false, ExpectInclude_400 = false
                },

                new TestExcludeCase {
                    ExcludeList = new HttpStatusCode[] { }, IncludeList = new [] { HttpStatusCode.BadRequest }, IncludeBoolean = true, ExpectInclude_200 = false, ExpectInclude_400 = true
                },
                new TestExcludeCase {
                    ExcludeList = new HttpStatusCode[] { }, IncludeList = new [] { HttpStatusCode.BadRequest }, IncludeBoolean = false, ExpectInclude_200 = false, ExpectInclude_400 = true
                },

                new TestExcludeCase {
                    ExcludeList = new [] { HttpStatusCode.OK }, IncludeList = new HttpStatusCode[] { }, IncludeBoolean = true, ExpectInclude_200 = false, ExpectInclude_400 = false
                },
                new TestExcludeCase {
                    ExcludeList = new [] { HttpStatusCode.OK }, IncludeList = new HttpStatusCode[] { }, IncludeBoolean = false, ExpectInclude_200 = false, ExpectInclude_400 = false
                },

                new TestExcludeCase {
                    ExcludeList = new [] { HttpStatusCode.Continue }, IncludeList = new HttpStatusCode[] { HttpStatusCode.Forbidden }, IncludeBoolean = true, ExpectInclude_200 = false, ExpectInclude_400 = false
                },
                new TestExcludeCase {
                    ExcludeList = new [] { HttpStatusCode.Continue }, IncludeList = new HttpStatusCode[] { HttpStatusCode.Forbidden }, IncludeBoolean = false, ExpectInclude_200 = false, ExpectInclude_400 = false
                }
            };

            foreach (var testCase in testCases)
            {
                var attr = new AuditApiAttribute();
                attr.ExcludeResponseBodyFor = testCase.ExcludeList;
                attr.IncludeResponseBodyFor = testCase.IncludeList;
                attr.IncludeResponseBody    = testCase.IncludeBoolean;

                var okIncluded  = attr.ShouldIncludeResponseBody(HttpStatusCode.OK);
                var badIncluded = attr.ShouldIncludeResponseBody(HttpStatusCode.BadRequest);
                Assert.AreEqual(testCase.ExpectInclude_200, okIncluded, $"Expect OK (200) included = {testCase.ExpectInclude_200}: {JsonConvert.SerializeObject(testCase)}");
                Assert.AreEqual(testCase.ExpectInclude_400, badIncluded, $"Expect BadRequest (400) included = {testCase.ExpectInclude_400}: {JsonConvert.SerializeObject(testCase)}");
            }
        }
        public async Task Test_AuditApiActionFilter_InsertOnEnd()
        {
            // Mock out the context to run the action filter.
            var request = new Mock <HttpRequest>();

            request.SetupGet(r => r.ContentType).Returns("application/json");
            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("/api/values");
            request.SetupGet(r => r.QueryString).Returns(new QueryString(""));
            request.SetupGet(r => r.PathBase).Returns(new PathString(""));
            request.SetupGet(r => r.Headers).Returns(new HeaderDictionary(new Dictionary <string, StringValues> {
                { "content-type", "application/json" }
            }));
            request.Setup(c => c.ContentLength).Returns(123);

            var httpResponse = new Mock <HttpResponse>();

            httpResponse.SetupGet(c => c.StatusCode).Returns(200);
            httpResponse.Setup(c => c.Headers).Returns(new HeaderDictionary(new Dictionary <string, StringValues> {
                { "header-one", "1" }, { "header-two", "2" }
            }));

            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     = "get",
                    ControllerName = "values",
                    Parameters     = new List <ParameterDescriptor>(),
                    MethodInfo     = typeof(ActionFilterUnitTest).GetMethods().First()
                }
            };
            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 AuditApiAttribute()
            {
                IncludeHeaders         = true,
                IncludeModelState      = true,
                IncludeResponseBody    = true,
                IncludeRequestBody     = true,
                IncludeResponseHeaders = 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");

            await filter.OnActionExecutionAsync(actionExecutingContext, async() => await Task.FromResult(actionExecutedContext));

            var action = itemsDict["__private_AuditApiAction__"] as AuditApiAction;

            //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("http://200.10.10.20:1010/api/values", action.RequestUrl);
            Assert.AreEqual("application/json", action.Headers["content-type"]);
            Assert.AreEqual("values", action.ControllerName);
            Assert.AreEqual("value1", action.ActionParameters["test1"]);
            Assert.AreEqual("this is the result", action.ResponseBody.Value);
            Assert.AreEqual(2, action.ResponseHeaders.Count);
            Assert.AreEqual("1", action.ResponseHeaders["header-one"]);
            Assert.AreEqual("2", action.ResponseHeaders["header-two"]);
            Assert.AreEqual(123, action.RequestBody.Length);
            Assert.AreEqual("application/json", action.RequestBody.Type);
        }
Esempio n. 6
0
        public async Task Test_AuditApiActionFilter_InsertOnStartReplaceOnEnd()
        {
            // Mock out the context to run the action filter.
            var request = new Mock <HttpRequestBase>();

            //var request = new HttpRequest(null, "http://200.10.10.20:1010/api/values", null);
            request.Setup(c => c.ContentType).Returns("application/json");

            var httpResponse = new Mock <HttpResponseBase>();

            httpResponse.Setup(c => c.StatusCode).Returns(200);
            var itemsDict   = new Dictionary <object, object>();
            var httpContext = new Mock <HttpContextBase>();

            httpContext.SetupGet(c => c.Request).Returns(request.Object);
            httpContext.SetupGet(c => c.Items).Returns(() => itemsDict);
            httpContext.SetupGet(c => c.Response).Returns(() => httpResponse.Object);
            var controllerContext = new HttpControllerContext()
            {
                ControllerDescriptor = new HttpControllerDescriptor()
                {
                    ControllerName = "values"
                },
                Request = new HttpRequestMessage()
            };

            controllerContext.Request.Headers.Add("test-header", "header-value");
            var actionDescriptor = new Mock <HttpActionDescriptor>();

            actionDescriptor.Setup(c => c.ActionName).Returns("get");

            var arg = new AuditApiAttribute()
            {
                EventTypeName = "TEST_REFERENCE_TYPE"
            };

            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 AuditApiAttribute()
            {
                IncludeHeaders            = true,
                IncludeModelState         = true,
                IncludeResponseBody       = true,
                EventTypeName             = "TestEvent",
                SerializeActionParameters = true
            };
            var actionContext = new HttpActionContext()
            {
                ActionDescriptor  = actionDescriptor.Object,
                ControllerContext = controllerContext,
            };
            var actionExecutingContext = new HttpActionContext(controllerContext, actionDescriptor.Object);

            actionExecutingContext.ActionArguments.Add("test1", "value1");
            actionExecutingContext.ActionArguments.Add("x", arg);
            var self = new TestClass()
            {
                Id = 1
            };

            actionExecutingContext.ActionArguments.Add("SelfReferencing", self);
            Console.WriteLine(JsonConvert.SerializeObject(self, new JsonSerializerSettings
            {
                NullValueHandling     = NullValueHandling.Ignore,
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            }));
            actionExecutingContext.Request.Properties.Add("MS_HttpContext", httpContext.Object);
            var actionExecutedContext = new HttpActionExecutedContext(actionContext, null);
            var ct = new CancellationTokenSource();
            await filter.OnActionExecutingAsync(actionExecutingContext, ct.Token);

            var scopeFromController  = AuditApiAttribute.GetCurrentScope(controllerContext.Request);
            var actionFromController = scopeFromController.Event.GetWebApiAuditAction();
            await filter.OnActionExecutedAsync(actionExecutedContext, ct.Token);

            var action = itemsDict["__private_AuditApiAction__"] as AuditApiAction;
            var scope  = itemsDict["__private_AuditApiScope__"] as AuditScope;

            //Assert
            var evtn = (action.ActionParameters["x"] as AuditApiAttribute).EventTypeName;

            Assert.AreEqual("TEST_REFERENCE_TYPE", evtn);
            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(action, actionFromController);
            Assert.AreEqual(scope, scopeFromController);
            Assert.AreEqual("header-value", action.Headers["test-header"]);
            Assert.AreEqual("get", action.ActionName);
            Assert.AreEqual("value1", action.ActionParameters["test1"]);
        }
Esempio n. 7
0
        public void Test_AuditApiActionFilter()
        {
            // Mock out the context to run the action filter.
            var request = new Mock <HttpRequestBase>();

            //var request = new HttpRequest(null, "http://200.10.10.20:1010/api/values", null);
            request.Setup(c => c.ContentType).Returns("application/json");

            var httpResponse = new Mock <HttpResponseBase>();

            httpResponse.Setup(c => c.StatusCode).Returns(200);
            var itemsDict   = new Dictionary <object, object>();
            var httpContext = new Mock <HttpContextBase>();

            httpContext.SetupGet(c => c.Request).Returns(request.Object);
            httpContext.SetupGet(c => c.Items).Returns(() => itemsDict);
            httpContext.SetupGet(c => c.Response).Returns(() => httpResponse.Object);
            var controllerContext = new HttpControllerContext()
            {
                ControllerDescriptor = new HttpControllerDescriptor()
                {
                    ControllerName = "values"
                },
                Request = new HttpRequestMessage()
            };

            controllerContext.Request.Headers.Add("test-header", "header-value");
            var actionDescriptor = new Mock <HttpActionDescriptor>();

            actionDescriptor.Setup(c => c.ActionName).Returns("get");

            var args = new Dictionary <string, object>()
            {
                { "test1", "value1" }
            };

            var dataProvider = new Mock <AuditDataProvider>();

            Audit.Core.Configuration.DataProvider = dataProvider.Object;

            var filter = new AuditApiAttribute()
            {
                IncludeHeaders      = true,
                IncludeModelState   = true,
                IncludeResponseBody = true,
                EventTypeName       = "TestEvent"
            };
            var actionContext = new HttpActionContext()
            {
                ActionDescriptor  = actionDescriptor.Object,
                ControllerContext = controllerContext,
            };
            var actionExecutingContext = new HttpActionContext(controllerContext, actionDescriptor.Object);

            actionExecutingContext.ActionArguments.Add("test1", "value1");
            actionExecutingContext.Request.Properties.Add("MS_HttpContext", httpContext.Object);

            filter.OnActionExecuting(actionExecutingContext);

            var scopeFromController  = AuditApiAttribute.GetCurrentScope(controllerContext.Request);
            var actionFromController = scopeFromController.Event.GetWebApiAuditAction();

            var actionExecutedContext = new HttpActionExecutedContext(actionContext, null);

            actionExecutedContext.Response = new System.Net.Http.HttpResponseMessage()
            {
                StatusCode = HttpStatusCode.OK
            };
            filter.OnActionExecuted(actionExecutedContext);

            var action = itemsDict["__private_AuditApiAction__"] as AuditApiAction;
            var scope  = itemsDict["__private_AuditApiScope__"] as AuditScope;

            //Assert
            Assert.Equal(action, actionFromController);
            Assert.Equal(scope, scopeFromController);
            dataProvider.Verify(p => p.InsertEvent(It.IsAny <AuditEvent>()), Times.Once);
            Assert.Equal("header-value", action.Headers["test-header"]);
            Assert.Equal("get", action.ActionName);
            Assert.Equal("value1", action.ActionParameters["test1"]);
        }
Esempio n. 8
0
        public async Task Test_AuditApiActionFilter_InsertOnEnd()
        {
            // Mock out the context to run the action filter.
            var request = new Mock <HttpRequestBase>();

            //var request = new HttpRequest(null, "http://200.10.10.20:1010/api/values", null);
            request.Setup(c => c.ContentType).Returns("application/json");
            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);

            writer.Write("{ Id: 'test' }");
            writer.Flush();
            stream.Position = 0;
            request.Setup(c => c.InputStream).Returns(stream);
            request.Setup(c => c.ContentLength).Returns(123);

            var httpResponse = new Mock <HttpResponseBase>();

            httpResponse.Setup(c => c.StatusCode).Returns(200);
            httpResponse.Setup(c => c.Headers).Returns(new NameValueCollection()
            {
                { "header-one", "1" }, { "header-two", "2" }
            });
            var itemsDict   = new Dictionary <object, object>();
            var httpContext = new Mock <HttpContextBase>();

            httpContext.SetupGet(c => c.Request).Returns(request.Object);
            httpContext.SetupGet(c => c.Items).Returns(() => itemsDict);
            httpContext.SetupGet(c => c.Response).Returns(() => httpResponse.Object);
            var controllerContext = new HttpControllerContext()
            {
                ControllerDescriptor = new HttpControllerDescriptor()
                {
                    ControllerName = "values"
                },
                Request = new HttpRequestMessage()
            };

            controllerContext.Request.Headers.Add("test-header", "header-value");
            var actionDescriptor = new CandidateHttpActionDescriptor_Test(new ReflectedHttpActionDescriptor()
            {
                MethodInfo    = typeof(ActionFilterUnitTest).GetMethods().First(),
                ActionBinding = new HttpActionBinding()
            });

            var args = new Dictionary <string, object>()
            {
                { "test1", "value1" }
            };

            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 AuditApiAttribute()
            {
                IncludeHeaders         = true,
                IncludeModelState      = true,
                IncludeResponseBody    = true,
                IncludeRequestBody     = true,
                IncludeResponseHeaders = true,
                EventTypeName          = "TestEvent"
            };

            var actionContext = new HttpActionContext()
            {
                ActionDescriptor  = actionDescriptor,
                ControllerContext = controllerContext,
            };
            var actionExecutingContext = new HttpActionContext(controllerContext, actionDescriptor);

            actionExecutingContext.ActionArguments.Add("test1", "value1");
            var self = new TestClass()
            {
                Id = 1
            };

            actionExecutingContext.ActionArguments.Add("SelfReferencing", self);
            Console.WriteLine(JsonConvert.SerializeObject(self, new JsonSerializerSettings
            {
                NullValueHandling     = NullValueHandling.Ignore,
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            }));
            actionExecutingContext.Request.Properties.Add("MS_HttpContext", httpContext.Object);
            var response = new HttpResponseMessage(HttpStatusCode.OK);

            response.Headers.Add("header-one", "1");
            response.Headers.Add("header-two", "2");
            var actionExecutedContext = new HttpActionExecutedContext(actionContext, null)
            {
                Response = response
            };
            var ct = new CancellationTokenSource();
            await filter.OnActionExecutingAsync(actionExecutingContext, ct.Token);

            var scopeFromController  = AuditApiAdapter.GetCurrentScope(controllerContext.Request, null);
            var actionFromController = scopeFromController.Event.GetWebApiAuditAction();
            await filter.OnActionExecutedAsync(actionExecutedContext, ct.Token);

            var action = itemsDict["__private_AuditApiAction__"] as AuditApiAction;
            var scope  = itemsDict["__private_AuditApiScope__"] 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("header-value", action.Headers["test-header"]);
            Assert.AreEqual(typeof(ActionFilterUnitTest).GetMethods().First().Name, action.ActionName);
            Assert.AreEqual(action, actionFromController);
            Assert.AreEqual(scope, scopeFromController);
            Assert.AreEqual("value1", action.ActionParameters["test1"]);
            Assert.AreEqual(123, ((dynamic)action.RequestBody).Length);
            Assert.AreEqual("application/json", ((dynamic)action.RequestBody).Type);
            Assert.AreEqual(2, action.ResponseHeaders.Count);
            Assert.AreEqual("1", action.ResponseHeaders["header-one"]);
            Assert.AreEqual("2", action.ResponseHeaders["header-two"]);

            Assert.AreEqual(actionContext.ActionDescriptor.ActionName, action.GetHttpActionContext().ActionDescriptor.ActionName);
        }
Esempio n. 9
0
        public async Task Test_AuditApiActionFilter_Manual()
        {
            // Mock out the context to run the action filter.
            var request = new Mock <HttpRequestBase>();

            //var request = new HttpRequest(null, "http://200.10.10.20:1010/api/values", null);
            request.Setup(c => c.ContentType).Returns("application/json");

            var httpResponse = new Mock <HttpResponseBase>();

            httpResponse.Setup(c => c.StatusCode).Returns(200);
            var itemsDict   = new Dictionary <object, object>();
            var httpContext = new Mock <HttpContextBase>();

            httpContext.SetupGet(c => c.Request).Returns(request.Object);
            httpContext.SetupGet(c => c.Items).Returns(() => itemsDict);
            httpContext.SetupGet(c => c.Response).Returns(() => httpResponse.Object);
            var controllerContext = new HttpControllerContext()
            {
                ControllerDescriptor = new HttpControllerDescriptor()
                {
                    ControllerName = "values"
                },
                Request = new HttpRequestMessage()
            };

            controllerContext.Request.Headers.Add("test-header", "header-value");
            var actionDescriptor = new ReflectedHttpActionDescriptor();

            actionDescriptor.MethodInfo    = typeof(ActionFilterUnitTest).GetMethods().First();
            actionDescriptor.ActionBinding = new HttpActionBinding();

            var args = new Dictionary <string, object>()
            {
                { "test1", "value1" }
            };

            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.Manual;
            var filter = new AuditApiAttribute()
            {
                IncludeHeaders      = true,
                IncludeModelState   = true,
                IncludeResponseBody = true,
                EventTypeName       = "TestEvent"
            };
            var actionContext = new HttpActionContext()
            {
                ActionDescriptor  = actionDescriptor,
                ControllerContext = controllerContext,
            };

            var actionExecutingContext = new HttpActionContext(controllerContext, actionDescriptor);

            actionExecutingContext.ActionArguments.Add("test1", "value1");
            actionExecutingContext.Request.Properties.Add("MS_HttpContext", httpContext.Object);
            var actionExecutedContext = new HttpActionExecutedContext(actionContext, null)
            {
                Response = new HttpResponseMessage(HttpStatusCode.OK)
            };
            var ct = new CancellationTokenSource();
            await filter.OnActionExecutingAsync(actionExecutingContext, ct.Token);

            var scopeFromController  = AuditApiAdapter.GetCurrentScope(controllerContext.Request, null);
            var actionFromController = scopeFromController.Event.GetWebApiAuditAction();
            await filter.OnActionExecutedAsync(actionExecutedContext, ct.Token);

            var action = itemsDict["__private_AuditApiAction__"] as AuditApiAction;
            var scope  = itemsDict["__private_AuditApiScope__"] as AuditScope;

            //Assert
            dataProvider.Verify(p => p.InsertEvent(It.IsAny <AuditEvent>()), Times.Never);
            dataProvider.Verify(p => p.InsertEventAsync(It.IsAny <AuditEvent>()), Times.Never);
            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("header-value", action.Headers["test-header"]);
            Assert.AreEqual(actionDescriptor.MethodInfo.Name, action.ActionName);
            Assert.AreEqual("value1", action.ActionParameters["test1"]);
            Assert.AreEqual(actionContext.ActionDescriptor.ActionName, action.HttpActionContext.ActionDescriptor.ActionName);
        }