Some basic unit tests for the tuskar.boxes js module
Change-Id: I6b15ec7d818ad7d314954674641983a6c5ff8033
This commit is contained in:
		@@ -3,67 +3,67 @@ tuskar.boxes = (function () {
 | 
			
		||||
 | 
			
		||||
  var module = {};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  module.get_role_counts = function ($flavor) {
 | 
			
		||||
    var roles = {};
 | 
			
		||||
    $flavor.find('div.boxes-drop-roles div.boxes-role').each(function () {
 | 
			
		||||
      var $this = $(this);
 | 
			
		||||
      var name = $this.data('name');
 | 
			
		||||
      var count = +$this.find('input.number-picker').val();
 | 
			
		||||
      roles[name] = count;
 | 
			
		||||
    });
 | 
			
		||||
    return roles;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  module.update_maximums = function ($flavor, roles, nodes) {
 | 
			
		||||
    var used = 0;
 | 
			
		||||
    $.each(roles, function (key, value) { used += value; });
 | 
			
		||||
    $flavor.find('div.boxes-drop-roles div.boxes-role').each(function () {
 | 
			
		||||
      var $this = $(this);
 | 
			
		||||
      var role = $this.data('name');
 | 
			
		||||
      var $picker = $this.find('input.number-picker');
 | 
			
		||||
      $picker.attr('max', Math.max(0, nodes - used + roles[role]));
 | 
			
		||||
    });
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  module.update_nodes = function ($flavor, roles) {
 | 
			
		||||
    var role_names = Object.getOwnPropertyNames(roles);
 | 
			
		||||
    var count = 0;
 | 
			
		||||
    var role = 0;
 | 
			
		||||
    $flavor.find('div.boxes-nodes div.boxes-node').each(function () {
 | 
			
		||||
      var $this = $(this);
 | 
			
		||||
      $this.removeClass('boxes-role-controller boxes-role-compute boxes-role-cinder-storage boxes-role-swift-storage boxes-role-none');
 | 
			
		||||
      while (count >= roles[role_names[role]]) {
 | 
			
		||||
        role += 1;
 | 
			
		||||
        count = 0;
 | 
			
		||||
      }
 | 
			
		||||
      if (!role_names[role]) {
 | 
			
		||||
        $(this).html('free');
 | 
			
		||||
        $(this).addClass('boxes-role-none');
 | 
			
		||||
      } else {
 | 
			
		||||
        $this.addClass('boxes-role-' + role_names[role]).html(' ');
 | 
			
		||||
      }
 | 
			
		||||
      count += 1;
 | 
			
		||||
    });
 | 
			
		||||
    var free_nodes = $flavor.find('div.boxes-nodes div.boxes-role-none').length;
 | 
			
		||||
    $flavor.find('span.free-nodes').text(free_nodes);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  module.update_boxes = function () {
 | 
			
		||||
    $('div.boxes-flavor').each(function () {
 | 
			
		||||
        var $flavor = $(this);
 | 
			
		||||
        var role_counts = module.get_role_counts($flavor);
 | 
			
		||||
        var nodes_count = $flavor.find('div.boxes-nodes div.boxes-node').length;
 | 
			
		||||
        module.update_nodes($flavor, role_counts);
 | 
			
		||||
        module.update_maximums($flavor, role_counts, nodes_count);
 | 
			
		||||
    });
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  module.init = function () {
 | 
			
		||||
    if ($('div.boxes-available-roles').length === 0) {
 | 
			
		||||
      // Only activate on a page that has the right classes.
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function get_role_counts($flavor) {
 | 
			
		||||
      var roles = {};
 | 
			
		||||
      $flavor.find('div.boxes-drop-roles div.boxes-role').each(function () {
 | 
			
		||||
        var $this = $(this);
 | 
			
		||||
        var name = $this.data('name');
 | 
			
		||||
        var count = +$this.find('input.number-picker').val();
 | 
			
		||||
        roles[name] = count;
 | 
			
		||||
      });
 | 
			
		||||
      return roles;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function update_maximums($flavor, roles) {
 | 
			
		||||
      var nodes = $flavor.find('div.boxes-nodes div.boxes-node').length;
 | 
			
		||||
      var used = 0;
 | 
			
		||||
      $.each(roles, function (key, value) { used += value; });
 | 
			
		||||
      $flavor.find('div.boxes-drop-roles div.boxes-role').each(function () {
 | 
			
		||||
        var $this = $(this);
 | 
			
		||||
        var role = $this.data('name');
 | 
			
		||||
        var $picker = $this.find('input.number-picker');
 | 
			
		||||
        $picker.attr('max', Math.max(0, nodes - used + roles[role]));
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function update_nodes($flavor, roles) {
 | 
			
		||||
      var role_names = Object.getOwnPropertyNames(roles);
 | 
			
		||||
      var count = 0;
 | 
			
		||||
      var role = 0;
 | 
			
		||||
      $flavor.find('div.boxes-nodes div.boxes-node').each(function () {
 | 
			
		||||
        var $this = $(this);
 | 
			
		||||
        $this.removeClass('boxes-role-controller boxes-role-compute boxes-role-cinder-storage boxes-role-swift-storage boxes-role-none');
 | 
			
		||||
        while (count >= roles[role_names[role]]) {
 | 
			
		||||
          role += 1;
 | 
			
		||||
          count = 0;
 | 
			
		||||
        }
 | 
			
		||||
        if (!role_names[role]) {
 | 
			
		||||
          $(this).html('free');
 | 
			
		||||
          $(this).addClass('boxes-role-none');
 | 
			
		||||
        } else {
 | 
			
		||||
          $this.addClass('boxes-role-' + role_names[role]).html(' ');
 | 
			
		||||
        }
 | 
			
		||||
        count += 1;
 | 
			
		||||
      });
 | 
			
		||||
      var free_nodes = $flavor.find('div.boxes-nodes div.boxes-role-none').length;
 | 
			
		||||
      $flavor.find('span.free-nodes').text(free_nodes);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function update_boxes() {
 | 
			
		||||
      $('div.boxes-flavor').each(function () {
 | 
			
		||||
          var $flavor = $(this);
 | 
			
		||||
          var roles = get_role_counts($flavor);
 | 
			
		||||
          update_nodes($flavor, roles);
 | 
			
		||||
          update_maximums($flavor, roles);
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $('div.boxes-role').draggable({
 | 
			
		||||
        revert: 'invalid',
 | 
			
		||||
        helper: 'clone',
 | 
			
		||||
@@ -82,7 +82,7 @@ tuskar.boxes = (function () {
 | 
			
		||||
          ui.draggable.find('input.boxes-flavor'
 | 
			
		||||
              ).val($(this).closest('.boxes-flavor').data('flavor'));
 | 
			
		||||
          $count.trigger('change');
 | 
			
		||||
          window.setTimeout(update_boxes, 0);
 | 
			
		||||
          window.setTimeout(module.update_boxes, 0);
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
    $('div.boxes-available-roles').droppable({
 | 
			
		||||
@@ -94,12 +94,12 @@ tuskar.boxes = (function () {
 | 
			
		||||
          ui.draggable.appendTo(this);
 | 
			
		||||
          ui.draggable.find('input.boxes-flavor').val('');
 | 
			
		||||
          ui.draggable.find('input.number-picker').trigger('change').val(0);
 | 
			
		||||
          window.setTimeout(update_boxes, 0);
 | 
			
		||||
          window.setTimeout(module.update_boxes, 0);
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    update_boxes();
 | 
			
		||||
    $('input.number-picker').change(update_boxes);
 | 
			
		||||
    module.update_boxes();
 | 
			
		||||
    $('input.number-picker').change(module.update_boxes);
 | 
			
		||||
 | 
			
		||||
    $('.boxes-roles-menu li a').click(function () {
 | 
			
		||||
        var name = $(this).data('role');
 | 
			
		||||
@@ -111,7 +111,7 @@ tuskar.boxes = (function () {
 | 
			
		||||
        if (+$count.val() < 1) { $count.val(1); }
 | 
			
		||||
        $flavor.val($drop.closest('.boxes-flavor').data('flavor'));
 | 
			
		||||
        $count.trigger('change');
 | 
			
		||||
        window.setTimeout(update_boxes, 0);
 | 
			
		||||
        window.setTimeout(module.update_boxes, 0);
 | 
			
		||||
    });
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,58 @@ horizon.addInitFunction(function () {
 | 
			
		||||
 | 
			
		||||
  module("Tuskar boxes (tuskar.boxes.js)");
 | 
			
		||||
 | 
			
		||||
  test("Passing test", function () {
 | 
			
		||||
    equal(1, 1);
 | 
			
		||||
  test("get_role_counts", function () {
 | 
			
		||||
    var $flavor = $($('div.boxes-flavor')[0]);
 | 
			
		||||
    var role_counts = tuskar.boxes.get_role_counts($flavor);
 | 
			
		||||
 | 
			
		||||
    deepEqual(role_counts, {
 | 
			
		||||
      "cinder-storage": 0,
 | 
			
		||||
      "compute": 1,
 | 
			
		||||
      "controller": 1,
 | 
			
		||||
      "swift-storage": 0
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  test("update_maximums", function () {
 | 
			
		||||
    var $flavor = $($('div.boxes-flavor')[0]);
 | 
			
		||||
    var role_counts = {
 | 
			
		||||
      "cinder-storage": 0,
 | 
			
		||||
      "compute": 2,
 | 
			
		||||
      "controller": 1,
 | 
			
		||||
      "swift-storage": 0
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    tuskar.boxes.update_maximums($flavor, role_counts, 4);
 | 
			
		||||
    equal($('div.boxes-role-cinder-storage input.number-picker').attr('max'), 1);
 | 
			
		||||
    equal($('div.boxes-role-compute input.number-picker').attr('max'), 3);
 | 
			
		||||
    equal($('div.boxes-role-controller input.number-picker').attr('max'), 2);
 | 
			
		||||
    equal($('div.boxes-role-swift-storage input.number-picker').attr('max'), 1);
 | 
			
		||||
    tuskar.boxes.update_maximums($flavor, role_counts, 2);
 | 
			
		||||
    equal($('div.boxes-role-cinder-storage input.number-picker').attr('max'), 0);
 | 
			
		||||
    equal($('div.boxes-role-compute input.number-picker').attr('max'), 1);
 | 
			
		||||
    equal($('div.boxes-role-controller input.number-picker').attr('max'), 0);
 | 
			
		||||
    equal($('div.boxes-role-swift-storage input.number-picker').attr('max'), 0);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  test("update_nodes", function() {
 | 
			
		||||
    var $flavor = $($('div.boxes-flavor')[0]);
 | 
			
		||||
    var role_counts = {
 | 
			
		||||
      "cinder-storage": 0,
 | 
			
		||||
      "compute": 2,
 | 
			
		||||
      "controller": 1,
 | 
			
		||||
      "swift-storage": 0
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    equal($('div.boxes-nodes div.boxes-role-').length, 2);
 | 
			
		||||
    equal($('div.boxes-nodes div.boxes-role-cinder-storage').length, 0);
 | 
			
		||||
    equal($('div.boxes-nodes div.boxes-role-compute').length, 1);
 | 
			
		||||
    equal($('div.boxes-nodes div.boxes-role-controller').length, 1);
 | 
			
		||||
    equal($('div.boxes-nodes div.boxes-role-swift-storage').length, 0);
 | 
			
		||||
    tuskar.boxes.update_nodes($flavor, role_counts);
 | 
			
		||||
    equal($('div.boxes-nodes div.boxes-role-none').length, 1);
 | 
			
		||||
    equal($('div.boxes-nodes div.boxes-role-cinder-storage').length, 0);
 | 
			
		||||
    equal($('div.boxes-nodes div.boxes-role-compute').length, 2);
 | 
			
		||||
    equal($('div.boxes-nodes div.boxes-role-controller').length, 1);
 | 
			
		||||
    equal($('div.boxes-nodes div.boxes-role-swift-storage').length, 0);
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -22,5 +22,57 @@
 | 
			
		||||
  <h2 id="qunit-userAgent"></h2>
 | 
			
		||||
  <ol id="qunit-tests"></ol>
 | 
			
		||||
  <div id="qunit-fixture">
 | 
			
		||||
 | 
			
		||||
    <div class="boxes-available-roles"></div>
 | 
			
		||||
 | 
			
		||||
    <div class="boxes-flavor" data-flavor="baremetal">
 | 
			
		||||
      <div class="row">
 | 
			
		||||
        <div class="col-md-9"><strong>Flavor:</strong> <i>baremetal</i> x86_64, 1 CPU, 4096MB RAM, 30GB Disk</div>
 | 
			
		||||
        <div class="col-md-3"><span class="pull-right">Free Nodes:<span class="free-nodes"></span> / 4 </span></div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="row">
 | 
			
		||||
        <div class="col-md-12"><div class="separator-line"></div></div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="row">
 | 
			
		||||
        <div class="col-xs-5"><div class="boxes-drop-roles">
 | 
			
		||||
            <div class="boxes-role-controller boxes-role" data-name="controller">
 | 
			
		||||
              <div class="row">
 | 
			
		||||
                <div class="col-xs-3 deploy-role-count"><input class="form-control number-picker" id="id_09c48fdc-ed80-4e9c-bc57-3c2783bf4dc0-count" min="1" name="09c48fdc-ed80-4e9c-bc57-3c2783bf4dc0-count" step="2" type="text" value="1" /><input class="boxes-flavor form-control" id="id_09c48fdc-ed80-4e9c-bc57-3c2783bf4dc0-flavor" name="09c48fdc-ed80-4e9c-bc57-3c2783bf4dc0-flavor" type="hidden" value="baremetal" /></div>
 | 
			
		||||
                <div class="col-xs-6 deploy-role-label"><div class="deployment-roles-label">Controller</div></div>
 | 
			
		||||
                <div class="col-xs-3 deploy-role-icon"><a name="role-edit-controller" href="/infrastructure/roles/09c48fdc-ed80-4e9c-bc57-3c2783bf4dc0/edit" class="btn"><b class="fa fa-lg fa-fw fa-pencil"></b></a></div>
 | 
			
		||||
              </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="boxes-role-swift-storage boxes-role" data-name="swift-storage" >
 | 
			
		||||
              <div class="row">
 | 
			
		||||
                <div class="col-xs-3 deploy-role-count"><input class="form-control number-picker" id="id_a2b6038e-d891-49f7-aeb7-a92dc38abca8-count" min="0" name="a2b6038e-d891-49f7-aeb7-a92dc38abca8-count" step="1" type="text" value="0" /><input class="boxes-flavor form-control" id="id_a2b6038e-d891-49f7-aeb7-a92dc38abca8-flavor" name="a2b6038e-d891-49f7-aeb7-a92dc38abca8-flavor" type="hidden" value="baremetal" /></div>
 | 
			
		||||
                <div class="col-xs-6 deploy-role-label"><div class="deployment-roles-label">Swift-Storage</div></div>
 | 
			
		||||
                <div class="col-xs-3 deploy-role-icon"><a name="role-edit-swift-storage" href="/infrastructure/roles/a2b6038e-d891-49f7-aeb7-a92dc38abca8/edit" class="btn"><b class="fa fa-lg fa-fw fa-pencil"></b></a></div>
 | 
			
		||||
              </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="boxes-role-compute boxes-role" data-name="compute" >
 | 
			
		||||
              <div class="row">
 | 
			
		||||
                <div class="col-xs-3 deploy-role-count"><input class="form-control number-picker" id="id_8c14fa61-8a62-4a6a-b43e-970769cf8aa2-count" min="1" name="8c14fa61-8a62-4a6a-b43e-970769cf8aa2-count" step="1" type="text" value="1" /><input class="boxes-flavor form-control" id="id_8c14fa61-8a62-4a6a-b43e-970769cf8aa2-flavor" name="8c14fa61-8a62-4a6a-b43e-970769cf8aa2-flavor" type="hidden" value="baremetal" /></div>
 | 
			
		||||
                <div class="col-xs-6 deploy-role-label"><div class="deployment-roles-label">Compute</div></div>
 | 
			
		||||
                <div class="col-xs-3 deploy-role-icon"><a name="role-edit-compute" href="/infrastructure/roles/8c14fa61-8a62-4a6a-b43e-970769cf8aa2/edit" class="btn"><b class="fa fa-lg fa-fw fa-pencil"></b></a></div>
 | 
			
		||||
              </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="boxes-role-cinder-storage boxes-role" data-name="cinder-storage" >
 | 
			
		||||
              <div class="row">
 | 
			
		||||
                <div class="col-xs-3 deploy-role-count"><input class="form-control number-picker" id="id_aa3f46c1-7f7b-4adc-8b06-bcb18254f93f-count" min="0" name="aa3f46c1-7f7b-4adc-8b06-bcb18254f93f-count" step="1" type="text" value="0" /><input class="boxes-flavor form-control" id="id_aa3f46c1-7f7b-4adc-8b06-bcb18254f93f-flavor" name="aa3f46c1-7f7b-4adc-8b06-bcb18254f93f-flavor" type="hidden" value="baremetal" /></div>
 | 
			
		||||
                <div class="col-xs-6 deploy-role-label"><div class="deployment-roles-label">Cinder-Storage</div></div>
 | 
			
		||||
                <div class="col-xs-3 deploy-role-icon"><a name="role-edit-cinder-storage" href="/infrastructure/roles/aa3f46c1-7f7b-4adc-8b06-bcb18254f93f/edit" class="btn"><b class="fa fa-lg fa-fw fa-pencil"></b></a></div>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="btn-group boxes-drop-group"></div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="boxes-nodes col-xs-7">
 | 
			
		||||
        <div class="boxes-node boxes-role-" data-toggle="popover" title="Free node" data-content="<dl><dt>Node UUID</dt><dd>a085de77-b2ee-4876-9c90-e5d6cc8ade77</dd><dt>Architecture</dt><dd>x86_64</dd><dt>CPUs</dt><dd>1</dt><dt>RAM (MB)</dt><dd>4096</dd><dt>HDD (GB)</dt><dd>40</dd></dl>"><i class="fa fa-lg fa-minus"></i></div>
 | 
			
		||||
        <div class="boxes-node boxes-role-" data-toggle="popover" title="Free node" data-content="<dl><dt>Node UUID</dt><dd>5470033e-1c2a-4c5c-90c7-7d96da56ba61</dd><dt>Architecture</dt><dd>x86_64</dd><dt>CPUs</dt><dd>1</dt><dt>RAM (MB)</dt><dd>4096</dd><dt>HDD (GB)</dt><dd>40</dd></dl>"><i class="fa fa-lg fa-minus"></i></div>
 | 
			
		||||
        <div class="boxes-node boxes-role-compute" data-toggle="popover" title="Compute node" data-content="<dl><dt>Node UUID</dt><dd>d783b2e4-059e-4e2b-a1d1-21b3d1a7dab6</dd><dt>Architecture</dt><dd>x86_64</dd><dt>CPUs</dt><dd>1</dt><dt>RAM (MB)</dt><dd>4096</dd><dt>HDD (GB)</dt><dd>40</dd></dl>"><i class="fa fa-lg fa-check"></i></div>
 | 
			
		||||
        <div class="boxes-node boxes-role-controller" data-toggle="popover" title="Controller node" data-content="<dl><dt>Node UUID</dt><dd>9262d80e-7a25-4ded-abca-3261a77dbae1</dd><dt>Architecture</dt><dd>x86_64</dd><dt>CPUs</dt><dd>1</dt><dt>RAM (MB)</dt><dd>4096</dd><dt>HDD (GB)</dt><dd>40</dd></dl>"><i class="fa fa-lg fa-check"></i></div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</body></html>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user