/**
* MUI test angular input module
* @module test/angular-tests/test-input
*/
import assert from 'assert';
let helpers = require('./angular-helper'),
ngModule = helpers.module,
inject = helpers.inject,
jqLite = helpers.jqLite,
util = helpers.util;
require('../../src/angular/input.js');
describe('angular/input', function() {
let $compile,
$rootScope,
scope;
beforeEach(ngModule('mui.input'));
beforeEach(inject(function(_$compile_, _$rootScope_) {
// cache references
$compile = _$compile_;
$rootScope = _$rootScope_;
// initialize scope for convenience
scope = $rootScope.$new();
}));
afterEach(function() {
scope.$destroy();
});
it('renders properly', function() {
let s = '';
let wrapperEl = $compile(s)(scope)[0];
scope.$digest();
// check wrapper
assert.equal(wrapperEl.tagName, 'DIV');
assert.equal(jqLite.hasClass(wrapperEl, 'mui-textfield'), true);
assert.equal(wrapperEl.children.length, 2);
// check inner
let inputEl = wrapperEl.children[0];
assert.equal(inputEl.tagName, 'INPUT');
assert.equal(inputEl._muiTextfield, true);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-empty'), true);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-pristine'), true);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-untouched'), true);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-dirty'), false);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-touched'), false);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-not-empty'), false);
// check label
let labelEl = wrapperEl.children[1];
assert.equal(labelEl.tagName, 'LABEL');
});
it('handles ng-model attribute properly', function() {
let s, wrapperEl, inputEl;
scope = $rootScope.$new();
scope.myModel = 'myvalue';
s = '';
wrapperEl = $compile(s)(scope)[0];
inputEl = wrapperEl.children[0];
scope.$digest();
// check initial value
assert.equal(inputEl.value, 'myvalue');
});
it('attaches name attribute to inner input element', function() {
let s = '';
let inputEl = $compile(s)(scope)[0].children[0];
scope.$digest();
// check name attribute
assert.equal(inputEl.hasAttribute('name'), true);
assert.equal(inputEl.getAttribute('name'), 'myvar');
});
it('attaches ng-maxlength and ng-maxlength to inner element', function() {
let s = '';
let inputEl = $compile(s)(scope)[0].children[0];
scope.$digest();
// check that attributes are added to inner element
assert.equal(inputEl.getAttribute('ng-maxlength'), "8");
assert.equal(inputEl.getAttribute('ng-minlength'), "2");
});
describe('empty/not-empty class handling', function() {
let s, wrapperEl, inputEl;
it('has class `mui--is-empty` on init when input empty', function() {
scope = $rootScope.$new();
s = '';
wrapperEl = $compile(s)(scope)[0];
inputEl = wrapperEl.children[0];
scope.$digest();
assert.equal(jqLite.hasClass(inputEl, 'mui--is-empty'), true);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-not-empty'), false);
});
it('has class `mui--is-not-empty` on init when input not empty', function() {
scope = $rootScope.$new();
scope.myModel = 'myvalue';
s = '';
wrapperEl = $compile(s)(scope)[0];
inputEl = wrapperEl.children[0];
scope.$digest();
assert.equal(jqLite.hasClass(inputEl, 'mui--is-empty'), false);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-not-empty'), true);
});
it('modifies classes after after `input` event', function() {
scope = $rootScope.$new();
s = '';
wrapperEl = $compile(s)(scope)[0];
inputEl = wrapperEl.children[0];
scope.$digest();
// check classes
assert.equal(jqLite.hasClass(inputEl, 'mui--is-empty'), true);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-not-empty'), false);
// change value and trigger `input` event
inputEl.value = 'myval';
util.dispatchEvent(inputEl, 'input');
// check classes
assert.equal(jqLite.hasClass(inputEl, 'mui--is-empty'), false);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-not-empty'), true);
// remove data and trigger `input` event
inputEl.value = '';
util.dispatchEvent(inputEl, 'input');
// check classes
assert.equal(jqLite.hasClass(inputEl, 'mui--is-empty'), true);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-not-empty'), false);
});
it('modifies classes after `change` event', function() {
scope = $rootScope.$new();
s = '';
wrapperEl = $compile(s)(scope)[0];
inputEl = wrapperEl.children[0];
scope.$digest();
// check classes
assert.equal(jqLite.hasClass(inputEl, 'mui--is-empty'), true);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-not-empty'), false);
// change value and trigger `change` event
inputEl.value = 'myval';
util.dispatchEvent(inputEl, 'change');
// check classes
assert.equal(jqLite.hasClass(inputEl, 'mui--is-empty'), false);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-not-empty'), true);
// remove data and trigger `change` event
inputEl.value = '';
util.dispatchEvent(inputEl, 'change');
// check classes
assert.equal(jqLite.hasClass(inputEl, 'mui--is-empty'), true);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-not-empty'), false);
});
});
describe('touched/untouched class handling', function() {
let s, wrapperEl, inputEl;
it('has class `mui--is-untouched` on init', function() {
// initialize as empty
scope = $rootScope.$new();
s = '';
wrapperEl = $compile(s)(scope)[0];
inputEl = wrapperEl.children[0];
scope.$digest();
// check classes
assert.equal(jqLite.hasClass(inputEl, 'mui--is-untouched'), true);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-touched'), false);
// initialize as not empty
scope = $rootScope.$new();
scope.myModel = 'myvalue';
s = '';
wrapperEl = $compile(s)(scope)[0];
inputEl = wrapperEl.children[0];
scope.$digest();
// check classes
assert.equal(jqLite.hasClass(inputEl, 'mui--is-untouched'), true);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-touched'), false);
});
it('sets class to `mui--is-touched` on `blur` event', function() {
scope = $rootScope.$new();
s = '';
wrapperEl = $compile(s)(scope)[0];
inputEl = wrapperEl.children[0];
scope.$digest();
// blur event
util.dispatchEvent(inputEl, 'blur');
// check after
assert.equal(jqLite.hasClass(inputEl, 'mui--is-untouched'), false);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-touched'), true);
});
});
describe('pristine/dirty class handling', function() {
let s, wrapperEl, inputEl;
it('has class `mui--is-pristine` on init', function() {
// empty
scope = $rootScope.$new();
s = '';
wrapperEl = $compile(s)(scope)[0];
inputEl = wrapperEl.children[0];
scope.$digest();
// check initial classes
assert.equal(jqLite.hasClass(inputEl, 'mui--is-pristine'), true);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-dirty'), false);
// not empty
scope = $rootScope.$new();
scope.myModel = 'myvalue';
s = '';
wrapperEl = $compile(s)(scope)[0];
inputEl = wrapperEl.children[0];
scope.$digest();
// check initial classes
assert.equal(jqLite.hasClass(inputEl, 'mui--is-pristine'), true);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-dirty'), false);
});
it('sets class to `mui--is-dirty` on `change` event', function() {
scope = $rootScope.$new();
s = '';
wrapperEl = $compile(s)(scope)[0];
inputEl = wrapperEl.children[0];
scope.$digest();
// trigger change event
util.dispatchEvent(inputEl, 'change');
// check initial classes
assert.equal(jqLite.hasClass(inputEl, 'mui--is-pristine'), false);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-dirty'), true);
});
it('sets class to `mui--is-dirty` on `input` event', function() {
scope = $rootScope.$new();
s = '';
wrapperEl = $compile(s)(scope)[0];
inputEl = wrapperEl.children[0];
scope.$digest();
// trigger change event
util.dispatchEvent(inputEl, 'input');
// check initial classes
assert.equal(jqLite.hasClass(inputEl, 'mui--is-pristine'), false);
assert.equal(jqLite.hasClass(inputEl, 'mui--is-dirty'), true);
});
});
});