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); }
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); }
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"]); }
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"]); }
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); }
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); }