Manual Reference Source Test

tests/formelement.spec.js

import {Q, Element} from 'index';
import ObjectArray from 'dot-object-array';

/**
*  @test {FormElement}
*/
describe('FormElement', function () {
  /**
  *  @test {FormElement#constructor}
  */
  describe('Constructor', function () {
    it('should return and empty FormElement', function () {
      let f = new Element('form');

      f.node.nodeName.should.equal('FORM');
      f.node.method.should.equal('get');
    });

    it('should return a FormElement with Element method attribute set to post', function () {
      let f = new Element('form', {method: 'post'});

      f.node.nodeName.should.equal('FORM');
      f.node.method.should.equal('post');
    });
  });

  /**
  *  @test {FormElement#field}
  *  @test {FormElement#fields}
  */
  describe('Fields access', function () {
    it('should find a field, even if the name is already used elsewhere', function () {
      let f = new Element('form');
      let fake = Q('+<input type="text" name="fixture1" value="fixtureFake">');

      f.append('<input type="text" name="fixture1" value="fixture1">');
      Q('body').append(f).append(fake);

      f.field('fixture1').length.should.equal(1);
      f.field('fixture1').value.should.equal('fixture1');

      f.remove();
      fake.remove();
    });

    it('should return a collection of fields of the form', function () {
      let f = new Element('form');
      let fake = Q('+<input type="text" name="fixture1" value="fixtureFake">');

      f.append('<input type="text" name="fixture1" value="fixture1">');
      f.append('<input type="text" name="fixture2" value="fixture2">');
      Q('body').append(f).append(fake);

      f.fields.length.should.equal(2);
      f.fields.elements[0].value.should.equal('fixture1');
      f.fields.elements[1].value.should.equal('fixture2');

      f.remove();
      fake.remove();
    });

    it('should return a collection of fields and ignore fields with class form-ignore', function () {
      let f = new Element('form');

      f.append('<input type="text" name="fixture1" value="fixture1">');
      f.append('<input type="text" name="fixture2" value="fixture2">');
      f.append('<input type="text" class="form-ignore" name="fixture3" value="fixture3">');
      Q('body').append(f);

      f.fields.length.should.equal(2);
      f.fields.elements[0].value.should.equal('fixture1');
      f.fields.elements[1].value.should.equal('fixture2');

      f.remove();
    });
  });

  /**
  *  @test {FormElement#dirty}
  */
  describe('Dirty', function () {
    it('should return false if no field changed', function () {
      let f = new Element('form');

      f.append('<input type="text" name="fixture1" value="fixture1">');
      f.dirty.should.be.false;
    });
    it('should return true if field changed', function () {
      let f = new Element('form');

      f.append('<input type="text" name="fixture1" value="fixture1">');
      f.field('fixture1').value = 'fixtureX';
      f.dirty.should.be.true;
    });
  });

  /**
  *  @test {FormElement#validate}
  *  @test {FormElement.errors}
  */
  describe('Validate', function () {
    it('should validate', function () {
      let f = new Element('form');
      let i = new Element('input', {required: 'required'});

      f.append(i);
      f.validate().should.be.false;
      i.hasClass('field-not-validate').should.be.true;
      i.hasClass('field-validate').should.be.false;
      f._errors.length().should.equal(1);
      i.value = 'a';
      f.validate().should.be.true;
      i.hasClass('field-not-validate').should.be.false;
      i.hasClass('field-validate').should.be.true;
    });
  });

  /**
  *  @test {FormElement.data}
  *  @test {FormElement.urlEncode}
  *  @test {FormElement.formUrlEncode}
  *  @test {FormElement.formData}
  *  @test {FormElement.json}
  */
  describe('Data export and import', function () {
    it('should export data to ObjectArray', function () {
      let f = new Element('form');

      f.append('<input type="text" name="f1" value="fixture1">');
      f.append('<input type="text" name="f2" value="fixture2">');
      f.datas.should.be.instanceof(ObjectArray);
      f.datas.data.should.eql({f1: 'fixture1', f2: 'fixture2'});
    });

    it('should export data to ObjectArray with dotted keys', function () {
      let f = new Element('form');

      f.append('<input type="text" name="fixture.f1" value="fixture1">');
      f.append('<input type="text" name="fixture.f2" value="fixture2">');
      f.datas.should.be.instanceof(ObjectArray);
      f.datas.data.should.eql({fixture: {f1: 'fixture1', f2: 'fixture2'}});
    });

    it('should export data to JSON', function () {
      let f = new Element('form');

      f.append('<input type="text" name="f1" value="fixture1">');
      f.append('<input type="text" name="f2" value="fixture2">');
      f.json.should.equal('{"f1":"fixture1","f2":"fixture2"}');
    });

    it('should export data to JSON with dotted keys', function () {
      let f = new Element('form');

      f.append('<input type="text" name="fixture.f1" value="fixture1">');
      f.append('<input type="text" name="fixture.f2" value="fixture2">');
      f.json.should.equal('{"fixture":{"f1":"fixture1","f2":"fixture2"}}');
    });

    it('should export data to urlEncode string', function () {
      let f = new Element('form');

      f.append('<input type="text" name="f1" value="fixture1">');
      f.append('<input type="text" name="f2" value="fixture2 space">');
      f.urlEncode.should.equal('f1=fixture1&f2=fixture2%20space');
    });

    it('should export data to formUrlEncode string', function () {
      let f = new Element('form');

      f.append('<input type="text" name="f1" value="fixture1">');
      f.append('<input type="text" name="f2" value="fixture2 space">');
      f.formUrlEncode.should.equal('f1=fixture1&f2=fixture2+space');
    });

    it('should import data into fields from JSON', function () {
      let js = '{"fixvoid": true, "f1":"fixture1", "f2":"fixture2"}';
      let f = new Element('form');

      f.append('<input type="text" name="f1">');
      f.append('<input type="text" name="f2">');
      f.append('<input type="text" name="f3">');
      f.json = js;
      f.field('f1').value.should.equal('fixture1');
      f.field('f2').value.should.equal('fixture2');
      f.field('f3').value.should.equal('');
    });

    it('should import dotted keys data into fields from JSON', function () {
      let js = '{"fixvoid": true,"fixture":{"f1":"fixture1","f2":"fixture2"}}';
      let f = new Element('form');

      f.append('<input type="text" name="fixture.f1">');
      f.append('<input type="text" name="fixture.f2">');
      f.append('<input type="text" name="fixture.f3">');
      f.json = js;
      f.field('fixture.f1').value.should.equal('fixture1');
      f.field('fixture.f2').value.should.equal('fixture2');
      f.field('fixture.f3').value.should.equal('');
    });

    it('should throw an exception while import data into fields from JSON', function () {
      let js = '"fixvoid": true,"fixture":{"f1":"fixture1","f2":"fixture2"}}';
      let f = new Element('form');

      expect((function test() { f.json = js; })).to.throw(TypeError);
    });
  });

  describe('Events management', function () {
    it('should prevent submitting', function () {
      let f = new Element('form');
      let spy = sinon.spy();

      f.on('submit', (ev) => {
        ev.preventDefault();
        spy();
      });

      Q('body').append(f);
      f.fire('submit');
      spy.called.should.be.true;
      f.remove();
    });
  });

  describe('Should find a form by id', function () {
    it('should find form', function () {
      let f = new Element('form', {
        id: 'form-login'
      });

      Q(document.body).append(f);
      Q('#form-login').should.eql(f);
      f.remove();
    });
  });
});