stikjs/stik-core

View on GitHub
specs/manager_spec.js

Summary

Maintainability
C
1 day
Test Coverage
require("./spec_helper");

var stik = window.stik;

describe("Manager", function(){
  function DOMDouble(){
    return {
      querySelectorAll: function(){}
    };
  };

  beforeEach(function(){
    stik.$$manager.$reset();
  });

  describe("#saddControllerWithAction", function(){
    it("should throw if any parameters is empty or missing", function(){
      var manager = stik.manager();

      expect(function(){
        manager.addControllerWithAction( "", "detail", function(){} );
      }).toThrow( "Stik: Controller needs a name" );

      expect(function(){
        manager.addControllerWithAction( "ItemCtrl", "", function(){} );
      }).toThrow( "Stik: Action name can't be empty" );

      expect(function(){
        manager.addControllerWithAction( "ItemCtrl", "detail" );
      }).toThrow( "Stik: Action needs a function to use as its execution unit" );
    });

    it("should register and bind the new execution unit", function(){
      var manager = stik.manager();

      expect(
        manager.addControllerWithAction(
          "ItemCtrl", "detail", function(){}
        )
      ).not.toBeUndefined();
    });
  });

  describe("#addBoundary", function(){
    it("when not ok", function(){
      var manager = stik.manager();

      expect(function(){
        manager.addBoundary({
          as: "CustomObj",
          from: "different",
          to: {}
        });
      }).toThrow( "Stik: Invalid boundary 'from' specified. Please use 'controller', 'behavior', 'all' or leave it blank to default to 'all'" );

      expect(function(){
        manager.addBoundary({
          as: "with space",
          from: "controller",
          to: {}
        });
      }).toThrow( "Stik: 'with space' is not a valid Boundary name. Please replace empty spaces with dashes ('-')" );

      expect(function(){
        manager.addBoundary({
          as: "CustomObj",
          from: "controller",
          to: null
        });
      }).toThrow( "Stik: Boundary needs an object or function as 'to'" );
    });

    it("should default to both controller and behavior", function(){
      var customFuncMock = jasmine.createSpy("customFunc");

      stik.boundary({
        as: "customFuncForBoth",
        to: customFuncMock
      });

      stik.controller( "some-controller", "some-action", function(customFuncForBoth){
        customFuncForBoth()
      });
      stik.behavior( "some-behavior", function(customFuncForBoth){
        customFuncForBoth()
      });

      stik.labs.controller({
        name: "some-controller",
        action: "some-action",
        template: "<a></a>"
      }).run();

      stik.labs.behavior({
        name: "some-behavior",
        template: "<a></a>"
      }).run();

      expect( customFuncMock.calls.length ).toEqual( 2 );
    });

    it("should create a new controller boundary", function(){
      var customFuncMock = jasmine.createSpy("customFunc");

      stik.boundary({
        as: "customFuncForController",
        from: "controller",
        to: customFuncMock
      });

      stik.controller( "AppCtrl", "List", function( customFuncForController ){
        customFuncForController();
      });

      stik.labs.controller({
        name: "AppCtrl",
        action: "List",
        template: "<a></a>"
      }).run();

      expect( customFuncMock ).toHaveBeenCalled();

      stik.behavior( "do-something", function( customFuncForController ){
        customFuncForController();
      });

      var behaviorLab = stik.labs.behavior({
        name: "do-something",
        template: "<a></a>"
      });

      expect(function(){
        behaviorLab.run();
      }).toThrow("Stik: could not find this module (customFuncForController)");
    });

    it("should be injectable into behaviors", function(){
      var manager, executionUnit, injectable, template, result, behavior;

      manager = stik.manager();

      injectable = function(){};
      manager.addBoundary({
        as: "CustomFunc",
        from: "behavior",
        to: injectable
      });

      behavior = manager.addBehavior( "new-behavior", function( CustomFunc ){
        result = CustomFunc;
      });

      template = document.createElement("div");
      spyOn(behavior, "findTemplates").andReturn([template]);

      manager.applyBehaviors();

      expect(result).toEqual(injectable);
    });

    it("should be injectable into an action", function(){
      var manager, injectable, elm, template, result, ctrl;

      manager = stik.manager();

      injectable = {};
      manager.addBoundary({
        as: "CustomObj",
        from: "controller",
        to: injectable
      });

      template = 'div';

      ctrl = manager.addControllerWithAction( "AppCtrl", "List", function( CustomObj ){
        result = CustomObj;
      });

      spyOn(
         ctrl.actions[ "List" ], "findTemplates"
      ).andReturn( [ template ] );

      manager.bindActions();

      expect( result ).toEqual( injectable );
    });
  });

  describe("#addBehavior", function(){
    it("should throw if trying to add a behavior with an existing name", function(){
      var manager = stik.manager(),
          name = "some-behavior";

      spyOn( manager, "applyBehavior" );

      manager.addBehavior( name, function(){} );

      expect(function(){
        manager.addBehavior( name, function(){} );
      }).toThrow( "Stik: Another behavior already exist with name 'some-behavior'" );
    });

    it("should try to apply", function(){
      var manager = stik.manager(),
          behavior = "some-behavior";

      spyOn( manager, "applyBehavior" );

      manager.addBehavior( behavior, function(){} );

      expect( manager.applyBehavior ).toHaveBeenCalled();
    });
  });

  describe("#applyBehaviors", function(){
    it("without behaviors", function(){
      var manager = stik.manager();

      spyOn( manager, "applyBehavior" );

      expect( manager.applyBehaviors() ).toBeFalsy();
    });

    it("with one behavior", function(){
      var manager = stik.manager(),
          behavior;

      spyOn( manager, "applyBehavior" ).andReturn( true );

      behavior = manager.addBehavior(
        "some-behavior", function(){}
      );

      expect( manager.applyBehaviors() ).toBeTruthy();
      expect(
        manager.applyBehavior
      ).toHaveBeenCalledWith( behavior );
    });

    it("with many behaviors", function(){
      var manager, behavior;

      manager = stik.manager();
      spyOn( manager, "applyBehavior" ).andReturn( true );

      behavior1 = manager.addBehavior(
        "some-behavior-1", function(){}
      );
      behavior2 = manager.addBehavior(
        "some-behavior-2", function(){}
      );
      behavior3 = manager.addBehavior(
        "some-behavior-3", function(){}
      );

      expect(manager.applyBehaviors()).toBeTruthy();
      expect(
        manager.applyBehavior
      ).toHaveBeenCalledWith(behavior1);
      expect(
        manager.applyBehavior
      ).toHaveBeenCalledWith(behavior2);
      expect(
        manager.applyBehavior
      ).toHaveBeenCalledWith(behavior3);
    });
  });

  describe("#getBoundary", function(){
    it("should retreive a controller boundary", function(){
      var manager = window.stik.manager(),
          boundary;

      manager.addBoundary({
        as: "some-boundary",
        from: "controller",
        to: function(){}
      });

      boundary = manager.getBoundary("some-boundary");

      expect(boundary).not.toBeUndefined();
      expect(boundary.name).toEqual("some-boundary");
    });

    it("should retreive a behavior boundary", function(){
      var manager = window.stik.manager(),
          boundary;

      manager.addBoundary({
        as: "some-boundary",
        from: "behavior",
        to: function(){}
      });

      boundary = manager.getBoundary("some-boundary");

      expect(boundary).not.toBeUndefined();
      expect(boundary.name).toEqual("some-boundary");
    });
  })
});