public void PossiblyReleaseController_CorrectFactory_ReleasesController()
        {
            // Arrange
            RequestContext requestContext      = GetRequestContext();
            IHttpHandler   originalHttpHandler = requestContext.HttpContext.Handler;
            Controller     controller          = new ControllerReadOnlySession();

            Mock <IControllerFactory> mockControllerFactory = new Mock <IControllerFactory>();

            mockControllerFactory.Expect(o => o.CreateController(requestContext, "home")).Returns(controller);
            mockControllerFactory.Expect(o => o.ReleaseController(controller)).Verifiable();

            ControllerBuilder controllerBuilder = new ControllerBuilder();

            controllerBuilder.SetControllerFactory(new MvcDynamicSessionControllerFactory(mockControllerFactory.Object));
            MvcDynamicSessionModule module = new MvcDynamicSessionModule()
            {
                ControllerBuilder = controllerBuilder
            };

            // Act
            module.SetSessionStateMode(requestContext.HttpContext, SimpleDynamicSessionStateConfigurator.ExpectMode(ControllerSessionState.ReadOnly));
            MvcDynamicSessionModule.PossiblyReleaseController(requestContext.HttpContext);

            // Assert
            mockControllerFactory.Verify();
        }
        public void Dispose_DoesNothing() {
            // Arrange
            MvcDynamicSessionModule module = new MvcDynamicSessionModule();

            // Act
            module.Dispose();

            // Assert
            // No exception - life is good
        }
        public void Dispose_DoesNothing()
        {
            // Arrange
            MvcDynamicSessionModule module = new MvcDynamicSessionModule();

            // Act
            module.Dispose();

            // Assert
            // No exception - life is good
        }
        public void SetSessionStateMode_ThrowsIfControllerFactoryIsIncorrect()
        {
            // Arrange
            RequestContext          requestContext = GetRequestContext();
            MvcDynamicSessionModule module         = new MvcDynamicSessionModule();

            // Act & assert
            ExceptionHelper.ExpectInvalidOperationException(
                delegate {
                module.SetSessionStateMode(requestContext.HttpContext, null);
            },
                @"The ControllerBuilder must return an IControllerFactory of type Microsoft.Web.Mvc.MvcDynamicSessionControllerFactory if the MvcDynamicSessionModule is enabled.");
        }
        public void SetSessionStateMode_HandlerIsNotMvcHandler_DoesNothing()
        {
            // Arrange
            IHttpHandler expectedHandler = new Mock <IHttpHandler>().Object;

            Mock <HttpContextBase> mockHttpContext = new Mock <HttpContextBase>();

            mockHttpContext.Expect(o => o.Handler).Returns(expectedHandler);
            mockHttpContext.Expect(o => o.Items).Never();

            MvcDynamicSessionModule module = new MvcDynamicSessionModule();

            // Act
            module.SetSessionStateMode(mockHttpContext.Object, SimpleDynamicSessionStateConfigurator.ExpectNever());

            // Assert
            mockHttpContext.Verify();
        }
        public void SetSessionStateMode_HandlerIsMvcHandler_ControllerHasAttribute_SetsAttributeValue() {
            // Arrange
            RequestContext requestContext = GetRequestContext();
            IHttpHandler originalHttpHandler = requestContext.HttpContext.Handler;

            Mock<IControllerFactory> mockControllerFactory = new Mock<IControllerFactory>();
            mockControllerFactory.Expect(o => o.CreateController(requestContext, "home")).Returns(new ControllerReadOnlySession());

            ControllerBuilder controllerBuilder = new ControllerBuilder();
            controllerBuilder.SetControllerFactory(new MvcDynamicSessionControllerFactory(mockControllerFactory.Object));
            MvcDynamicSessionModule module = new MvcDynamicSessionModule() {
                ControllerBuilder = controllerBuilder
            };

            // Act
            module.SetSessionStateMode(requestContext.HttpContext, SimpleDynamicSessionStateConfigurator.ExpectMode(ControllerSessionState.ReadOnly));

            // Assert
            Assert.AreEqual(2, requestContext.HttpContext.Items.Count, "Cache + factory weren't properly added to Items.");
        }
        public void PossiblyReleaseController_CorrectFactory_ReleasesController() {
            // Arrange
            RequestContext requestContext = GetRequestContext();
            IHttpHandler originalHttpHandler = requestContext.HttpContext.Handler;
            Controller controller = new ControllerReadOnlySession();

            Mock<IControllerFactory> mockControllerFactory = new Mock<IControllerFactory>();
            mockControllerFactory.Expect(o => o.CreateController(requestContext, "home")).Returns(controller);
            mockControllerFactory.Expect(o => o.ReleaseController(controller)).Verifiable();

            ControllerBuilder controllerBuilder = new ControllerBuilder();
            controllerBuilder.SetControllerFactory(new MvcDynamicSessionControllerFactory(mockControllerFactory.Object));
            MvcDynamicSessionModule module = new MvcDynamicSessionModule() {
                ControllerBuilder = controllerBuilder
            };

            // Act
            module.SetSessionStateMode(requestContext.HttpContext, SimpleDynamicSessionStateConfigurator.ExpectMode(ControllerSessionState.ReadOnly));
            MvcDynamicSessionModule.PossiblyReleaseController(requestContext.HttpContext);

            // Assert
            mockControllerFactory.Verify();
        }
        public void SetSessionStateMode_HandlerIsMvcHandler_ControllerHasNoAttribute_SetsDefault()
        {
            // Arrange
            RequestContext requestContext      = GetRequestContext();
            IHttpHandler   originalHttpHandler = requestContext.HttpContext.Handler;

            Mock <IControllerFactory> mockControllerFactory = new Mock <IControllerFactory>();

            mockControllerFactory.Expect(o => o.CreateController(requestContext, "home")).Returns(new ControllerWithoutAttribute());

            ControllerBuilder controllerBuilder = new ControllerBuilder();

            controllerBuilder.SetControllerFactory(new MvcDynamicSessionControllerFactory(mockControllerFactory.Object));
            MvcDynamicSessionModule module = new MvcDynamicSessionModule()
            {
                ControllerBuilder = controllerBuilder
            };

            // Act
            module.SetSessionStateMode(requestContext.HttpContext, SimpleDynamicSessionStateConfigurator.ExpectMode(ControllerSessionState.Default));

            // Assert
            Assert.AreEqual(2, requestContext.HttpContext.Items.Count, "Cache + factory weren't properly added to Items.");
        }
        public void SetSessionStateMode_ThrowsIfControllerFactoryIsIncorrect() {
            // Arrange
            RequestContext requestContext = GetRequestContext();
            MvcDynamicSessionModule module = new MvcDynamicSessionModule();

            // Act & assert
            ExceptionHelper.ExpectInvalidOperationException(
                delegate {
                    module.SetSessionStateMode(requestContext.HttpContext, null);
                },
                @"The ControllerBuilder must return an IControllerFactory of type Microsoft.Web.Mvc.MvcDynamicSessionControllerFactory if the MvcDynamicSessionModule is enabled.");
        }
        public void SetSessionStateMode_HandlerIsNotMvcHandler_DoesNothing() {
            // Arrange
            IHttpHandler expectedHandler = new Mock<IHttpHandler>().Object;

            Mock<HttpContextBase> mockHttpContext = new Mock<HttpContextBase>();
            mockHttpContext.Expect(o => o.Handler).Returns(expectedHandler);
            mockHttpContext.Expect(o => o.Items).Never();

            MvcDynamicSessionModule module = new MvcDynamicSessionModule();

            // Act
            module.SetSessionStateMode(mockHttpContext.Object, SimpleDynamicSessionStateConfigurator.ExpectNever());

            // Assert
            mockHttpContext.Verify();
        }