From a86c2e709febf69eb8e2a2b379b0d6c3953aad89 Mon Sep 17 00:00:00 2001
From: Kevin Brown <kevin@kevinbrown.in>
Date: Fri, 21 Aug 2015 19:17:00 -0400
Subject: [PATCH] Add tests for 4958961

---
 tests/data/tokenizer-tests.js | 128 ++++++++++++++++++++++++++++++++++
 1 file changed, 128 insertions(+)

diff --git a/tests/data/tokenizer-tests.js b/tests/data/tokenizer-tests.js
index bce06a2f..76197547 100644
--- a/tests/data/tokenizer-tests.js
+++ b/tests/data/tokenizer-tests.js
@@ -40,4 +40,132 @@ test('triggers the select event', function (assert) {
   }, function () {
     assert.ok(true, 'The callback should have succeeded');
   });
+});
+
+test('createTag can return null', function (assert) {
+  expect(3);
+
+  var SelectData = require('select2/data/select');
+  var Tokenizer = require('select2/data/tokenizer');
+  var Tags = require('select2/data/tags');
+
+  var Options = require('select2/options');
+  var Utils = require('select2/utils');
+
+  var $ = require('jquery');
+
+  var TokenizedSelect = Utils.Decorate(
+    Utils.Decorate(SelectData, Tags),
+    Tokenizer
+  );
+  var $select = $('#qunit-fixture .single');
+
+  var options = new Options({
+    tags: true,
+    tokenSeparators: [','],
+    createTag: function () {
+      assert.ok(true, 'createTag should have been called');
+
+      return null;
+    }
+  });
+
+  var container = new MockContainer();
+  container.dropdown = container.selection = {};
+
+  var $container = $('<div></div>');
+
+  var data = new TokenizedSelect($select, options);
+  data.bind(container, $container);
+
+  data.on('select', function (params) {
+    if (params.data == null) {
+      assert.ok(false, 'Null data should never be selected');
+    }
+  });
+
+  data.query({
+    term: 'first,second'
+  }, function () {
+    assert.ok(true, 'The callback should have succeeded');
+  });
+});
+
+test('createTag returning null does not cut the term', function (assert) {
+  expect(4);
+
+  var SelectData = require('select2/data/select');
+  var Tokenizer = require('select2/data/tokenizer');
+  var Tags = require('select2/data/tags');
+
+  var Options = require('select2/options');
+  var Utils = require('select2/utils');
+
+  var $ = require('jquery');
+
+  var TokenizedSelect = Utils.Decorate(
+    Utils.Decorate(SelectData, Tags),
+    Tokenizer
+  );
+  var $select = $('#qunit-fixture .single');
+
+  var options = new Options({
+    tags: true,
+    tokenSeparators: [',', '"'],
+    createTag: function (params) {
+      var term = params.term;
+
+      // Ignore blanks
+      if (term.length === 0) {
+        return null;
+      }
+
+      // Ignore the leading quote
+      if (term === '"') {
+        return null;
+      }
+
+      // If there is a leading quote, check for a second one
+      if (term[0] === '"' && term[term.length - 1] !== '"') {
+        return null;
+      }
+
+      var text = term.substr(1, term.length - 2);
+
+      return {
+        id: term,
+        text: text
+      };
+    }
+  });
+
+  var container = new MockContainer();
+  container.dropdown = container.selection = {};
+
+  var $container = $('<div></div>');
+
+  var data = new TokenizedSelect($select, options);
+  data.bind(container, $container);
+
+  data.on('select', function (params) {
+    assert.ok(params.data, 'Data should not be null');
+
+    assert.equal(
+      params.data.id,
+      '"first, second"',
+      'The id should have the quotes'
+    );
+
+    assert.equal(
+      params.data.text,
+      'first, second',
+      'The text should not have the quotes'
+    );
+  });
+
+  data.query({
+    term: '"first, second",abc'
+  }, function () {
+    assert.ok(true, 'The callback should have succeeded');
+  });
 });
\ No newline at end of file