public void WhenCacheForIsSet_ShouldAppendCacheHeaders()
        {
            var lastModifiedAt = Clock.UtcNow;
            var combination = new IncludeCombination(IncludeType.Css, new[] { "foo.css" }, "#Foo{color:red;}", lastModifiedAt, new CssTypeElement());
            _mockHttpContext.Expect(hc => hc.Response).Return(_mockResponse);
            _mockHttpContext.Expect(hc => hc.Request).Return(_mockRequest);
            _mockRequest.Expect(r => r.Headers[HttpHeaders.AcceptEncoding]).Return("");
            _mockResponse.Expect(r => r.ContentEncoding = Encoding.UTF8);
            _mockResponse.Expect(r => r.ContentType = MimeTypes.TextCss);
            _mockResponse.Expect(r => r.AddHeader(HttpHeaders.ContentLength, "16"));
            _mockResponse.Expect(r => r.OutputStream).Return(new MemoryStream(8092)).Repeat.Twice();
            _mockResponse.Expect(r => r.Cache).Return(_mockCachePolicy);
            _mockCachePolicy.Expect(cp => cp.SetETag(Arg<string>.Matches(etag => etag.StartsWith("foo") && etag.EndsWith(combination.LastModifiedAt.Ticks.ToString()))));
            _stubCombiner.Expect(c => c.GetCombination("foo")).Return(combination);

            var cacheFor = TimeSpan.FromMinutes(30);
            _mockCachePolicy.Expect(cp => cp.SetCacheability(HttpCacheability.Public));
            _mockCachePolicy.Expect(cp => cp.SetExpires(Clock.UtcNow.Add(cacheFor)));
            _mockCachePolicy.Expect(cp => cp.SetMaxAge(cacheFor));
            _mockCachePolicy.Expect(cp => cp.SetValidUntilExpires(true));
            _mockCachePolicy.Expect(cp => cp.SetLastModified(lastModifiedAt));
            var stubSettings = _mocks.Stub<IIncludeHandlingSettings>();
            var stubCss = _mocks.Stub<IIncludeTypeSettings>();
            stubSettings.Replay();
            stubCss.Replay();
            stubSettings.Expect(s => s.Types[IncludeType.Css]).Return(stubCss);
            stubCss.Expect(s => s.CacheFor).Return(cacheFor);

            var result = new IncludeCombinationResult(_stubCombiner, "foo", lastModifiedAt, stubSettings);
            Assert.DoesNotThrow(() => result.ExecuteResult(_controllerContext));

            _mocks.VerifyAll();
        }
        public void WhenCombinationExists_ShouldCorrectlySetUpResponse()
        {
            _mockHttpContext.Expect(hc => hc.Response).Return(_mockResponse);
            _mockHttpContext.Expect(hc => hc.Request).Return(_mockRequest);
            _mockRequest.Expect(r => r.Headers[HttpHeaders.AcceptEncoding]).Return("");
            _mockResponse.Expect(r => r.ContentEncoding = Encoding.UTF8);
            _mockResponse.Expect(r => r.ContentType = MimeTypes.TextCss);
            _mockResponse.Expect(r => r.AddHeader(HttpHeaders.ContentLength, "16"));
            _mockResponse.Expect(r => r.OutputStream).Return(new MemoryStream(8092)).Repeat.Twice();
            _mockResponse.Expect(r => r.Cache).Return(_mockCachePolicy);
            _mockCachePolicy.Expect(cp => cp.SetETag(Arg<string>.Matches(etag => etag.StartsWith("foo") && etag.EndsWith(_cssCombination.LastModifiedAt.Ticks.ToString()))));
            _stubCombiner.Expect(c => c.GetCombination("foo")).Return(_cssCombination);

            var result = new IncludeCombinationResult(_stubCombiner, "foo", Clock.UtcNow);
            Assert.DoesNotThrow(() => result.ExecuteResult(_controllerContext));

            _mocks.VerifyAll();
        }
        public void WhenRequestAcceptsCompression_ShouldAppendContentEncodingHeader(string acceptEncoding, string expectedContentEncoding, string browser, int browserMajorVersion)
        {
            var lastModifiedAt = Clock.UtcNow;
            _mockHttpContext.Expect(hc => hc.Response).Return(_mockResponse);
            _mockHttpContext.Expect(hc => hc.Request).Return(_mockRequest);
            _mockRequest.Expect(r => r.Headers[HttpHeaders.AcceptEncoding]).Return(acceptEncoding);
            var stubBrowser = MockRepository.GenerateStub<HttpBrowserCapabilitiesBase>();
            stubBrowser.Expect(b => b.Type).Return(browser);
            stubBrowser.Expect(b => b.MajorVersion).Return(browserMajorVersion);
            stubBrowser.Replay();
            _mockRequest.Expect(r => r.Browser).Return(stubBrowser);
            _mockResponse.Expect(r => r.ContentEncoding = Encoding.UTF8);
            _mockResponse.Expect(r => r.ContentType = MimeTypes.TextCss);
            _mockResponse.Expect(r => r.AddHeader(Arg<string>.Is.Equal(HttpHeaders.ContentLength), Arg<string>.Is.NotNull));
            _mockResponse.Expect(r => r.OutputStream).Return(new MemoryStream(8092)).Repeat.Twice();
            _mockResponse.Expect(r => r.Cache).Return(_mockCachePolicy);
            if (expectedContentEncoding != null)
            {
                _mockResponse.Expect(r => r.AppendHeader(HttpHeaders.ContentEncoding, expectedContentEncoding));
            }
            _mockCachePolicy.Expect(cp => cp.SetETag(Arg<string>.Matches(etag => etag.StartsWith("foo") && etag.EndsWith(_cssCombination.LastModifiedAt.Ticks.ToString()))));
            var cacheFor = TimeSpan.FromMinutes(30);
            _mockCachePolicy.Expect(cp => cp.SetCacheability(HttpCacheability.Public));
            _mockCachePolicy.Expect(cp => cp.SetExpires(Clock.UtcNow.Add(cacheFor))).IgnoreArguments();
            _mockCachePolicy.Expect(cp => cp.SetMaxAge(cacheFor)).IgnoreArguments();
            _mockCachePolicy.Expect(cp => cp.SetValidUntilExpires(true));
            _mockCachePolicy.Expect(cp => cp.SetLastModified(lastModifiedAt)).IgnoreArguments();
            _stubCombiner.Expect(c => c.GetCombination("foo")).Return(_cssCombination);

            var stubSettings = _mocks.Stub<IIncludeHandlingSettings>();
            stubSettings.Expect(x => x.Types[IncludeType.Css]).Return(new CssTypeElement());
            stubSettings.Replay();
            var result = new IncludeCombinationResult(_stubCombiner, "foo", Clock.UtcNow, stubSettings);
            Assert.DoesNotThrow(() => result.ExecuteResult(_controllerContext));

            _mocks.VerifyAll();
        }
        public void WhenNoCombinationExists_ResponseCodeShouldBe404()
        {
            _mockHttpContext.Expect(hc => hc.Response).Return(_mockResponse);
            _mockResponse.Expect(r => r.ContentEncoding = Encoding.UTF8);
            _mockResponse.Expect(r => r.StatusCode = (int) HttpStatusCode.NotFound);
            _stubCombiner.Expect(c => c.GetCombination("foo")).Return(null);

            var result = new IncludeCombinationResult(_stubCombiner, "foo", Clock.UtcNow);
            Assert.DoesNotThrow(() => result.ExecuteResult(_controllerContext));

            _mocks.VerifyAll();
        }