예제 #1
0
        public void GivenProcessedExternalScriptBundleWithFallbackCondition_WhenRender_ThenExternalRendererUsed()
        {
            var urlGenerator = new Mock<IUrlGenerator>();
            urlGenerator
                .Setup(g => g.CreateBundleUrl(It.IsAny<Bundle>()))
                .Returns("/");

            var bundle = new ExternalScriptBundle(Url, "~/test", "condition")
            {
                Renderer = new ScriptBundleHtmlRenderer(urlGenerator.Object),
                Pipeline = Mock.Of<IBundlePipeline<ScriptBundle>>()
            };
            var asset = new Mock<IAsset>();
            asset.SetupGet(a => a.Path).Returns("~/test/asset.js");
            asset.Setup(a => a.OpenStream()).Returns(Stream.Null);
            bundle.Assets.Add(asset.Object);
            var settings = new CassetteSettings();
            bundle.Process(settings);

            var html = bundle.Render();

            html.ShouldEqual(@"<script src=""http://test.com/asset.js"" type=""text/javascript""></script>
            <script type=""text/javascript"">
            if(condition){
            document.write('<script src=""/"" type=""text/javascript""><\/script>');
            }
            </script>");
        }
예제 #2
0
        public void GivenCacheIsUpToDate_WhenInitializeBundlesFromCacheIfUpToDate_ThenBundleAssetsReplacedWithCachedAsset()
        {
            using (var cacheDir = new TempDirectory())
            {
                File.WriteAllText(
                    Path.Combine(cacheDir, "container.xml"),
                    "<?xml version=\"1.0\"?><Container Version=\"VERSION\" AssetCount=\"1\"><Bundle Path=\"~/test\" Hash=\"01\"/></Container>"
                    );
                File.WriteAllText(
                    Path.Combine(cacheDir, "test.bundle"),
                    "asset"
                    );
                var bundleWithAsset = new TestableBundle("~/test");
                var asset           = StubAsset();
                bundleWithAsset.Assets.Add(asset.Object);
                var sourceBundles = new[] { bundleWithAsset };

                var settings = new CassetteSettings
                {
                    SourceDirectory = Mock.Of <IDirectory>(),
                    CacheDirectory  = new FileSystemDirectory(cacheDir)
                };
                var cache  = new BundleCache("VERSION", settings);
                var result = cache.InitializeBundlesFromCacheIfUpToDate(sourceBundles);

                result.ShouldBeTrue();
                bundleWithAsset.Assets[0].OpenStream().ReadToEnd().ShouldEqual("asset");
            }
        }
 public DiagnosticRequestHandler(BundleCollection bundles, CassetteSettings settings, IUrlGenerator urlGenerator, IBundleCacheRebuilder bundleCacheRebuilder)
 {
   this.bundles = bundles;
   this.settings = settings;
   this.urlGenerator = urlGenerator;
   this.bundleCacheRebuilder = bundleCacheRebuilder;
 }
예제 #4
0
        public void GivenProcessedExternalScriptBundleWithFallbackCondition_WhenRender_ThenExternalRendererUsed()
        {
            var urlGenerator = new Mock <IUrlGenerator>();

            urlGenerator
            .Setup(g => g.CreateBundleUrl(It.IsAny <Bundle>()))
            .Returns("/");

            var bundle = new ExternalScriptBundle(Url, "~/test", "condition")
            {
                Renderer = new ScriptBundleHtmlRenderer(urlGenerator.Object),
                Pipeline = Mock.Of <IBundlePipeline <ScriptBundle> >()
            };
            var asset = new Mock <IAsset>();

            asset.SetupGet(a => a.Path).Returns("~/test/asset.js");
            asset.Setup(a => a.OpenStream()).Returns(Stream.Null);
            bundle.Assets.Add(asset.Object);
            var settings = new CassetteSettings();

            bundle.Process(settings);

            var html = bundle.Render();

            html.ShouldEqual(@"<script src=""http://test.com/asset.js"" type=""text/javascript""></script>
<script type=""text/javascript"">
if(condition){
document.write('<script src=""/"" type=""text/javascript""><\/script>');
}
</script>");
        }
예제 #5
0
 protected override void ProcessCore(CassetteSettings settings)
 {
     base.ProcessCore(settings);
     fallbackRenderer   = Renderer;
     isDebuggingEnabled = settings.IsDebuggingEnabled;
     Renderer           = this;
 }
예제 #6
0
 public void Process(Bundle bundle, CassetteSettings settings)
 {
     foreach (var asset in bundle.Assets)
     {
         asset.AddAssetTransformer(minifier);
     }
 }
예제 #7
0
        static CassetteApplication CreateCassetteApplication()
        {
            lock (CreationLock)
            {
                var allConfigurations = GetAllConfigurations(GetCassetteConfigurationSection());
                var cacheVersion      = GetConfigurationVersion(allConfigurations, HttpRuntime.AppDomainAppVirtualPath);
                var settings          = new CassetteSettings(cacheVersion);
                var bundles           = new BundleCollection(settings);

                foreach (var configuration in allConfigurations)
                {
                    Trace.Source.TraceInformation("Executing configuration {0}",
                                                  configuration.GetType().AssemblyQualifiedName);
                    configuration.Configure(bundles, settings);
                }

                var routing = new CassetteRouting(settings.UrlModifier, () => ((CassetteApplication)CassetteApplicationContainer.Instance.Application).BundleContainer);
                settings.UrlGenerator = routing;

                Trace.Source.TraceInformation("Creating Cassette application object");
                Trace.Source.TraceInformation("IsDebuggingEnabled: {0}", settings.IsDebuggingEnabled);
                Trace.Source.TraceInformation("Cache version: {0}", cacheVersion);

                var application = new CassetteApplication(
                    bundles,
                    settings,
                    routing,
                    GetCurrentHttpContext
                    );

                application.InstallRoutes(RouteTable.Routes);

                return(application);
            }
        }
 public JavaScriptHtmlTemplatePipeline(TinyIoCContainer container, CassetteSettings settings)
     : base(container)
 {
     this.container = container;
     this.settings  = settings;
     BuildPipeline();
 }
예제 #9
0
 public DiagnosticRequestHandler(BundleCollection bundles, CassetteSettings settings, IUrlGenerator urlGenerator, IBundleCacheRebuilder bundleCacheRebuilder)
 {
     this.bundles              = bundles;
     this.settings             = settings;
     this.urlGenerator         = urlGenerator;
     this.bundleCacheRebuilder = bundleCacheRebuilder;
 }
예제 #10
0
        public void GivenAssetWithReferenceToAssetInSameBundle_WhenSaveContainer_ThenXmlHasNoReferenceElements()
        {
            using (var cacheDir = new TempDirectory())
            {
                var settings = new CassetteSettings
                {
                    SourceDirectory = Mock.Of <IDirectory>(),
                    CacheDirectory  = new FileSystemDirectory(cacheDir)
                };
                var cache     = new BundleCache("VERSION", settings);
                var bundle    = new TestableBundle("~/bundle-1");
                var asset1    = StubAsset("~/bundle-1/asset1.js");
                var asset2    = StubAsset("~/bundle-1/asset2.js");
                var reference = new AssetReference("~/bundle-1/asset2.js", asset1.Object, -1, AssetReferenceType.SameBundle);
                asset1.SetupGet(a => a.References)
                .Returns(new[] { reference });
                bundle.Assets.Add(new ConcatenatedAsset(new[]
                {
                    asset1.Object,
                    asset2.Object
                }));

                cache.SaveBundleContainer(new BundleContainer(new[] { bundle }));

                var xml = File.ReadAllText(Path.Combine(cacheDir, "container.xml"));
                xml.ShouldNotContain("<Reference ");
            }
        }
예제 #11
0
        public void GivenCacheMissingSecondFile_WhenInitializeBundlesFromCacheIfUpToDate_ThenFirstBundleAssetsAreNotModified()
        {
            using (var cacheDir = new TempDirectory())
            {
                File.WriteAllText(
                    Path.Combine(cacheDir, "container.xml"),
                    "<?xml version=\"1.0\"?><Container Version=\"VERSION\" AssetCount=\"2\"><Bundle Path=\"~/test1\" Hash=\"01\"/><Bundle Path=\"~/test2\" Hash=\"01\"/></Container>"
                    );
                File.WriteAllText(
                    Path.Combine(cacheDir, "test1.bundle"),
                    "asset"
                    );
                var bundle1 = new TestableBundle("~/test1");
                var bundle2 = new TestableBundle("~/test2");
                var asset1  = StubAsset();
                bundle1.Assets.Add(asset1.Object);
                var asset2 = StubAsset();
                bundle2.Assets.Add(asset2.Object);
                var sourceBundles = new[] { bundle1, bundle2 };

                var settings = new CassetteSettings
                {
                    SourceDirectory = Mock.Of <IDirectory>(),
                    CacheDirectory  = new FileSystemDirectory(cacheDir)
                };
                var cache  = new BundleCache("VERSION", settings);
                var result = cache.InitializeBundlesFromCacheIfUpToDate(sourceBundles);

                result.ShouldBeFalse();
                bundle1.Assets[0].ShouldNotBeType <CachedAsset>();
            }
        }
예제 #12
0
        public void Configure(BundleCollection bundles, CassetteSettings settings)
        {
            // TODO: Configure your bundles here...
            // Please read http://getcassette.net/documentation/configuration

            // This default configuration treats each file as a separate 'bundle'.
            // In production the content will be minified, but the files are not combined.
            // So you probably want to tweak these defaults!
            bundles.AddPerIndividualFile <StylesheetBundle>("Content");
            //bundles.AddPerIndividualFile<ScriptBundle>("Scripts", null, x =>
            //    {
            //        //x.Processor = new CommonJSScriptPipeline();
            //    });
            bundles.Add <ScriptBundle>("Scripts/internal", b => b.Processor = new ScriptPipeline().InsertBefore <SortAssetsByDependency>(new StitchProcessor()));

            settings.IsDebuggingEnabled = true;
            //settings.UrlModifier = new FileExtensionUrlModifier();

            // To combine files, try something like this instead:
            //   bundles.Add<StylesheetBundle>("Content");
            // In production mode, all of ~/Content will be combined into a single bundle.

            // If you want a bundle per folder, try this:
            //   bundles.AddPerSubDirectory<ScriptBundle>("Scripts");
            // Each immediate sub-directory of ~/Scripts will be combined into its own bundle.
            // This is useful when there are lots of scripts for different areas of the website.

            // *** TOP TIP: Delete all ".min.js" files now ***
            // Cassette minifies scripts for you. So those files are never used.
        }
예제 #13
0
        public void GivenContainerCacheHasFileReferenceThatIsModifiedSinceCacheWrite_WhenInitializeBundlesFromCacheIfUpToDate_ThenReturnFalse()
        {
            using (var cacheDir = new TempDirectory())
                using (var sourceDir = new TempDirectory())
                {
                    File.WriteAllText(
                        Path.Combine(cacheDir, "container.xml"),
                        "<?xml version=\"1.0\"?><Container Version=\"VERSION\" AssetCount=\"0\">" +
                        "<Bundle Path=\"~/test\" Hash=\"01\">" +
                        "  <File Path=\"~/file.png\"/>" +
                        "</Bundle>" +
                        "</Container>"
                        );
                    Thread.Sleep(10); // Brief pause, otherwise the file write times are the same.
                    File.WriteAllText(Path.Combine(sourceDir, "file.png"), "");
                    var bundle        = new TestableBundle("~/test");
                    var sourceBundles = new[] { bundle };

                    var settings = new CassetteSettings("")
                    {
                        SourceDirectory = new FileSystemDirectory(sourceDir),
                        CacheDirectory  = new FileSystemDirectory(cacheDir)
                    };
                    var cache  = new BundleCache("VERSION", settings);
                    var result = cache.InitializeBundlesFromCacheIfUpToDate(sourceBundles);

                    result.ShouldBeFalse();
                }
        }
예제 #14
0
 public void Process(StylesheetBundle bundle, CassetteSettings settings)
 {
     foreach (var asset in bundle.Assets)
     {
         asset.AddAssetTransformer(new ExpandCssUrlsAssetTransformer(settings.SourceDirectory, settings.UrlGenerator));
     }
 }
        public Bundles_FileUrl_Tests()
        {
            urlGenerator = new Mock<IUrlGenerator>();
            fileSystem = new FakeFileSystem
            {
                { "~/test.png", new byte[] { 1, 2, 3 } }
            };

            using (var sha1 = SHA1.Create())
            {
                hashOfFileContent = sha1.ComputeHash(new byte[] { 1, 2, 3 }).ToHexString();
            }

            var settings = new CassetteSettings
            {
                SourceDirectory = fileSystem
            };

            fileAccessAuthorization = new Mock<IFileAccessAuthorization>();
            fileAccessAuthorization.Setup(a => a.CanAccess("~/test.png")).Returns(true);

            var referenceBuilder = new Mock<IReferenceBuilder>();
            var bundles = new BundleCollection(settings, Mock.Of<IFileSearchProvider>(), Mock.Of<IBundleFactoryProvider>());
            var bundleCacheRebuilder = new Mock<IBundleCacheRebuilder>();
            Bundles.Helper = new BundlesHelper(bundles, settings, urlGenerator.Object, () => referenceBuilder.Object, fileAccessAuthorization.Object, bundleCacheRebuilder.Object, new SimpleJsonSerializer());
        }
예제 #16
0
        public StylesheetPipeline_Process_TestBase()
        {
            settings = new CassetteSettings();
            bundle = new StylesheetBundle("~");
            asset1 = new Mock<IAsset>();
            asset2 = new Mock<IAsset>();
            bundle.Assets.Add(asset1.Object);
            bundle.Assets.Add(asset2.Object);

            asset1.SetupGet(a => a.Path)
                  .Returns("~/asset1.css");
            asset1.Setup(a => a.OpenStream())
                  .Returns(() => "/* @reference \"asset2.css\"; */".AsStream());
            asset2.SetupGet(a => a.Path)
                  .Returns("~/asset2.css");
            asset2.Setup(a => a.OpenStream())
                  .Returns(() => "p { color: White; }".AsStream());
            asset1.SetupGet(a => a.References)
                  .Returns(new[] { new AssetReference(asset1.Object.Path, "~/asset2.css", -1, AssetReferenceType.SameBundle) });

            minifier = new MicrosoftStylesheetMinifier();
            urlGenerator = new Mock<IUrlGenerator>();
            container = new TinyIoCContainer();
            container.Register(minifier);
            container.Register(urlGenerator.Object);
            container.Register(settings);
        }
예제 #17
0
        public void Configure(BundleCollection bundles, CassetteSettings settings)
        {
            // The "Scripts/app" contains the application script we'll be testing with Jasmine.
            // The "Scripts/specs" contains the Jasmine specs. It is treated just like a regular Cassette bundle.

            bundles.AddPerSubDirectory <ScriptBundle>("Scripts");
        }
예제 #18
0
        internal CassetteApplication StubApplication(Action <CassetteSettings> alterSettings = null, Func <CassetteSettings, BundleCollection> createBundles = null)
        {
            var settings = new CassetteSettings
            {
                CacheDirectory  = new FileSystemDirectory(cacheDir),
                SourceDirectory = new FileSystemDirectory(sourceDir)
            };

            if (alterSettings != null)
            {
                alterSettings(settings);
            }

            var bundles = createBundles == null
                ? new BundleCollection(settings)
                : createBundles(settings);

            return(new CassetteApplication(
                       bundles,
                       settings,
                       new CassetteRouting(new VirtualDirectoryPrepender("/")),
                       () => httpContext.Object,
                       ""
                       ));
        }
예제 #19
0
        public void GivenContainerFileIsOlderThanAnAssetFile_WhenInitializeBundlesFromCacheIfUpToDate_ThenReturnFalse()
        {
            using (var cacheDir = new TempDirectory())
            {
                File.WriteAllText(
                    Path.Combine(cacheDir, "container.xml"),
                    "<?xml version=\"1.0\"?><Container Version=\"VERSION\" AssetCount=\"0\"></Container>"
                    );

                var bundleWithAsset = new TestableBundle("~/test");
                var asset           = StubAsset();
                asset.Setup(a => a.SourceFile.LastWriteTimeUtc).Returns(DateTime.UtcNow);
                bundleWithAsset.Assets.Add(asset.Object);
                var sourceBundles = new[] { bundleWithAsset };

                var settings = new CassetteSettings
                {
                    SourceDirectory = Mock.Of <IDirectory>(),
                    CacheDirectory  = new FileSystemDirectory(cacheDir)
                };
                var cache  = new BundleCache("VERSION", settings);
                var result = cache.InitializeBundlesFromCacheIfUpToDate(sourceBundles);

                result.ShouldBeFalse();
            }
        }
예제 #20
0
        public void GivenContainerCacheHasBundleReferences_WhenInitializeBundlesFromCacheIfUpToDate_ThenBundleReferencesAreSet()
        {
            using (var cacheDir = new TempDirectory())
            {
                File.WriteAllText(
                    Path.Combine(cacheDir, "container.xml"),
                    "<?xml version=\"1.0\"?><Container Version=\"VERSION\" AssetCount=\"0\">" +
                    "<Bundle Path=\"~/test1\" Hash=\"01\">" +
                    "  <Reference Path=\"~/test2\"/>" +
                    "</Bundle>" +
                    "<Bundle Path=\"~/test2\" Hash=\"01\"/>" +
                    "</Container>"
                    );
                var bundle1       = new TestableBundle("~/test1");
                var bundle2       = new TestableBundle("~/test2");
                var sourceBundles = new[] { bundle1, bundle2 };

                var settings = new CassetteSettings
                {
                    SourceDirectory = Mock.Of <IDirectory>(),
                    CacheDirectory  = new FileSystemDirectory(cacheDir)
                };
                var cache = new BundleCache("VERSION", settings);
                cache.InitializeBundlesFromCacheIfUpToDate(sourceBundles);

                bundle1.References.First().ShouldEqual("~/test2");
            }
        }
예제 #21
0
        public void GivenContainerCacheHasFileReferenceToMissingFile_WhenInitializeBundlesFromCacheIfUpToDate_ThenReturnFalse()
        {
            using (var cacheDir = new TempDirectory())
                using (var sourceDir = new TempDirectory())
                {
                    File.WriteAllText(
                        Path.Combine(cacheDir, "container.xml"),
                        "<?xml version=\"1.0\"?><Container Version=\"VERSION\" AssetCount=\"0\">" +
                        "<Bundle Path=\"~/test\" Hash=\"01\">" +
                        "  <File Path=\"~/file.png\"/>" +
                        "</Bundle>" +
                        "</Container>"
                        );
                    var bundle        = new TestableBundle("~/test");
                    var sourceBundles = new[] { bundle };


                    var settings = new CassetteSettings
                    {
                        SourceDirectory = new FileSystemDirectory(sourceDir),
                        CacheDirectory  = new FileSystemDirectory(cacheDir)
                    };
                    var cache  = new BundleCache("VERSION", settings);
                    var result = cache.InitializeBundlesFromCacheIfUpToDate(sourceBundles);

                    result.ShouldBeFalse();
                }
        }
        public Bundles_FileUrl_Tests()
        {
            urlGenerator = new Mock <IUrlGenerator>();
            fileSystem   = new FakeFileSystem
            {
                { "~/test.png", new byte[] { 1, 2, 3 } }
            };

            using (var sha1 = SHA1.Create())
            {
                hashOfFileContent = sha1.ComputeHash(new byte[] { 1, 2, 3 }).ToHexString();
            }

            var settings = new CassetteSettings
            {
                SourceDirectory = fileSystem
            };

            fileAccessAuthorization = new Mock <IFileAccessAuthorization>();
            fileAccessAuthorization.Setup(a => a.CanAccess("~/test.png")).Returns(true);

            var referenceBuilder     = new Mock <IReferenceBuilder>();
            var bundles              = new BundleCollection(settings, Mock.Of <IFileSearchProvider>(), Mock.Of <IBundleFactoryProvider>());
            var bundleCacheRebuilder = new Mock <IBundleCacheRebuilder>();

            Bundles.Helper = new BundlesHelper(bundles, settings, urlGenerator.Object, () => referenceBuilder.Object, fileAccessAuthorization.Object, bundleCacheRebuilder.Object, new SimpleJsonSerializer());
        }
예제 #23
0
        CassetteApplication CreateApplication(Action <BundleCollection> configure, string sourceDirectory = "assets", bool isDebuggingEnabled = false)
        {
            var container = new Mock <ICassetteApplicationContainer <ICassetteApplication> >();
            var settings  = new CassetteSettings("")
            {
                CacheDirectory     = new IsolatedStorageDirectory(storage),
                SourceDirectory    = new FileSystemDirectory(Path.GetFullPath(sourceDirectory)),
                UrlGenerator       = new UrlGenerator(new VirtualDirectoryPrepender("/"), "_cassette"),
                IsDebuggingEnabled = isDebuggingEnabled
            };
            var bundles = new BundleCollection(settings);

            configure(bundles);
            foreach (var bundle in bundles)
            {
                bundle.Process(settings);
            }
            var bundleContainer = new BundleContainer(bundles);
            var application     = new CassetteApplication(
                bundleContainer,
                settings,
                () => httpContext.Object
                );

            container.Setup(c => c.Application).Returns(() => application);
            new RouteInstaller(container.Object, "_cassette").InstallRoutes(routes);
            return(application);
        }
        public void Configure(BundleCollection bundles, CassetteSettings settings)
        {
            // TODO: Configure your bundles here...
            // Please read http://getcassette.net/documentation/configuration

            // This default configuration treats each file as a separate 'bundle'.
            // In production the content will be minified, but the files are not combined.
            // So you probably want to tweak these defaults!
            bundles.AddPerIndividualFile<StylesheetBundle>("Content");
            //bundles.AddPerIndividualFile<ScriptBundle>("Scripts", null, x =>
            //    {
            //        //x.Processor = new CommonJSScriptPipeline();
            //    });
            bundles.Add<ScriptBundle>("Scripts/internal", b => b.Processor = new ScriptPipeline().InsertBefore<SortAssetsByDependency>(new StitchProcessor()));

            settings.IsDebuggingEnabled = true;
            //settings.UrlModifier = new FileExtensionUrlModifier();

            // To combine files, try something like this instead:
            //   bundles.Add<StylesheetBundle>("Content");
            // In production mode, all of ~/Content will be combined into a single bundle.

            // If you want a bundle per folder, try this:
            //   bundles.AddPerSubDirectory<ScriptBundle>("Scripts");
            // Each immediate sub-directory of ~/Scripts will be combined into its own bundle.
            // This is useful when there are lots of scripts for different areas of the website.

            // *** TOP TIP: Delete all ".min.js" files now ***
            // Cassette minifies scripts for you. So those files are never used.
        }
예제 #25
0
        public void GivenCacheIsUpToDate_WhenInitializeBundlesFromCacheIfUpToDate_ThenReturnTrue()
        {
            using (var cacheDir = new TempDirectory())
            {
                File.WriteAllText(
                    Path.Combine(cacheDir, "container.xml"),
                    "<?xml version=\"1.0\"?><Container Version=\"VERSION\" AssetCount=\"0\"><Bundle Path=\"~/test\" Hash=\"01\"/></Container>"
                    );
                File.WriteAllText(
                    Path.Combine(cacheDir, "test.bundle"),
                    "asset"
                    );

                var bundle        = new TestableBundle("~/test");
                var sourceBundles = new[] { bundle };

                var settings = new CassetteSettings
                {
                    SourceDirectory = Mock.Of <IDirectory>(),
                    CacheDirectory  = new FileSystemDirectory(cacheDir)
                };
                var cache  = new BundleCache("VERSION", settings);
                var result = cache.InitializeBundlesFromCacheIfUpToDate(sourceBundles);

                result.ShouldBeTrue();
            }
        }
예제 #26
0
 public ExternalStylesheetHtmlRenderer_Tests()
 {
     settings         = new CassetteSettings();
     fallbackRenderer = new Mock <IBundleHtmlRenderer <StylesheetBundle> >();
     renderer         = new ExternalStylesheetHtmlRenderer(fallbackRenderer.Object, settings);
     bundle           = new ExternalStylesheetBundle("http://test.com/");
 }
 protected override Bundle CreateBundleCore(CassetteSettings settings)
 {
     return(new ExternalScriptBundle(Url, Path, FallbackCondition)
     {
         Renderer = new ConstantHtmlRenderer <ScriptBundle>(Html(), settings.UrlModifier)
     });
 }
예제 #28
0
 internal override void Process(CassetteSettings settings)
 {
     // Any fallback assets are processed like a regular ScriptBundle.
     base.Process(settings);
     // We just need a special renderer instead.
     externalRenderer = new ExternalScriptBundleHtmlRenderer(Renderer, settings);
 }
예제 #29
0
        public void GivenAssetWithTwoReferencesToAssetsInAnotherBundle_WhenSaveContainer_ThenXmlHasOneReferenceElementWithReferencedBundlePath()
        {
            using (var cacheDir = new TempDirectory())
            {
                var settings = new CassetteSettings
                {
                    SourceDirectory = Mock.Of <IDirectory>(),
                    CacheDirectory  = new FileSystemDirectory(cacheDir)
                };
                var cache      = new BundleCache("VERSION", settings);
                var bundle1    = new TestableBundle("~/bundle-1");
                var bundle2    = new TestableBundle("~/bundle-2");
                var asset1     = StubAsset();
                var reference1 = new AssetReference("~/bundle-2/asset2.js", asset1.Object, -1, AssetReferenceType.DifferentBundle);
                var reference2 = new AssetReference("~/bundle-2/asset3.js", asset1.Object, -1, AssetReferenceType.DifferentBundle);
                asset1.SetupGet(a => a.References)
                .Returns(new[] { reference1, reference2 });
                bundle1.Assets.Add(asset1.Object);

                bundle2.Assets.Add(
                    new ConcatenatedAsset(new[]
                {
                    StubAsset("~/bundle-2/asset2.js").Object,
                    StubAsset("~/bundle-2/asset3.js").Object
                })
                    );

                cache.SaveBundleContainer(new BundleContainer(new[] { bundle1, bundle2 }));

                var xml = File.ReadAllText(Path.Combine(cacheDir, "container.xml"));
                Regex.Matches(xml, Regex.Escape("<Reference Path=\"~/bundle-2\" />")).Count.ShouldEqual(1);
            }
        }
예제 #30
0
        protected BundleRequestHandler_Tests()
        {
            httpContext    = new Mock <HttpContextBase>();
            request        = new Mock <HttpRequestBase>();
            requestHeaders = new NameValueCollection();
            response       = new Mock <HttpResponseBase>();
            responseCache  = new Mock <HttpCachePolicyBase>();
            routeData      = new RouteData();
            requestContext = new RequestContext(httpContext.Object, routeData);
            outputStream   = new MemoryStream();

            httpContext.SetupGet(c => c.Request).Returns(request.Object);
            httpContext.SetupGet(c => c.Response).Returns(response.Object);
            httpContext.SetupGet(c => c.Items).Returns(new Dictionary <string, object>());

            response.SetupGet(r => r.OutputStream).Returns(outputStream);
            response.SetupGet(r => r.Cache).Returns(responseCache.Object);

            request.SetupGet(r => r.Headers).Returns(requestHeaders);
            request.SetupGet(x => x.RawUrl).Returns("~/010203/test");

            var settings = new CassetteSettings();

            bundles = new BundleCollection(settings, Mock.Of <IFileSearchProvider>(), Mock.Of <IBundleFactoryProvider>());
        }
예제 #31
0
 public BundleCommonJs(ICommonJsWriter writer, CassetteSettings cassetteSettings, ConcatenateAssets concatenateAssets, ISourceMapRewriter sourceMapRewriter)
 {
     _writer            = writer;
     _cassetteSettings  = cassetteSettings;
     _concatenateAssets = concatenateAssets;
     _sourceMapRewriter = sourceMapRewriter;
 }
 public void Process(HtmlTemplateBundle bundle, CassetteSettings settings)
 {
     foreach (var asset in bundle.Assets)
     {
         asset.AddAssetTransformer(new WrapHtmlTemplateInScriptElement(bundle));
     }
 }
예제 #33
0
 public ExternalScriptBundleHtmlRenderer_Tests()
 {
     settings = new CassetteSettings
     {
         IsDebuggingEnabled = false
     };
 }
예제 #34
0
        public void GivenCachedFileThrowsWhenDeleted_WhenSaveContainer_ThenSecondCachedFileIsStillDeleted()
        {
            var firstFile = new Mock <IFile>();

            firstFile.Setup(f => f.Delete()).Throws <IOException>();
            var secondFile     = new Mock <IFile>();
            var cacheDirectory = new Mock <IDirectory>();

            cacheDirectory.Setup(d => d.GetFiles("*", SearchOption.AllDirectories))
            .Returns(new[] { firstFile.Object, secondFile.Object });
            var containerFile = new Mock <IFile>();

            cacheDirectory.Setup(d => d.GetFile("container.xml"))
            .Returns(containerFile.Object);
            containerFile.Setup(f => f.Open(It.IsAny <FileMode>(), It.IsAny <FileAccess>(), It.IsAny <FileShare>()))
            .Returns(Stream.Null);

            var settings = new CassetteSettings
            {
                SourceDirectory = Mock.Of <IDirectory>(),
                CacheDirectory  = cacheDirectory.Object
            };

            var cache = new BundleCache("VERSION", settings);

            cache.SaveBundleContainer(new BundleContainer(Enumerable.Empty <Bundle>()));

            secondFile.Verify(f => f.Delete());
        }
예제 #35
0
        public void Configure(BundleCollection bundles, CassetteSettings settings)
        {
            // TODO: Configure your bundles here...
            // Please read http://getcassette.net/documentation/configuration

            // This default configuration treats each file as a separate 'bundle'.
            // In production the content will be minified, but the files are not combined.
            // So you probably want to tweak these defaults!

            // CSS
            bundles.Add <StylesheetBundle>("Content/Lib/Unsemantic/assets/stylesheets/unsemantic-grid-responsive.css");
            bundles.Add <StylesheetBundle>("Styles");

            // Scripts
            bundles.Add <ScriptBundle>("Content/Lib/Unsemantic/assets/javascripts");
            bundles.Add <ScriptBundle>("Scripts");

            // To combine files, try something like this instead:
            //   bundles.Add<StylesheetBundle>("Content");
            // In production mode, all of ~/Content will be combined into a single bundle.

            // If you want a bundle per folder, try this:
            //   bundles.AddPerSubDirectory<ScriptBundle>("Scripts");
            // Each immediate sub-directory of ~/Scripts will be combined into its own bundle.
            // This is useful when there are lots of scripts for different areas of the website.

            // *** TOP TIP: Delete all ".min.js" files now ***
            // Cassette minifies scripts for you. So those files are never used.
        }
예제 #36
0
        void AssetRewrite(string from, string to)
        {
            var context = new Mock<HttpContextBase>();
            var request = new Mock<HttpRequestBase>();
            var cache = new Mock<HttpCachePolicyBase>();
            var cassetteSettings = new CassetteSettings();
            var requestHeaders = new NameValueCollection();
            context.SetupGet(c => c.Request).Returns(request.Object);
            context.Setup(c => c.Response.Cache).Returns(cache.Object);
            var auth = new Mock<IFileAccessAuthorization>();
            auth.Setup(a => a.CanAccess(It.IsAny<string>())).Returns(true);
            var hasher = new Mock<IFileContentHasher>();
            hasher.Setup(h => h.Hash(It.IsAny<string>())).Returns(new byte[] { 1 });
            request
                .SetupGet(r => r.AppRelativeCurrentExecutionFilePath)
                .Returns("~/cassette.axd");
            request
                .SetupGet(r => r.PathInfo)
                .Returns(from);
            request
                .SetupGet(r => r.Headers)
                .Returns(requestHeaders);

            var rewriter = new RawFileRequestRewriter(context.Object, auth.Object, hasher.Object, cassetteSettings, usingIntegratedPipeline: true);
            rewriter.Rewrite();

            context.Verify(c => c.RewritePath(to));
        }
 public RawFileRequestRewriter(BundleCollection bundles, IRootPathProvider rootPathProvider, IFileContentHasher fileContentHasher, CassetteSettings settings)
 {
   this.bundles = bundles;
   this.rootPathProvider = rootPathProvider;
   this.logger = NLog.LogManager.GetCurrentClassLogger();
   this.fileContentHasher = fileContentHasher;
   this.settings = settings;
 }
 public void UseIsolatedStorageWhenCachedDirectoryNotConfigured()
 {
     var section = new CassetteConfigurationSection();
     var configuration = new TestableWebHostSettingsConfiguration("/", section);
     var settings = new CassetteSettings();
     configuration.Configure(settings);
     settings.CacheDirectory.ShouldBeType<IsolatedStorageDirectory>();
 }
예제 #39
0
 internal BundleRequestHandler<TestableBundle> CreateRequestHandler(CassetteSettings settings = null)
 {
     return new BundleRequestHandler<TestableBundle>(
         settings ?? new CassetteSettings(),
         bundles,
         requestContext
     );
 }
 public ExternalScriptBundleRender_Tests()
 {
     settings = new CassetteSettings()
     {
         IsDebuggingEnabled = false
     };
     fallbackRenderer = new Mock<IBundleHtmlRenderer<ScriptBundle>>();
 }
 public RuntimeBundleCollectionInitializer(
     CassetteSettings settings,
     CacheAwareBundleCollectionInitializer cacheAwareBundleCollectionInitializer,
     BundleCollectionInitializer bundleCollectionInitializer)
 {
     this.settings = settings;
     this.cacheAwareBundleCollectionInitializer = cacheAwareBundleCollectionInitializer;
     this.bundleCollectionInitializer = bundleCollectionInitializer;
 }
 public ExternalStylesheetBundleRender_Tests()
 {
     settings = new CassetteSettings();
     fallbackRenderer = new Mock<IBundleHtmlRenderer<StylesheetBundle>>();
     bundle = new ExternalStylesheetBundle("http://test.com/")
     {
         Pipeline = Mock.Of<IBundlePipeline<StylesheetBundle>>()
     };
 }
예제 #43
0
 public BundlesHelper_Tests()
 {
     settings = new CassetteSettings();
     bundles = new BundleCollection(settings, Mock.Of<IFileSearchProvider>(), Mock.Of<IBundleFactoryProvider>(), Mock.Of<IBundleCollectionInitializer>());
     referenceBuilder = new Mock<IReferenceBuilder>();
     var urlModifier = new VirtualDirectoryPrepender("/");
     var urlGenerator = new UrlGenerator(urlModifier, new FakeFileSystem(), "cassette.axd/");
     helper = new BundlesHelper(bundles, settings, urlGenerator, () => referenceBuilder.Object, Mock.Of<IFileAccessAuthorization>(), Mock.Of<IBundleCacheRebuilder>(), new SimpleJsonSerializer());
 }
예제 #44
0
        public void GivenProductionMode_WhenProcess_ThenBundleRenderIsStylesheetHtmlRenderer()
        {
            var settings = new CassetteSettings { IsDebuggingEnabled = false };
            var processor = new AssignStylesheetRenderer(Mock.Of<IUrlGenerator>(), settings);
            var bundle = new StylesheetBundle("~/test");

            processor.Process(bundle);

            bundle.Renderer.ShouldBeType<StylesheetHtmlRenderer>();
        }
예제 #45
0
 public Bundles_Test()
 {
     urlGenerator = new Mock<IUrlGenerator>();
     referenceBuilder = new Mock<IReferenceBuilder>();
     settings = new CassetteSettings();
     bundles = new BundleCollection(settings, Mock.Of<IFileSearchProvider>(), Mock.Of<IBundleFactoryProvider>(), Mock.Of<IBundleCollectionInitializer>());
     fileAccessAuthorization = new Mock<IFileAccessAuthorization>();
     bundleCacheRebuilder = new Mock<IBundleCacheRebuilder>();
     Bundles.Helper = new BundlesHelper(bundles, settings, urlGenerator.Object, () => referenceBuilder.Object, fileAccessAuthorization.Object, bundleCacheRebuilder.Object, new SimpleJsonSerializer());
 }
예제 #46
0
        public JasmineBundleConfiguration_WhenConfigure()
        {
            var scriptBundleFactory = new ScriptBundleFactory(() => Mock.Of<IBundlePipeline<ScriptBundle>>());
            var stylesheetBundleFactory = new StylesheetBundleFactory(() => Mock.Of<IBundlePipeline<StylesheetBundle>>());
            var configuration = new JasmineBundleConfiguration(scriptBundleFactory, stylesheetBundleFactory);
            var settings = new CassetteSettings();
            bundles = new BundleCollection(settings, Mock.Of<IFileSearchProvider>(), Mock.Of<IBundleFactoryProvider>());

            configuration.Configure(bundles);
        }
예제 #47
0
 protected void SetupTestBundle(CassetteSettings settings = null)
 {
     var bundle = new TestableBundle("~/test");
     var asset = new StubAsset("~/asset.js", "asset-content");
     bundle.Assets.Add(asset);
     bundle.Hash = new byte[] { 1, 2, 3 };
     bundles.Add(bundle);
     bundles.BuildReferences();
     bundle.Process(settings ?? new CassetteSettings());
 }
예제 #48
0
 public PlaceholderRewriter_Tests()
 {
     settings = new CassetteSettings();
     tracker = new Mock<IPlaceholderTracker>();
     httpContext = new Mock<HttpContextBase>();
     response = new Mock<HttpResponseBase>();
     items = new Dictionary<string, object>();
     httpContext.SetupGet(c => c.Items).Returns(items);
     httpContext.SetupGet(c => c.Response).Returns(response.Object);
     rewriter = new PlaceholderRewriter(settings, () => tracker.Object, () => httpContext.Object);
 }
예제 #49
0
        public void ProcessCallsProcessor()
        {
            var bundle = new ExternalScriptBundle(Url);
            var pipeline = new Mock<IBundlePipeline<ScriptBundle>>();
            var settings = new CassetteSettings();

            bundle.Pipeline = pipeline.Object;
            bundle.Process(settings);

            pipeline.Verify(p => p.Process(bundle));
        }
예제 #50
0
        public void ProcessCallsProcessor()
        {
            var bundle = new HtmlTemplateBundle("~");
            var pipeline = new Mock<IBundlePipeline<HtmlTemplateBundle>>();
            var settings = new CassetteSettings();
            bundle.Pipeline = pipeline.Object;

            bundle.Process(settings);

            pipeline.Verify(p => p.Process(bundle));
        }
 public void UseFileSystemDirectoryWhenCacheDirectoryIsConfigured()
 {
     var section = new CassetteConfigurationSection
     {
         CacheDirectory = Environment.CurrentDirectory
     };
     var configuration = new TestableWebHostSettingsConfiguration("/", section);
     var settings = new CassetteSettings();
     configuration.Configure(settings);
     settings.CacheDirectory.ShouldBeType<FileSystemDirectory>();
 }
예제 #52
0
 public ScriptPipeline_Tests()
 {
     minifier = Mock.Of<IJavaScriptMinifier>();
     urlGenerator = Mock.Of<IUrlGenerator>();
     var container = new TinyIoCContainer();
     settings = new CassetteSettings();
     container.Register(minifier);
     container.Register(urlGenerator);
     container.Register(settings);
     pipeline = new ScriptPipeline(container, settings);
 }
        public void UseAbsoluteFileSystemDirectoryWhenCacheDirectoryIsConfiguredAsRelativePath()
        {
            var section = new CassetteConfigurationSection
            {
                CacheDirectory = "test"
            };
            var configuration = new TestableWebHostSettingsConfiguration("/", section);
            var settings = new CassetteSettings();
            configuration.Configure(settings);

            var directory = settings.CacheDirectory.ShouldBeType<FileSystemDirectory>();
            directory.FullSystemPath.ShouldEqual(Path.Combine(Environment.CurrentDirectory, "test").Replace('\\', '/'));
        }
        public GivenPipeline()
        {
            bundle = new ScriptBundle("~/");
            asset = new Mock<IAsset>();
            asset.SetupGet(a => a.Path).Returns("~/test.js");
            asset.Setup(a => a.OpenStream()).Returns(Stream.Null);
            bundle.Assets.Add(asset.Object);

            var settings = new CassetteSettings();
            var container = new TinyIoCContainer();
            container.Register(Mock.Of<IJavaScriptMinifier>());
            container.Register(Mock.Of<IUrlGenerator>());
            container.Register(settings);

            pipeline = new ScriptPipeline(container, settings);
        }
예제 #55
0
 public DiagnosticRequestHandler_Tests()
 {
     httpContext = new Mock<HttpContextBase>();
     response = new Mock<HttpResponseBase>();
     httpContext.SetupGet(c => c.Response).Returns(response.Object);
     var requestContext = new RequestContext(httpContext.Object, new RouteData());
     settings = new CassetteSettings();
     bundles = new BundleCollection(settings, Mock.Of<IFileSearchProvider>(), Mock.Of<IBundleFactoryProvider>());
     var urlGenerator = Mock.Of<IUrlGenerator>();
     rebuilder = new Mock<IBundleCacheRebuilder>();
     helper = new Mock<IBundlesHelper>();
     helper.Setup(h => h.Render<ScriptBundle>(null)).Returns(new HtmlString(""));
     helper.SetupGet(h => h.JsonSerializer).Returns(new SimpleJsonSerializer());
     Bundles.Helper = helper.Object;
     httpContext.SetupGet(c => c.Request.HttpMethod).Returns("GET");
     handler = new DiagnosticRequestHandler(requestContext, bundles, settings, urlGenerator, rebuilder.Object);
 }
        public SassBundlePipelineModifier_Tests()
        {
            var minifier = Mock.Of<IStylesheetMinifier>();
            var urlGenerator = Mock.Of<IUrlGenerator>();
            var compiler = new Mock<ISassCompiler>();
            var settings = new CassetteSettings();
            var modifier = new SassBundlePipelineModifier();

            var container = new TinyIoCContainer();
            container.Register(compiler.Object);
            container.Register(minifier);
            container.Register(urlGenerator);
            container.Register(settings);

            originalPipeline = new StylesheetPipeline(container, settings);
            modifiedPipeline = modifier.Modify(originalPipeline);
        }
        public GivenPiplineWhereCompileCoffeeScriptWithCustomCompiler()
        {
            bundle = new ScriptBundle("~/");
            asset = new Mock<IAsset>();
            asset.SetupGet(a => a.Path).Returns("~/test.coffee");
            asset.Setup(a => a.OpenStream()).Returns(Stream.Null);
            bundle.Assets.Add(asset.Object);

            compiler = new Mock<ICoffeeScriptCompiler>();
            var settings = new CassetteSettings();
            var container = new TinyIoCContainer();
            container.Register(compiler.Object);
            container.Register(Mock.Of<IJavaScriptMinifier>());
            container.Register(Mock.Of<IUrlGenerator>());
            container.Register(settings);
            var modifier = new CoffeeScriptBundlePipelineModifier();
            pipeline = new ScriptPipeline(container, settings);
            pipeline = modifier.Modify(pipeline);
        }
예제 #58
0
        public void DontSpriteWhenDebugging()
        {
            var bundle = new StylesheetBundle("~");
            var asset = new StubAsset(
                "~/asset.css",
                ".a { background-image:url(image-a.png);width:20px;height:20px }\n" +
                ".b { background-image:url(image-b.png);width:20px;height:20px }"
            );
            bundle.Assets.Add(asset);

            var settings = new CassetteSettings
            {
                IsDebuggingEnabled = true,
                CacheDirectory = new FakeFileSystem()
            };

            var processor = new SpriteImages(settings, () => null);
            processor.Process(bundle);
            // Would throw exception if it tried to sprite the CSS.
        }
예제 #59
0
        public RawFileRequestRewriter(HttpContextBase context, IFileAccessAuthorization fileAccessAuthorization, IFileContentHasher fileContentHasher, CassetteSettings cassetteSettings, bool usingIntegratedPipeline)
        {
            this.context = context;
            this.fileAccessAuthorization = fileAccessAuthorization;
            this.fileContentHasher = fileContentHasher;
            this.cassetteSettings = cassetteSettings;
            request = context.Request;

            // RewritePath doesn't work as expected in IIS 6 or IIS 7 Classic pipeline
            // Check if integrated pipeline is in use, and fall back to an alternate method if not.
            if (usingIntegratedPipeline)
            {
                rewritePath = RewritePathIntegratedPipeline;
            }
            else
            {
                rewritePath = RewritePathClassicPipeline;
                // Only required for classic pipeline
                mimeMapping = new MimeMappingWrapper();
            }
        }
예제 #60
0
        protected BundleRequestHandler_Tests()
        {
            httpContext = new Mock<HttpContextBase>();
            request = new Mock<HttpRequestBase>();
            requestHeaders = new NameValueCollection();
            response = new Mock<HttpResponseBase>();
            responseCache = new Mock<HttpCachePolicyBase>();
            routeData = new RouteData();
            requestContext = new RequestContext(httpContext.Object, routeData);
            outputStream = new MemoryStream();

            httpContext.SetupGet(c => c.Request).Returns(request.Object);
            httpContext.SetupGet(c => c.Response).Returns(response.Object);
            httpContext.SetupGet(c => c.Items).Returns(new Dictionary<string, object>());

            response.SetupGet(r => r.OutputStream).Returns(outputStream);
            response.SetupGet(r => r.Cache).Returns(responseCache.Object);

            request.SetupGet(r => r.Headers).Returns(requestHeaders);

            var settings = new CassetteSettings();
            bundles = new BundleCollection(settings, Mock.Of<IFileSearchProvider>(), Mock.Of<IBundleFactoryProvider>());
        }