Issues (99)

test/test.js (2 issues)

1
describe('Jets', function() {
2
3
  var people = ['John Doe', 'Mike Doe', 'Alex Smith', 'Alice Vazovsky', 'Denis Koen'],
4
    $search = $('#jetsSearch'),
5
    searchNode = $search.get(0),
6
    $content = $('#jetsContent');
7
8
9
  /*
10
   * Helper functions
11
   */
12
  function trigger(ev, _elem) {
13
    elem = _elem || searchNode
14
    if ("createEvent" in document) {
15
        var evt = document.createEvent("HTMLEvents");
16
        evt.initEvent(ev, false, true);
17
        elem.dispatchEvent(evt);
18
    } else elem.fireEvent("on" + ev);
19
  }
20
21
  function ext(options) {
22
    return $.extend({
23
      searchTag: '#jetsSearch',
24
      contentTag: '#jetsContent'
25
    }, options || {});
26
  }
27
28
  function make(action) {
29
    action();
30
    trigger('change');
31
  }
32
33
34
  /*
35
   * Mocha helpers
36
   */ 
37
  before(function() {
38
    $content.html($.map(people, function(val, i){
39
      var reversed = val.split('').reverse().join('');
40
      return '<tr><td data-custom="' + reversed + '">' + val + '</td><td>' + i + '</td></tr>'
41
    }).join(''));
42
  })
43
44
  afterEach(function() {
45
    jet && jet.destroy();
46
    $search.val('');
47
    trigger('change', searchNode);
48
  })
49
50
  after(function() {
51
    jet && jet.destroy();
52
    $search.val('');
53
    $content.find('[data-custom]').removeAttr('data-custom');
54
  })
55
56
57
  /*
58
  * Specs
59
  */
60
61
  it('Should hide inappropriate rows', function() {
62
    jet = new Jets(ext({}));
63
    make(function() {
64
      $search.val(people[0]);
65
    })
66
    assert.lengthOf($content.children(':visible'), 1);
67
  })
68
69
  it('Should show all rows if search query not specified', function() {
70
    jet = new Jets(ext({}));
71
    make(function() {
72
      $search.val('');
73
    })
74
    assert.lengthOf($content.children(':visible'), people.length);
75
  })
76
77
  it('Should hide all rows if no suitable results', function() {
78
    jet = new Jets(ext({}));
79
    make(function() {
80
      $search.val('404');
81
    })
82
    assert.lengthOf($content.children(':visible'), 0);
83
  })
84
85
  describe('On init', function() {
86
87
    it('Shoud add style tag after init', function() {
88
      jet = new Jets(ext({}));
89
      assert.lengthOf($('head').find(jet.styleTag), 1);
90
    })
91
92
    it('Should add "data-jets" attribute', function() {
93
      jet = new Jets(ext({
94
        columns: [0]
95
      }));
96
      var $firstRow = $content.children(':first');
97
      assert.equal($firstRow.attr('data-jets'), $firstRow.children(':first').text().trim().toLowerCase());
98
    })
99
100
  })
101
102
  describe('On destroy', function() {
103
104
    it('Shoud remove style tag after destroy', function() {
105
      jet = new Jets(ext({}));
106
      jet.destroy();
107
      assert.lengthOf($('head').find(jet.styleTag), 0);
108
    })
109
110
    it('Should remove "data-jets" attribute', function() {
111
      jet = new Jets(ext({}));
112
      jet.destroy()
113
      assert.isUndefined($content.children(':first').attr('data-jets'));
114
    })
115
    
116
  })
117
118
  describe('Columns option', function() {
119
    
120
    it('Should search by any column', function() {
121
      jet = new Jets(ext({}));
122
      make(function() {
123
        $search.val('1');
124
      })
125
      assert.lengthOf($content.children(':visible'), 1);
126
    })
127
128
    it('Should find one row by first column', function() {
129
      jet = new Jets(ext({
130
        columns: [0]
131
      }));
132
      make(function() {
133
        $search.val(people[0]);
134
      })
135
      assert.lengthOf($content.children(':visible'), 1);
136
    })
137
138
    it('Should avoid second column', function() {
139
      jet = new Jets(ext({
140
        columns: [0]
141
      }));
142
      make(function() {
143
        $search.val('1');
144
      })
145
      assert.lengthOf($content.children(':visible'), 0);
146
    })
147
    
148
  })
149
150
  describe('addImportant option', function() {
151
152
    it('Should avoid !important by default', function() {
153
      jet = new Jets(ext({}));
154
      make(function() {
155
        $search.val(people[0]);
156
      })
157
      assert.notInclude($(jet.styleTag).html(), '!important');
158
    })
159
160
    it('Should add !important', function() {
161
      jet = new Jets(ext({
162
        addImportant: true
163
      }));
164
      make(function() {
165
        $search.val(people[0]);
166
      })
167
      assert.include($(jet.styleTag).html(), '!important');
168
    })
169
170
  })
171
172
  describe('searchSelector option', function() {
173
174
    function execute(selector) {
175
      it('Should use custom selector: ' + selector, function() {
176
        jet = new Jets(ext({
177
          searchSelector: selector
178
        }));
179
        make(function() {
180
          $search.val(people[0]);
181
        })
182
        assert.include($(jet.styleTag).html(), selector);  
183
      })
184
    }
185
186
    var selectors = ['^', '$', '~', '|'];
187
    for(var i = 0, ii = selectors.length; i < ii; i++) {
188
      execute(selectors[i]);
189
    }
190
191
    it('Should find one result with * selector', function() {
192
193
      jet = new Jets(ext({
194
        searchSelector: '*'
195
      }));
196
      make(function() {
197
        $search.val('John Doe');
198
      })
199
      assert.lengthOf($content.children(':visible'), 1);
200
201
    })
202
203
    it('Should hide all results with * selector and mixed words', function() {
204
205
      jet = new Jets(ext({
206
        searchSelector: '*'
207
      }));
208
      make(function() {
209
        $search.val('Doe John');
210
      })
211
      assert.lengthOf($content.children(':visible'), 0);
212
213
    })
214
215
    it('Should find one result with *AND selector and mixed words', function() {
216
217
      jet = new Jets(ext({
218
        searchSelector: '*AND'
219
      }));
220
      make(function() {
221
        $search.val('Doe John');
222
      })
223
      assert.lengthOf($content.children(':visible'), 1);
224
225
    })
226
227
    it('Should find one result with *AND selector and part of word', function() {
228
229
      jet = new Jets(ext({
230
        searchSelector: '*AND'
231
      }));
232
      make(function() {
233
        $search.val('John oe');
234
      })
235
      assert.lengthOf($content.children(':visible'), 1);
236
237
    })
238
239
    it('Should find three results with *OR selector and part of word', function() {
240
241
      jet = new Jets(ext({
242
        searchSelector: '*OR'
243
      }));
244
      make(function() {
245
        $search.val('John oe');
246
      })
247
      assert.lengthOf($content.children(':visible'), 3);
248
249
    })
250
251
  })
252
253
  describe('manualContentHandling option', function() {
254
255
    it('Should fetch content by custom rule', function() {
256
      jet = new Jets(ext({
257
        manualContentHandling: function(tag) {
258
          return $(tag).children(0).attr('data-custom')
259
        }
260
      }));
261
      make(function() {
262
        $search.val(people[0].split('').reverse().join(''));
263
      })
264
      assert.lengthOf($content.children(':visible'), 1);
265
    })
266
267
  })
268
269
  describe('invert option', function() {
270
271
    it('Should invert results', function() {
272
      jet = new Jets(ext({
273
        invert: true
274
      }));
275
      make(function() {
276
        $search.val(people[0]);
277
      })
278
      assert.lengthOf($content.children(':visible'), 3);
279
    })
280
281
  })
282
283
  describe('callSearchManually option', function() {
284
285
    it('Should not call search on typing', function() {
286
      jet = new Jets(ext({
287
        callSearchManually: true
288
      }));
289
      make(function() {
290
        $search.val(people[0]);
291
      })
292
      assert.lengthOf($content.children(':visible'), 5);
293
    })
294
295
    it('Should call search by manual calling .search', function() {
296
      jet = new Jets(ext({
297
        callSearchManually: true
298
      }));
299
      make(function() {
300
        $search.val(people[0]);
301
      })
302
      jet.search();
303
      assert.lengthOf($content.children(':visible'), 1);
304
    })
305
306
    it('Should call search by manual calling .search with search phrase as attribute', function() {
307
      jet = new Jets(ext({
308
        callSearchManually: true
309
      }));
310
      jet.search(people[0]);
311
      assert.lengthOf($content.children(':visible'), 1);
312
    })
313
314
  })
315
316
  describe('searchInSpecificColumn option', function() {
317
318
    it('Should search in specific column', function() {
319
      // duplicate data in columns (in reversed order)
320
      $content.html($.map(people, function(val, i){
321
        var reversed = val.split('').reverse().join('');
0 ignored issues
show
The variable reversed seems to be never used. Consider removing it.
Loading history...
322
        return '<tr><td>' + val + '</td><td>' + people[people.length - i - 1] + '</td></tr>'
323
      }).join(''));
324
      jet = new Jets(ext({
325
        callSearchManually: true,
326
        searchInSpecificColumn: true
327
      }));
328
      make(function() {
329
        jet.search(people[0], 0);
330
      })
331
      assert.lengthOf($content.children(':visible'), 1);
332
    })
333
334
    it('Should search in all column in column not specified', function() {
335
      // duplicate data in columns (in reversed order)
336
      $content.html($.map(people, function(val, i){
337
        var reversed = val.split('').reverse().join('');
0 ignored issues
show
The variable reversed seems to be never used. Consider removing it.
Loading history...
338
        return '<tr><td>' + val + '</td><td>' + people[people.length - i - 1] + '</td></tr>'
339
      }).join(''));
340
      jet = new Jets(ext({
341
        callSearchManually: true,
342
        searchInSpecificColumn: true
343
      }));
344
      make(function() {
345
        jet.search(people[0]);
346
      })
347
      assert.lengthOf($content.children(':visible'), 2);
348
    })
349
350
  })
351
352
})