Package org.bladerunnerjs.spec.plugin.bundler.namespacedjs

Source Code of org.bladerunnerjs.spec.plugin.bundler.namespacedjs.NamespacedJsContentPluginTest

package org.bladerunnerjs.spec.plugin.bundler.namespacedjs;

import org.bladerunnerjs.model.App;
import org.bladerunnerjs.model.Aspect;
import org.bladerunnerjs.model.Blade;
import org.bladerunnerjs.model.BladerunnerConf;
import org.bladerunnerjs.model.Bladeset;
import org.bladerunnerjs.model.JsLib;
import org.bladerunnerjs.model.TestPack;
import org.bladerunnerjs.model.TypedTestPack;
import org.bladerunnerjs.testing.specutility.engine.SpecTest;
import org.junit.Before;
import org.junit.Test;

public class NamespacedJsContentPluginTest extends SpecTest {
  private App app;
  private Aspect aspect;
  private StringBuffer requestResponse = new StringBuffer();
  private JsLib thirdpartyLib;
  private JsLib sdkJsLib;
  private BladerunnerConf bladerunnerConf;
  private Bladeset bladeset;
  private Blade blade;
  private TypedTestPack bladeTestPack, sdkJsLibTestPack;
  private TestPack aspectTests, bladeTests, sdkJsLibTests;
  private Bladeset defaultBladeset;
  private Blade bladeInDefaultBladeset;
  private Aspect defaultAspect;
 
  @Before
  public void initTestObjects() throws Exception
  {
    given(brjs).automaticallyFindsBundlerPlugins()
      .and(brjs).automaticallyFindsMinifierPlugins()
      .and(brjs).hasBeenCreated();
      app = brjs.app("app1");
      aspect = app.aspect("default");
      defaultAspect = app.defaultAspect();
      aspectTests = aspect.testType("unit").testTech("js-test-driver");
      bladeset = app.bladeset("bs");
      blade = bladeset.blade("b1");
      bladeTestPack = blade.testType("test");
      bladeTests = bladeTestPack.testTech("techy");
      thirdpartyLib = app.jsLib("lib1");
      sdkJsLib = brjs.sdkLib("sdkLib");
      bladerunnerConf = brjs.bladerunnerConf();
      sdkJsLibTestPack = sdkJsLib.testType("test");
      sdkJsLibTests = sdkJsLibTestPack.testTech("jsTestDriver");
      defaultBladeset = app.defaultBladeset();
      bladeInDefaultBladeset = defaultBladeset.blade("b1");
  }
 
  @Test
  public void ifThereAreNoJsFilesThenNoRequestsWillBeGenerated() throws Exception {
    given(aspect).indexPageHasContent("index page");
    then(aspect).prodAndDevRequestsForContentPluginsAreEmpty("namespaced-js");
  }
 
  @Test
  public void ifThereAreJsFilesThenMultipleRequestsWillBeGeneratedInDev() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).indexPageRefersTo("appns.Class")
      .and(aspect).hasClass("appns.Class");
    then(aspect).devRequestsForContentPluginsAre("namespaced-js", "namespaced-js/package-definitions.js", "namespaced-js/module/appns/Class.js", "namespaced-js/globalize-extra-classes.js");
  }
 
  @Test
  public void ifThereAreJsFilesThenASingleBundleRequestWillBeGeneratedInProd() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).indexPageRefersTo("appns.Class")
      .and(aspect).hasClass("appns.Class");
    then(aspect).prodRequestsForContentPluginsAre("namespaced-js", "namespaced-js/bundle.js");
  }
 
  @Test
  public void theBundleIsEmptyIfWeDontReferToAnyOfTheClasses() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).hasClasses("appns.Class1", "appns.Class2")
      .and(aspect).classDependsOn("appns.Class1", "appns.Class2");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).isEmpty();
  }
 
  @Test
  public void theBundleContainsClassesThatAreReferredTo() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).hasClasses("appns.Class1", "appns.Class2")
      .and(aspect).classDependsOn("appns.Class1", "appns.Class2")
      .and(aspect).indexPageRefersTo("appns.Class1");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsNamespacedJsClasses("appns.Class1", "appns.Class2");
  }
 
  @Test
  public void referencesAreNotProcessedIfCommentedOutWithTwoSlashes() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).hasClass("appns.TheClass")
      .and(aspect).indexPageHasContent("// appns.TheClass");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).isEmpty();
  }
 
  @Test
  public void referencesAreNotProcessedIfCommentedOutWithWithHTMLStyleComments() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).hasClass("appns.TheClass")
      .and(aspect).indexPageHasContent("<!-- appns.TheClass -->");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).isEmpty();
  }
 
  @Test
  public void referencesAreNotProcessedIfCommentedOutWithSlashStar() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).hasClass("appns.TheClass")
      .and(aspect).indexPageHasContent("/* appns.TheClass */");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).isEmpty();
  }
 
  @Test
  public void referencesAreNotProcessedIfCommentedOutWithSlashStarStar() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).hasClass("appns.TheClass")
      .and(aspect).indexPageHasContent("/** appns.TheClass */");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).isEmpty();
  }
 
  @Test
  public void staticReferencesAreNotProcessedIfCommentedOutWithTwoSlashes() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).hasClasses("appns.Class1", "appns.Class2")
      .and(aspect).indexPageRefersTo("appns.Class1")
      .and(aspect).classFileHasContent("appns.Class1",
        "appns.Class1 = function() {};\n" +
        "// br.Core.extend(appns.Class1, appns.Class2);");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsNamespacedJsClasses("appns.Class1")
      .and(requestResponse).doesNotContainClasses("appns.Class2");
  }
 
  @Test
  public void staticReferencesAreNotProcessedIfCommentedOutWithSlashStar() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).hasClasses("appns.Class1", "appns.Class2")
      .and(aspect).indexPageRefersTo("appns.Class1")
      .and(aspect).classFileHasContent("appns.Class1",
        "appns.Class1 = function() {};\n" +
        "/* br.Core.extend(appns.Class1, appns.Class2); */");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsNamespacedJsClasses("appns.Class1")
      .and(requestResponse).doesNotContainClasses("appns.Class2");
  }
 
  @Test
  public void staticReferencesAreNotProcessedIfCommentedOutWithSlashSlashStar() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).hasClasses("appns.Class1", "appns.Class2")
      .and(aspect).indexPageRefersTo("appns.Class1")
      .and(aspect).classFileHasContent("appns.Class1",
        "appns.Class1 = function() {};\n" +
        "/** br.Core.extend(appns.Class1, appns.Class2); */");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsNamespacedJsClasses("appns.Class1")
      .and(requestResponse).doesNotContainClasses("appns.Class2");
  }
 
  @Test
  public void thePackageDefinitionsBlockShouldContainSinglePackageIfThereIsOneTopLevelClass() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).hasClasses("appns.Class1")
      .and(aspect).resourceFileRefersTo("xml/config.xml", "appns.Class1");
    when(aspect).requestReceivedInDev("namespaced-js/package-definitions.js", requestResponse);
    then(requestResponse).containsText("mergePackageBlock(window, {\"appns\":{}});");
  }
 
  @Test
  public void thePackageDefinitionsBlockShouldContainSinglePackageIfThereAreTwoTopLevelClasses() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).hasClasses("appns.Class1", "appns.Class2")
      .and(aspect).resourceFileRefersTo("xml/config.xml", "appns.Class1")
      .and(aspect).classDependsOn("appns.Class1", "appns.Class2");
    when(aspect).requestReceivedInDev("namespaced-js/package-definitions.js", requestResponse);
    then(requestResponse).containsText("mergePackageBlock(window, {\"appns\":{}});");
  }
 
  @Test
  public void thePackageDefinitionsBlockShouldBeEmptyIfNoneOfTheClassesAreUsed() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).hasClasses("appns.Class1", "appns.Class2")
      .and(aspect).classDependsOn("appns.Class1", "appns.Class2");
    when(aspect).requestReceivedInDev("namespaced-js/package-definitions.js", requestResponse);
    then(requestResponse).isEmpty();
  }
 
  @Test
  public void thePackageDefinitionsBlockShouldContainTwoPackagesIfThereAreClassesAtDifferentLevels() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).hasClasses("appns.Class1", "appns.pkg.Class2")
      .and(aspect).resourceFileRefersTo("xml/config.xml", "appns.Class1")
      .and(aspect).classDependsOn("appns.Class1", "appns.pkg.Class2");
    when(aspect).requestReceivedInDev("namespaced-js/package-definitions.js", requestResponse);
    then(requestResponse).containsText("mergePackageBlock(window, {\"appns\":{\"pkg\":{}}});");
  }
 
  @Test
  public void thePackageDefinitionsBlockShouldntContainPackagesForTestClasses() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspectTests).hasClass("appns.pkg1.Class")
      .and(aspectTests).hasTestClass("appns.pkg2.TestClass")
      .and(aspectTests).testRefersTo("appns/pkg3/test.js", "appns.pkg1.Class", "appns.pkg2.TestClass");
    when(aspectTests).requestReceivedInDev("namespaced-js/package-definitions.js", requestResponse);
    then(requestResponse).containsText("mergePackageBlock(window, {\"appns\":{\"pkg1\":{},\"pkg2\":{}}});");
  }
 
  @Test
  public void eachClassShouldBeReturnedLargelyUnchanged() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).containsFileWithContents("src/appns/Class1.js", "appns.Class1 = function() {\n};");
    when(aspect).requestReceivedInDev("namespaced-js/module/appns/Class1.js", requestResponse);
    then(requestResponse).textEquals("define('appns/Class1', function(require, exports, module) {\nappns.Class1 = function() {\n};\nmodule.exports = appns.Class1;\n});\n");
  }
 
  @Test
  public void requiresAreAlsoAutomaticallyAddedWithinTheBundledResponse() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle("src/appns/namespaced")
      .and(aspect).hasCommonJsPackageStyle("src/appns/commonjs")
      .and(aspect).hasClasses("appns.namespaced.Class", "appns/commonjs/Class")
      .and(aspect).indexPageRefersTo("appns.namespaced.Class")
      .and(aspect).classDependsOn("appns.namespaced.Class", "appns.commonjs.Class");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsText("appns.namespaced.Class = function() {\n};")
      .and(requestResponse).containsText("appns.commonjs.Class = require('appns/commonjs/Class');");
  }
 
  @Test
  public void autoGlobalisationReplacesInvalidCharacters() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle("src/appns/namespaced")
      .and(aspect).hasCommonJsPackageStyle("src/appns/common-js")
      .and(aspect).hasClasses("appns.namespaced.Class", "appns/common-js/Class")
      .and(aspect).indexPageRefersTo("appns.namespaced.Class")
      .and(aspect).classDependsOn("appns.namespaced.Class", "appns.common-js.Class");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsText("appns.namespaced.Class = function() {\n};")
      .and(requestResponse).containsText("appns.common_js.Class = require('appns/common-js/Class');");
  }
 
  @Test
  public void theGlobalizedBlockIsOrderedUsingTransitiveNonCircularPreExportDefineTimeOrdering() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).classDependsOn("appns.ClassA", "appns.ClassB")
      .and(aspect).classExtends("appns.ClassB", "appns.ClassC")
      .and(aspect).classDependsOn("appns.ClassC", "appns.ClassB")
      .and(aspect).indexPageRefersTo("appns.ClassA");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsOrderedTextFragments("appns.ClassC = require('appns/ClassC')", "appns.ClassB = require('appns/ClassB')", "appns.ClassA = require('appns/ClassA')");
  }
 
  @Test
  public void requiresAreNotAutomaticallyAddedForThirdpartyLibrariesWhichAreNotEncapsulated() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).hasClasses("appns.namespaced.Class")
      .and(aspect).indexPageRefersTo("appns.namespaced.Class")
      .and(aspect).classDependsOnThirdpartyLib("appns.namespaced.Class", thirdpartyLib)
      .and(thirdpartyLib).containsFileWithContents("thirdparty-lib.manifest", "js: lib.js\n"+"exports: thirdpartlib")
      .and(thirdpartyLib).containsFile("lib.js");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsNamespacedJsClasses("appns.namespaced.Class")
      .and(requestResponse).doesNotContainText("require('lib1')");
  }
 
  @Test
  public void requiresAreOnlyAutomaticallyAddedOnceInABundleForAGivenClass() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle("src/appns/namespaced")
      .and(aspect).hasClasses("appns.namespaced.Class", "appns.namespaced.AnotherClass", "appns/commonjs/Class")
      .and(aspect).indexPageRefersTo("new appns.namespaced.Class(); new appns.namespaced.AnotherClass();")
      .and(aspect).containsFileWithContents("src/appns/namespaced/Class.js", "new appns.commonjs.Class();")
      .and(aspect).containsFileWithContents("src/appns/namespaced/AnotherClass.js", "new appns.commonjs.Class();");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsTextOnce("appns.commonjs.Class = require('appns/commonjs/Class');");
  }
 
  @Test
  public void packageDefinitionsInBundleContainAutomaticRequirePackages() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle("src/appns/namespaced")
      .and(aspect).hasClasses("appns.namespaced.Class", "appns.namespaced.AnotherClass", "appns/commonjs/Class")
      .and(aspect).indexPageRefersTo("new appns.namespaced.Class(); new appns.namespaced.AnotherClass();")
      .and(aspect).containsFileWithContents("src/appns/namespaced/Class.js", "new appns.commonjs.Class();")
      .and(aspect).containsFileWithContents("src/appns/namespaced/AnotherClass.js", "new appns.commonjs.Class();");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsTextOnce("mergePackageBlock(window, {\"appns\":{\"namespaced\":{},\"commonjs\":{}}});");
  }
 
  @Test
  public void packageDefinitionsContainsAutomaticRequirePackages() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle("src/appns/namespaced")
      .and(aspect).hasClasses("appns.namespaced.Class", "appns.namespaced.AnotherClass", "appns/commonjs/Class")
      .and(aspect).indexPageRefersTo("new appns.namespaced.Class(); new appns.namespaced.AnotherClass();")
      .and(aspect).containsFileWithContents("src/appns/namespaced/Class.js", "new appns.commonjs.Class();")
      .and(aspect).containsFileWithContents("src/appns/namespaced/AnotherClass.js", "new appns.commonjs.Class();");
    when(aspect).requestReceivedInDev("namespaced-js/package-definitions.js", requestResponse);
    then(requestResponse).containsTextOnce("mergePackageBlock(window, {\"appns\":{\"namespaced\":{},\"commonjs\":{}}});");
  }
 
  @Test
  public void jsPatchesAreIncludedAfterTheSourceModuleAndInsideTheDefine() throws Exception {
    given(sdkJsLib).hasNamespacedJsPackageStyle("src")
      .and(sdkJsLib).hasClasses("sdkLib.Class")
      .and(aspect).indexPageRefersTo("new sdkLib.Class()")
      .and(brjs).containsFileWithContents("js-patches/sdkLib/Class.js", "sdkLib.Class.patch = function() {}");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsOrderedTextFragments(
        "define('sdkLib/Class'",
        "sdkLib.Class = function()",
        "sdkLib.Class.patch = function() {}",
        "module.exports = sdkLib.Class;"
    );
  }
 
  @Test
  public void dependenciesInPatchesArePulledInToTheBundle() throws Exception {
    given(sdkJsLib).hasNamespacedJsPackageStyle("src")
      .and(sdkJsLib).hasClasses("sdkLib.Class1", "sdkLib.Class2")
      .and(aspect).indexPageRefersTo("new sdkLib.Class1()")
      .and(brjs).containsFileWithContents("js-patches/sdkLib/Class1.js", "new sdkLib.Class2()");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsNamespacedJsClasses("sdkLib.Class2");
  }
 
  @Test
  public void weCanUseUTF8() throws Exception {
    given(bladerunnerConf).defaultFileCharacterEncodingIs("UTF-8")
      .and().activeEncodingIs("UTF-8")
      .and(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).containsFileWithContents("src/appns/Class1.js", "// $£€");
    when(aspect).requestReceivedInDev("namespaced-js/module/appns/Class1.js", requestResponse);
    then(requestResponse).containsText("$£€");
  }
 
  @Test
  public void weCanUseLatin1() throws Exception {
    given(bladerunnerConf).defaultFileCharacterEncodingIs("ISO-8859-1")
      .and().activeEncodingIs("ISO-8859-1")
      .and(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).containsFileWithContents("src/appns/Class1.js", "// $£");
    when(aspect).requestReceivedInDev("namespaced-js/module/appns/Class1.js", requestResponse);
    then(requestResponse).containsText("$£");
  }
 
  @Test
  public void weCanUseUnicodeFilesWithABomMarkerEvenWhenThisIsNotTheDefaultEncoding() throws Exception {
    given(bladerunnerConf).defaultFileCharacterEncodingIs("ISO-8859-1")
      .and().activeEncodingIs("UTF-16")
      .and(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).containsFileWithContents("src/appns/Class1.js", "// $£€");
    when(aspect).requestReceivedInDev("namespaced-js/module/appns/Class1.js", requestResponse);
    then(requestResponse).containsText("$£€");
  }
 
  @Test
  public void namespacedJsClassesAreWrappedInACommonJsDefineBlock() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle("src/appns/namespacedjs")
      .and(aspect).hasCommonJsPackageStyle("src/appns/commonjs")
      .and(aspect).hasClasses("appns.namespacedjs.Class1", "appns/commonjs/Class1", "appns/commonjs/Class2")
      .and(aspect).indexPageRefersTo("appns.namespacedjs.Class1")
      .and(aspect).classDependsOn("appns.namespacedjs.Class1", "appns.commonjs.Class1")
      .and(aspect).classRequires("appns/commonjs/Class1", "appns/commonjs/Class2");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsOrderedTextFragments(
        "define('appns/namespacedjs/Class1', function(require, exports, module) {",
        "appns.namespacedjs.Class1 = function()",
        "module.exports = appns.namespacedjs.Class1;"
        );
  }
 
  @Test
  public void staticDependenciesAreRequiredAtTheTopOfTheModuleDefinition() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle("src/appns/namespacedjs")
      .and(aspect).hasClasses("appns.namespacedjs.Class1", "appns.namespacedjs.Class2")
      .and(aspect).classStaticallyDependsOn("appns.namespacedjs.Class1", "appns.namespacedjs.Class2")
      .and(aspect).indexPageRefersTo("appns.namespacedjs.Class1");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsOrderedTextFragments(
        "define('appns/namespacedjs/Class1', function(require, exports, module) { requireAll(require, ['appns/namespacedjs/Class2']);",
        "appns.namespacedjs.Class1 = function()",
        "module.exports = appns.namespacedjs.Class1;");
  }
 
  @Test
  public void requiredStaticDependenciesOnlyIncludeSourceModules() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle("src/appns/namespacedjs")
      .and(aspect).hasClasses("appns.namespacedjs.Class1")
      .and(aspect).containsResourceFileWithContents("file.xml", "<rootElem xmlns=\"http://schema.acme.org/schema\"><elem id='appns.namespacedjs.SomeId'/</rootElem>")
      .and(aspect).classStaticallyDependsOn("appns.namespacedjs.Class1", "appns.namespacedjs.SomeId")
      .and(aspect).indexPageRefersTo("appns.namespacedjs.Class1");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).doesNotContainText("requireAll");
  }
 
 
  @Test
  public void packageDefinitionsIncludesClassesNotDirectlyUsedByANamespacedClass() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle("src/appns/namespacedjs")
        .and(aspect).hasCommonJsPackageStyle("src/appns/commonjs")
        .and(aspect).hasClasses("appns.namespacedjs.Class1", "appns/commonjs/Class1", "appns/commonjs/pkg/Class2")
        .and(aspect).indexPageRefersTo("appns.namespacedjs.Class1")
        .and(aspect).classDependsOn("appns.namespacedjs.Class1", "appns.commonjs.Class1")
        .and(aspect).classRequires("appns/commonjs/Class1", "appns/commonjs/pkg/Class2");
    when(aspect).requestReceivedInDev("namespaced-js/package-definitions.js", requestResponse);
    then(requestResponse).containsText("mergePackageBlock(window, {\"appns\":{\"namespacedjs\":{},\"commonjs\":{\"pkg\":{}}}});");
  }
 
  @Test
  public void testClassesInABladeHaveTheCorrectGlobalizedPaths() throws Exception {
    given(blade).hasCommonJsPackageStyle()
      .and(blade).hasClasses("appns/bs/b1/Class1")
      .and(bladeTests).hasTestClass("appns/bs/b1/TestClass1")
      .and(bladeTests).hasNamespacedJsPackageStyle("tests")
      .and(bladeTests).testRefersTo("BladeTest.js", "appns.bs.b1.Class1", "appns.bs.b1.TestClass1");
    when(bladeTests).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsText( "appns.bs.b1.TestClass1 = require('appns/bs/b1/TestClass1');" );
  }
 
  @Test
  public void commonJsTestsInRootTestsDirInAnSdkLibDontHaveTheirPathsGlobalized() throws Exception {
    given(sdkJsLib).hasCommonJsPackageStyle()
        .and(sdkJsLib).hasClasses("sdkLib/Class1")
        .and(sdkJsLibTests).hasTestClass("sdkLib/TestClass1")
        .and(sdkJsLibTests).containsFileWithContents("tests/LibTest.js", "new sdkLib.Class1(); new sdkLib.TestClass1();");
      when(sdkJsLibTests).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
      then(requestResponse).doesNotContainText( "sdkLib.LibTest = require" );
  }
 
  @Test
  public void commonJsTestsInRootTestsDirInAnSdkLibWithNestedRequirePrefixDontHaveTheirPathsGlobalized() throws Exception {
    given(sdkJsLib).hasCommonJsPackageStyle()
      .and(sdkJsLib).containsFileWithContents("br-lib.conf", "requirePrefix: sdkLib/subPkg")
        .and(sdkJsLib).hasClasses("sdkLib/subPkg/Class1")
        .and(sdkJsLibTests).hasTestClass("sdkLib/subPkg/TestClass1")
        .and(sdkJsLibTests).containsFileWithContents("tests/LibTest.js", "new sdkLib.subPkg.Class1(); new sdkLib.subPkg.TestClass1();");
      when(sdkJsLibTests).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
      then(requestResponse).doesNotContainText( "sdkLib.subPkg.LibTest = require" );
  }
 
  @Test
  public void selfExecutingFunctionsDontPreventCorrectCalculationOfStaticDependencies() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
    .and(aspect).hasClasses("appns.Class1", "appns.Class2")
    .and(aspect).indexPageRefersTo("appns.Class1")
    .and(aspect).classFileHasContent("appns.Class1",
        ";(function() {\n" +
        "appns.Class1 = function() {};\n" +
        "appns.Class2();\n" +
        "});")
    .and(aspect).classFileHasContent("appns.Class2",
        "appns.Class2 = function() {};");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsOrderedTextFragments(
        "appns.Class2 = function()",
        "appns.Class1 = function()");
  }
 
  @Test
  public void staticDependenciesAreAllPassedToTheRequireAllMethod() throws Exception {
    given(aspect).hasNamespacedJsPackageStyle()
    .and(aspect).hasClasses("appns.Class1", "appns.Class2", "appns.Class3")
    .and(aspect).indexPageRefersTo("appns.Class1")
    .and(aspect).classFileHasContent("appns.Class1",
        "appns.Class1 = function() {};\n" +
        "appns.Class2();\n" +
        "appns.Class3();")
    .and(aspect).classFileHasContent("appns.Class2",
        "appns.Class2 = function() {};")
    .and(aspect).classFileHasContent("appns.Class3",
        "appns.Class3 = function() {};\n");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsOrderedTextFragments(
        "appns.Class2 = function()",
        "appns.Class3 = function()",
        "{ requireAll(require, ['appns/Class2','appns/Class3']);",
        "appns.Class1 = function()");
  }
 
  @Test
  public void methodsWithTheSameNameAsALibraryDontIncludeTheLibrary() throws Exception {
    JsLib normalizeLib = app.jsLib("normalize");
    given(normalizeLib).containsFileWithContents("thirdparty-lib.manifest", "depends:")
      .and(normalizeLib).containsFileWithContents("script.js", "normalizeLib JS")
      .and(aspect).hasNamespacedJsPackageStyle()
      .and(aspect).indexPageRefersTo("appns.Class1")
      .and(aspect).classFileHasContent("appns.Class1", "e.normalize()");
    when(aspect).requestReceivedInDev("js/dev/combined/bundle.js", requestResponse);
    then(requestResponse).doesNotContainText("normalizeLib")
      .and(requestResponse).containsText("e.normalize()");
  }
 
  @Test
  public void bladeClassesInDefaultBladesetCanBeBundled() throws Exception {
    given(app).hasNamespacedJsPackageStyle()
      .and(bladeInDefaultBladeset).hasClass("appns.b1.BladeClass")
      .and(aspect).indexPageRefersTo("appns.b1.BladeClass");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsNamespacedJsClasses("appns.b1.BladeClass");
  }
 
  @Test
  public void classesInDefaultAspectCanBeBundled() throws Exception {
    given(defaultAspect).hasNamespacedJsPackageStyle()
      .and(defaultAspect).hasClass("appns.AspectClass")
      .and(defaultAspect).indexPageRefersTo("appns.AspectClass");
    when(defaultAspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsNamespacedJsClasses("appns.AspectClass");
  }
 
  @Test
  public void useTimeDependenciesAreRequiredBelowModuleExports() throws Exception {
    given(aspect).indexPageRequires("appns/Class1")
      .and(aspect).hasNamespacedJsPackageStyle()
        .and(aspect).classFileHasContent("appns.Class1", "function MyClass() { new appns.Class2(); }")
        .and(aspect).classFileHasContent("appns.Class2", "");
    when(aspect).requestReceivedInDev("namespaced-js/bundle.js", requestResponse);
    then(requestResponse).containsOrderedTextFragments(
      "define('appns/Class1'",
      "module.exports = appns.Class1;",
      "requireAll(require, ['appns/Class2']);");
  }
 
 
 
}
TOP

Related Classes of org.bladerunnerjs.spec.plugin.bundler.namespacedjs.NamespacedJsContentPluginTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.