{"size": 7328, "ext": "js", "max_stars_repo_path": "horizon/static/framework/widgets/metadata-tree/metadata-tree.spec.js", "max_stars_repo_name": "Hodorable/0602", "max_stars_repo_stars_event_min_datetime": null, "max_stars_repo_stars_event_max_datetime": null, "max_issues_repo_path": "horizon/static/framework/widgets/metadata-tree/metadata-tree.spec.js", "max_issues_repo_name": "Hodorable/0602", "max_issues_repo_issues_event_min_datetime": null, "max_issues_repo_issues_event_max_datetime": null, "max_forks_repo_path": "horizon/static/framework/widgets/metadata-tree/metadata-tree.spec.js", "max_forks_repo_name": "Hodorable/0602", "max_forks_repo_forks_event_min_datetime": null, "max_forks_repo_forks_event_max_datetime": null}
{"max_stars_count": null, "max_issues_count": null, "max_forks_count": null, "avg_line_length": 38.5684210526, "max_line_length": 118, "alphanum_fraction": 0.5272925764}
(function(){
  'use strict';

  describe('horizon.framework.widgets.metadata-tree module', function() {
    it('should have been defined', function () {
      expect(angular.module('horizon.framework.widgets.metadata-tree')).toBeDefined();
    });

    var namespaces = [
      {
        "display_name": "Test Namespace A",
        "description": "Test namespace description",
        "properties": {
          "test:A:1": {
            "title": "Test A.1 - string",
            "type": "string",
            "default": "foo",
            "enum": [
              "option-1", "option-2", "option-3"
            ]
          },
          "test:A:2": {
            "title": "Test A.2 - integer",
            "type": "integer",
            "default": "1",
            "minimum": 0,
            "maximum": 10
          },
          "test:A:3": {
            "title": "Test A.3 - number",
            "type": "number",
            "default": "1.1",
            "minimum": 0,
            "maximum": 10
          },
          "test:A:4": {
            "title": "Test A.4 - boolean",
            "type": "boolean",
            "default": "True"
          },
          "test:A:5": {
            "title": "Test A.5 - boolean",
            "type": "boolean",
            "default": "false"
          },
          "test:A:6": {
            "title": "Test A.6 - array",
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "val-1", "val-2", "val-3", "val-4"
              ]
            },
            "default": "<in> val-2,val-3"
          }
        }
      },
      {
        "display_name": "Test Namespace B",
        "description": "Test namespace description",
        "objects": [
          {
            "name": "Test Object A",
            "description": "Test object description",
            "properties": {
              "test:B:A:1": {
                "title": "Test B.A.1",
                "description": "Test description"
              },
              "test:B:A:2": {}
            }
          },
          {
            "name": "Test Object B",
            "description": "Test object description",
            "properties": {
              "test:B:B:1": {},
              "test:B:B:2": {}
            }
          }
        ]
      }
    ];

    describe('directives', function () {
      var $scope, $element;

      beforeEach(module('templates'));
      beforeEach(module('horizon.framework'));
      beforeEach(module('horizon.framework.widgets'));
      beforeEach(module('horizon.framework.widgets.metadata-tree'));

      describe('hzMetadataTree directive', function() {
        beforeEach(inject(function ($injector) {
          var $compile = $injector.get('$compile');
          $scope = $injector.get('$rootScope').$new();

          $scope.available = namespaces;
          $scope.existing = {'test:B:A:1':'foo'};

          var markup =
            '<hz-metadata-tree available="available" existing="existing"></hz-metadata-tree>';

          $element = angular.element(markup);
          $compile($element)($scope);
          $scope.$digest();
        }));

        it('should have 2 rows in available list', function() {
          expect($element.find('ul.list-group:first li[ng-repeat]').length).toBe(2);
        });

        it('should have 1 row in existing list', function() {
          expect($element.find('ul.list-group:last li[ng-repeat]').length).toBe(1);
          expect($element.find('ul.list-group:last li[ng-repeat]:first').scope().item.leaf.name).toBe('test:B:A:1');
          expect($element.find('ul.list-group:last li[ng-repeat]:first').scope().item.leaf.value).toBe('foo');
        });

        it('should have 10 rows in available list when expanded items', function() {
          $element.find('ul.list-group:first li[ng-repeat]:first').trigger('click');
          $element.find('ul.list-group:first li[ng-repeat]:last').trigger('click');
          expect($element.find('ul.list-group:first li[ng-repeat]').length).toBe(10);
        });

        it('should remove item from available and add it in existing list when added', function() {
          $element.find('ul.list-group:first li[ng-repeat]:last').trigger('click');
          $element.find('ul.list-group:first li[ng-repeat]:last').trigger('click');
          expect($element.find('ul.list-group:first li[ng-repeat]').length).toBe(6);
          $element.find('ul.list-group:first li[ng-repeat]:last .btn').trigger('click');
          expect($element.find('ul.list-group:first li[ng-repeat]').length).toBe(5);
          expect($element.find('ul.list-group:last li[ng-repeat]').length).toBe(2);
          expect($element.find('ul.list-group:last li[ng-repeat].active').scope().item.leaf.name).toBe('test:B:B:2');
        });

        it('should add item to available and remove it from existing list when removed', function() {
          $element.find('ul.list-group:last li[ng-repeat]:first .btn').trigger('click');
          expect($element.find('ul.list-group:first li[ng-repeat]').length).toBe(6);
          expect($element.find('ul.list-group:last li[ng-repeat]').length).toBe(0);
          expect($element.find('ul.list-group:first li[ng-repeat].active').scope().item.leaf.name).toBe('test:B:A:1');
        });

        it('should add custom item to existing list', function() {
          $element.find('ul.list-group:first li:first input').val('custom').trigger('input');
          $element.find('ul.list-group:first li:first .btn').trigger('click');
          expect($element.find('ul.list-group:last li[ng-repeat]').length).toBe(2);
          expect($element.find('ul.list-group:last li[ng-repeat].active').scope().item.leaf.name).toBe('custom');
        });
      });

      describe('hzMetadataTreeItem directive', function() {
        var $scope, $element, item;

        beforeEach(inject(function ($injector) {
          var $compile = $injector.get('$compile');
          $scope = $injector.get('$rootScope').$new();

          item = new ($injector.get('horizon.framework.widgets.metadata-tree.service').Item)();
          $scope.item = item.fromProperty('test', namespaces[0].properties['test:A:6']);

          var markup =
          '<hz-metadata-tree-item item="item" text="text" action=""></hz-metadata-tree-item>';

          $element = angular.element(markup);
          $compile($element)($scope);
          $scope.$digest();
        }));

        it('should have additional methods for array ', function () {
          expect($element.isolateScope().opened).toBe(false);
          expect($element.isolateScope().add).toBeDefined();
          expect($element.isolateScope().remove).toBeDefined();
          expect($element.isolateScope().open).toBeDefined();
        });

        it('should add values to array ', function () {
          $element.find('.options li:last').trigger('click');
          expect(item.leaf.getValue()).toBe('<in> val-2,val-3,val-4');
          $element.find('.options li:first').trigger('click');
          expect(item.leaf.getValue()).toBe('<in> val-1,val-2,val-3,val-4');
        });

        it('should remove value from array ', function () {
          $element.find('.values .label:first').trigger('click');
          expect(item.leaf.getValue()).toBe('<in> val-3');
        });
      });
    });
  });
})();