netceteragroup/valdr

View on GitHub
src/core/valdrFormGroup-directive.spec.js

Summary

Maintainability
A
0 mins
Test Coverage
describe('valdrFormGroup directive', function () {

  // VARIABLES

  var $scope, $compile, element, valdr, valdrClasses, valdrConfig, ngModelController,
    personConstraints = {
      'Person': {
        'firstName': {
          'size': {
            'min': 0,
            'max': 10,
            'message': 'size'
          }
        },
        'lastName': {
          'size': {
            'min': 0,
            'max': 10,
            'message': 'size'
          }
        }
      }
    };

  var formGroupTemplate =
      '<form valdr-type="Person" valdr-form-group>' +
        '<input type="text" name="firstName" valdr-no-message ng-model="person.firstName">' +
        '<input type="text" name="lastName" valdr-no-message  ng-model="person.lastName">' +
      '</form>';

  // TEST UTILITIES

  function compileTemplate(template) {
    element = $compile(angular.element(template))($scope);
    $scope.$digest();
  }

  function compileFormGroupTemplate() {
    compileTemplate(formGroupTemplate);
    ngModelController = element.find('input').controller('ngModel');
  }

  beforeEach(function () {
    module('valdr');
  });

  beforeEach(inject(function ($rootScope, _$compile_, _valdr_, _valdrClasses_, _valdrConfig_) {
    $compile = _$compile_;
    valdr = _valdr_;
    valdrClasses = _valdrClasses_;
    valdrConfig = _valdrConfig_;

    $scope = $rootScope.$new();
    $scope.person = { };
    valdr.addConstraints(personConstraints);
  }));


  describe('valdrFormGroup', function () {

    beforeEach(function () {
      compileFormGroupTemplate();
    });

    describe('form-group class', function () {

      it ('should add form group class by default', function () {
        expect(element.hasClass(valdrClasses.formGroup)).toBe(true);
      });

      it ('should not add form group class if option is disabled in valdrConfig', function () {
        // given
        valdrConfig.addFormGroupClass = false;

        // when
        compileFormGroupTemplate();

        // then
        expect(element.hasClass(valdrClasses.formGroup)).toBe(false);
      });

    });

    it('should not set valid and invalidDirtyTouchedGroup classes if all items are valid', function () {
      expect(element.hasClass(valdrClasses.valid)).toBe(true);
      expect(element.hasClass(valdrClasses.invalid)).toBe(false);
      expect(element.hasClass(valdrClasses.invalidDirtyTouchedGroup)).toBe(false);
    });

    it('should not set invalid class if an item is not valid', function () {
      // given
      $scope.person.firstName = 'This name is too long for the constraints.';

      // when
      $scope.$digest();

      // then
      expect(element.hasClass(valdrClasses.invalid)).toBe(true);
      expect(element.hasClass(valdrClasses.valid)).toBe(false);
      expect(element.hasClass(valdrClasses.invalidDirtyTouchedGroup)).toBe(false);
    });

    it('should add invalidDirtyTouchedGroup class if an input is dirty, touched and invalid', function () {
      // given
      $scope.person.firstName = 'This name is too long for the constraints.';
      ngModelController.$invalid = true;
      ngModelController.$dirty = true;
      ngModelController.$touched = true;

      // when
      $scope.$digest();

      // then
      expect(element.hasClass(valdrClasses.invalid)).toBe(true);
      expect(element.hasClass(valdrClasses.valid)).toBe(false);
      expect(element.hasClass(valdrClasses.invalidDirtyTouchedGroup)).toBe(true);
    });

    it('should be valid if no form items are registered', function () {
      // given
      var template = '<form valdr-type="Person" valdr-form-group></form>';

      // when
      compileTemplate(template);

      // then
      expect(element.hasClass(valdrClasses.valid)).toBe(true);
      expect(element.hasClass(valdrClasses.invalid)).toBe(false);
      expect(element.hasClass(valdrClasses.invalidDirtyTouchedGroup)).toBe(false);
    });
  });

});