form-js
Version:
Create better ui form elements. Supports IE9+, all modern browsers, and mobile.
228 lines (212 loc) • 11.8 kB
JavaScript
"use strict";
var Sinon = require('sinon');
var QUnit = require('qunit');
var TestUtils = require('test-utils');
var TextArea = require('../src/text-area');
module.exports = (function () {
QUnit.module('Text Area');
QUnit.test('initializing injects element under a parent node', function() {
QUnit.expect(1);
var html = '<div><textarea></textarea></div>';
var container = TestUtils.createHtmlElement(html);
document.getElementById('qunit-fixture').appendChild(container);
var textareaEl = container.getElementsByTagName('textarea')[0];
var instance = new TextArea({el: textareaEl});
QUnit.ok(container.childNodes[0].childNodes[0].isEqualNode(textareaEl));
instance.destroy();
});
QUnit.test('destroying places the element back under its original parent', function() {
QUnit.expect(1);
var html = '<div><textarea></textarea></div>';
var container = TestUtils.createHtmlElement(html);
document.getElementById('qunit-fixture').appendChild(container);
var textareaEl = container.getElementsByTagName('textarea')[0];
var instance = new TextArea({el: textareaEl});
instance.destroy();
QUnit.equal(textareaEl.parentNode, container, 'after destroy, input element\'s parent node is back to original');
});
QUnit.test('should add the active class to the built container when focusing on element and remove it when blurring', function() {
QUnit.expect(3);
var html = '<div><textarea></textarea></div>';
var wrapper = TestUtils.createHtmlElement(html);
document.getElementById('qunit-fixture').appendChild(wrapper);
var textareaEl = wrapper.getElementsByTagName('textarea')[0];
var activeClass = 'ta-active';
var containerClass = 'ta-container';
var instance = new TextArea({
el: textareaEl,
activeClass: activeClass,
containerClass: containerClass
});
var container = wrapper.getElementsByClassName(containerClass)[0];
QUnit.ok(!container.classList.contains(activeClass), 'container has active class initially');
textareaEl.dispatchEvent(TestUtils.createEvent('focus'));
QUnit.ok(container.classList.contains(activeClass), 'container has active class after focus');
textareaEl.dispatchEvent(TestUtils.createEvent('blur'));
QUnit.ok(!container.classList.contains(activeClass), 'container no longer has active class after it loses focus');
instance.destroy();
});
QUnit.test('should fire onChange callback when changing to a new value via setValue()', function() {
QUnit.expect(8);
var fixture = document.getElementById('qunit-fixture');
var textareaEl = TestUtils.createHtmlElement('<textarea></textarea>');
fixture.appendChild(textareaEl);
var onChangeSpy = Sinon.spy();
var containerClass = 'my-container';
var instance = new TextArea({el: textareaEl, onChange: onChangeSpy, containerClass: containerClass});
var container = fixture.getElementsByClassName(containerClass)[0];
QUnit.equal(textareaEl.value, '', 'input value is empty initially');
QUnit.equal(onChangeSpy.callCount, 0, 'onChange callback was NOT fired yet');
textareaEl.focus();
var abra = 'abrahkadabraaa!';
instance.setValue(abra);
QUnit.equal(textareaEl.value, abra, 'setting a custom value to input reflects that new input value');
QUnit.deepEqual(onChangeSpy.args[0][0], textareaEl.value, 'onChange callback was fired with value of textarea as first arg');
QUnit.deepEqual(onChangeSpy.args[0][1], textareaEl, 'onChange callback was fired with text area element as second arg');
QUnit.deepEqual(onChangeSpy.args[0][2], container, 'onChange callback was fired the container as the third arg');
textareaEl.blur();
QUnit.equal(textareaEl.value, abra, 'input value still has custom value after input blur');
QUnit.equal(onChangeSpy.callCount, 1, 'onChange callback was NOT fired');
instance.destroy();
});
QUnit.test('initial value is restored upon destruction even after a new one was set', function() {
QUnit.expect(3);
var fixture = document.getElementById('qunit-fixture');
var textareaEl = TestUtils.createHtmlElement('<textarea></textarea>');
fixture.appendChild(textareaEl);
var origValue = 'testy';
textareaEl.value = origValue; // add custom value before initialization
var instance = new TextArea({el: textareaEl});
QUnit.equal(textareaEl.value, origValue, 'input has its initial value');
var testValue2 = 'new testy';
textareaEl.value = testValue2;
QUnit.equal(textareaEl.value, testValue2, 'input has been set successfully');
instance.destroy();
QUnit.equal(textareaEl.value, origValue, 'after destroy, input returns the value that it was set to originally');
});
QUnit.test('enable() should set element\'s disabled boolean to true and disable() should make it false', function () {
QUnit.expect(3);
var fixture = document.getElementById('qunit-fixture');
var textareaEl = TestUtils.createHtmlElement('<textarea></textarea>');
fixture.appendChild(textareaEl);
var instance = new TextArea({el: textareaEl});
QUnit.ok(!textareaEl.disabled, 'disabled boolean returns falsy');
instance.disable();
QUnit.ok(textareaEl.disabled, 'disabled boolean returns truthy');
instance.enable();
QUnit.ok(!textareaEl.disabled, 'disabled boolean returns falsy');
instance.destroy();
});
QUnit.test('enable() should add disabled class to container and disable() should remove it', function () {
QUnit.expect(3);
var fixture = document.getElementById('qunit-fixture');
var textareaEl = TestUtils.createHtmlElement('<textarea></textarea>');
fixture.appendChild(textareaEl);
var disabledClass = 'text-disabled';
var containerClass = 'text-wrapper';
var instance = new TextArea({
el: textareaEl,
disabledClass: disabledClass,
containerClass: containerClass
});
var containerEl = fixture.getElementsByClassName(containerClass)[0];
QUnit.ok(!containerEl.classList.contains(disabledClass), 'does not have active class initially');
instance.disable();
QUnit.ok(containerEl.classList.contains(disabledClass), 'has correct disabled class after disable()');
instance.enable();
QUnit.ok(!containerEl.classList.contains(disabledClass), 'does not have disabled class after enable()');
instance.destroy();
});
QUnit.test('should add disabled class to container if textarea element originally has a disabled property set to true', function() {
QUnit.expect(4);
var fixture = document.getElementById('qunit-fixture');
var textareaEl = TestUtils.createHtmlElement('<textarea></textarea>');
fixture.appendChild(textareaEl);
var disabledClass = 'text-disabled';
var containerClass = 'text-wrapper';
textareaEl.setAttribute('disabled', 'true'); // make it so that textarea is disabled initially
var instance = new TextArea({
el: textareaEl,
disabledClass: disabledClass,
containerClass: containerClass
});
var containerEl = fixture.getElementsByClassName(containerClass)[0];
QUnit.ok(textareaEl.disabled, 'textarea is disabled initially');
QUnit.ok(containerEl.classList.contains(disabledClass), 'container has disabled class initially because original input was disabled initially');
instance.enable();
QUnit.ok(!containerEl.classList.contains(disabledClass), 'when enabling, ui element\'s disabled class is removed');
instance.destroy();
QUnit.ok(textareaEl.disabled, 'input disabled boolean returns true because that\'s how it was initially');
});
QUnit.test('setAttribute() should NOT be called when textarea is disabled before initialize', function() {
QUnit.expect(2);
var fixture = document.getElementById('qunit-fixture');
var textareaEl = TestUtils.createHtmlElement('<textarea></textarea>');
fixture.appendChild(textareaEl);
var disabledClass = 'text-disabled';
var containerClass = 'text-wrapper';
// make it so that textarea is disabled initially
textareaEl.setAttribute('disabled', 'true');
var setAttrSpy = Sinon.spy(textareaEl, 'setAttribute');
var instance = new TextArea({
el: textareaEl,
disabledClass: disabledClass,
containerClass: containerClass
});
QUnit.ok(textareaEl.disabled, 'textarea is disabled initially');
QUnit.equal(setAttrSpy.callCount, 0, 'setAttribute was NOT called to ensure no unnecessary change events are fired');
instance.destroy();
setAttrSpy.restore();
});
QUnit.asyncTest('onKeyDownChange event should fire with new value after the textarea value has been changed', function() {
QUnit.expect(2);
var fixture = document.getElementById('qunit-fixture');
var textareaEl = TestUtils.createHtmlElement('<textarea></textarea>');
fixture.appendChild(textareaEl);
var containerClass = 'text-wrapper';
var onChangeSpy = Sinon.spy();
var instance = new TextArea({
el: textareaEl,
onKeyDownChange: onChangeSpy,
containerClass: containerClass
});
var containerEl = fixture.getElementsByClassName(containerClass)[0];
var testValue = 'aha';
textareaEl.value = testValue;
// trigger keydown event
var keydownEvent = document.createEvent('HTMLEvents');
keydownEvent.initEvent('keydown', false, true);
textareaEl.dispatchEvent(keydownEvent);
var newTestValue = testValue + '!';
textareaEl.value = newTestValue; // reflect new character change in input field
setTimeout(function () {
QUnit.deepEqual(onChangeSpy.args[0], [textareaEl, containerEl, keydownEvent], 'after 2 milliseconds of a new character change in the input field, onKeyDownChange callback was fired with correct args');
QUnit.equal(instance.getValue(), newTestValue, 'getValue() returns new value');
instance.destroy();
QUnit.start();
},2);
});
QUnit.test('should clear the textarea value to empty string when clear() is called', function() {
QUnit.expect(2);
var fixture = document.getElementById('qunit-fixture');
var textareaEl = TestUtils.createHtmlElement('<textarea></textarea>');
fixture.appendChild(textareaEl);
var instance = new TextArea({el: textareaEl});
var newValue = 'myNewValue';
instance.setValue(newValue);
QUnit.equal(textareaEl.value, newValue, 'input value has been changed');
instance.clear();
QUnit.equal(textareaEl.value, '', 'input value was cleared after clear()');
instance.destroy();
});
QUnit.test('should set the element\'s value to the value passed in the initialize options', function() {
QUnit.expect(1);
var fixture = document.getElementById('qunit-fixture');
var textareaEl = TestUtils.createHtmlElement('<textarea></textarea>');
fixture.appendChild(textareaEl);
var myValue = 'testy';
var instance = new TextArea({el: textareaEl, value: myValue});
QUnit.equal(textareaEl.value, myValue);
instance.destroy();
});
})();