module('Data adapters - Tags');

var SelectData = require('select2/data/select'); var Tags = require('select2/data/tags');

var $ = require('jquery'); var Options = require('select2/options'); var Utils = require('select2/utils');

var SelectTags = Utils.Decorate(SelectData, Tags); var options = new Options({

tags: true

});

test('does not trigger on blank or null terms', function (assert) {

var data = new SelectTags($('#qunit-fixture .single'), options);

data.query({
  term: ''
}, function (data) {
  assert.equal(data.results.length, 1);

  var item = data.results[0];

  assert.equal(item.id, 'One');
  assert.equal(item.text, 'One');
});

data.query({
  term: null
}, function (data) {
  assert.equal(data.results.length, 1);

  var item = data.results[0];

  assert.equal(item.id, 'One');
  assert.equal(item.text, 'One');
});

});

test('white space is trimmed by default', function (assert) {

var data = new SelectTags($('#qunit-fixture .single'), options);

data.query({
  term: '  '
}, function (data) {
  assert.equal(data.results.length, 1);

  var item = data.results[0];

  assert.equal(item.id, 'One');
  assert.equal(item.text, 'One');
});

data.query({
  term: ' One '
}, function (data) {
  assert.equal(data.results.length, 1);

  var item = data.results[0];

  assert.equal(item.id, 'One');
  assert.equal(item.text, 'One');
});

});

test('does not create option if text is same but lowercase', function (assert) {

var data = new SelectTags($('#qunit-fixture .single'), options);

data.query({
  term: 'one'
}, function (data) {
  assert.equal(data.results.length, 1);

  var item = data.results[0];

  assert.equal(item.id, 'One');
  assert.equal(item.text, 'One');
});

});

test('does not trigger for additional pages', function (assert) {

var data = new SelectTags($('#qunit-fixture .single'), options);

data.query({
  page: 2
}, function (data) {
  assert.equal(data.results.length, 1);

  var item = data.results[0];

  assert.equal(item.id, 'One');
  assert.equal(item.text, 'One');
});

});

test('creates tag at beginning', function (assert) {

var data = new SelectTags($('#qunit-fixture .single'), options);

data.query({
  term: 'o'
}, function (data) {
  assert.equal(data.results.length, 2);

  var first = data.results[0];

  assert.equal(first.id, 'o');
  assert.equal(first.text, 'o');
});

});

test('tags can be the only result', function (assert) {

var data = new SelectTags($('#qunit-fixture .single'), options);

data.query({
  term: 'test'
}, function (data) {
  assert.equal(data.results.length, 1);

  var item = data.results[0];

  assert.equal(item.id, 'test');
  assert.equal(item.text, 'test');
});

});

test('tags are injected as options', function (assert) {

var data = new SelectTags($('#qunit-fixture .single'), options);

data.query({
  term: 'test'
}, function (data) {
  assert.equal(data.results.length, 1);

  var $children = $('#qunit-fixture .single option');

  assert.equal($children.length, 2);

  var $tag = $children.last();

  assert.equal($tag.val(), 'test');
  assert.equal($tag.text(), 'test');
});

});

test('old tags are removed automatically', function (assert) {

var data = new SelectTags($('#qunit-fixture .single'), options);

data.query({
  term: 'first'
}, function (data) {
  assert.equal(data.results.length, 1);

  var $children = $('#qunit-fixture .single option');

  assert.equal($children.length, 2);
});

data.query({
  term: 'second'
}, function (data) {
  assert.equal(data.results.length, 1);

  var $children = $('#qunit-fixture .single option');

  assert.equal($children.length, 2);

  var $tag = $children.last();

  assert.equal($tag.val(), 'second');
  assert.equal($tag.text(), 'second');
});

});

test('insertTag controls the tag location', function (assert) {

var data = new SelectTags($('#qunit-fixture .single'), options);

data.insertTag = function (data, tag) {
  data.push(tag);
};

data.query({
  term: 'o'
}, function (data) {
  assert.equal(data.results.length, 2);

  var item = data.results[1];

  assert.equal(item.id, 'o');
  assert.equal(item.text, 'o');
});

});

test('insertTag can be controlled through the options', function (assert) {

var options = new Options({
  insertTag: function (data, tag) {
    data.push(tag);
  }
});
var data = new SelectTags($('#qunit-fixture .single'), options);

data.query({
  term: 'o'
}, function (data) {
  assert.equal(data.results.length, 2);

  var item = data.results[1];

  assert.equal(item.id, 'o');
  assert.equal(item.text, 'o');
});

});

test('createTag controls the tag object', function (assert) {

var data = new SelectTags($('#qunit-fixture .single'), options);

data.createTag = function (params) {
  return {
    id: 0,
    text: params.term
  };
};

data.query({
  term: 'test'
}, function (data) {
  assert.equal(data.results.length, 1);

  var item = data.results[0];

  assert.equal(item.id, 0);
  assert.equal(item.text, 'test');
});

});

test('createTag returns null for no tag', function (assert) {

var data = new SelectTags($('#qunit-fixture .single'), options);

data.createTag = function (params) {
  return null;
};

data.query({
  term: 'o'
}, function (data) {
  assert.equal(data.results.length, 1);
});

});

test('the createTag options customizes the function', function (assert) {

var data = new SelectTags(
  $('#qunit-fixture .single'),
  new Options({
    tags: true,
    createTag: function (params) {
      return {
        id: params.term,
        text: params.term,
        tag: true
      };
    }
  })
);

data.query({
  term: 'test'
}, function (data) {
  assert.equal(data.results.length, 1);

  var item = data.results[0];

  assert.equal(item.id, 'test');
  assert.equal(item.text, 'test');
  assert.equal(item.tag, true);
});

});