github.com/zoomfoo/nomad@v0.8.5-0.20180907175415-f28fd3a1a056/ui/tests/unit/mixins/searchable-test.js (about)

     1  import { alias } from '@ember/object/computed';
     2  import { getOwner } from '@ember/application';
     3  import EmberObject, { computed } from '@ember/object';
     4  import { moduleFor, test } from 'ember-qunit';
     5  import Searchable from 'nomad-ui/mixins/searchable';
     6  
     7  moduleFor('mixin:searchable', 'Unit | Mixin | Searchable', {
     8    subject() {
     9      const SearchableObject = EmberObject.extend(Searchable, {
    10        source: null,
    11        searchProps: computed(() => ['id', 'name']),
    12        listToSearch: alias('source'),
    13      });
    14  
    15      this.register('test-container:searchable-object', SearchableObject);
    16      return getOwner(this).lookup('test-container:searchable-object');
    17    },
    18  });
    19  
    20  test('the searchable mixin does nothing when there is no search term', function(assert) {
    21    const subject = this.subject();
    22    subject.set('source', [{ id: '1', name: 'hello' }, { id: '2', name: 'world' }]);
    23  
    24    assert.deepEqual(subject.get('listSearched'), subject.get('source'));
    25  });
    26  
    27  test('the searchable mixin allows for regex search', function(assert) {
    28    const subject = this.subject();
    29    subject.set('source', [
    30      { id: '1', name: 'hello' },
    31      { id: '2', name: 'world' },
    32      { id: '3', name: 'oranges' },
    33    ]);
    34  
    35    subject.set('searchTerm', '.+l+[A-Z]$');
    36    assert.deepEqual(
    37      subject.get('listSearched'),
    38      [{ id: '1', name: 'hello' }, { id: '2', name: 'world' }],
    39      'hello and world matched for regex'
    40    );
    41  });
    42  
    43  test('the searchable mixin only searches the declared search props', function(assert) {
    44    const subject = this.subject();
    45    subject.set('source', [
    46      { id: '1', name: 'United States of America', continent: 'North America' },
    47      { id: '2', name: 'Canada', continent: 'North America' },
    48      { id: '3', name: 'Mexico', continent: 'North America' },
    49    ]);
    50  
    51    subject.set('searchTerm', 'America');
    52    assert.deepEqual(
    53      subject.get('listSearched'),
    54      [{ id: '1', name: 'United States of America', continent: 'North America' }],
    55      'Only USA matched, since continent is not a search prop'
    56    );
    57  });
    58  
    59  test('the fuzzy search mode is off by default', function(assert) {
    60    const subject = this.subject();
    61    subject.set('source', [
    62      { id: '1', name: 'United States of America', continent: 'North America' },
    63      { id: '2', name: 'Canada', continent: 'North America' },
    64      { id: '3', name: 'Mexico', continent: 'North America' },
    65    ]);
    66  
    67    subject.set('searchTerm', 'Ameerica');
    68    assert.deepEqual(
    69      subject.get('listSearched'),
    70      [],
    71      'Nothing is matched since America is spelled incorrectly'
    72    );
    73  });
    74  
    75  test('the fuzzy search mode can be enabled', function(assert) {
    76    const subject = this.subject();
    77    subject.set('source', [
    78      { id: '1', name: 'United States of America', continent: 'North America' },
    79      { id: '2', name: 'Canada', continent: 'North America' },
    80      { id: '3', name: 'Mexico', continent: 'North America' },
    81    ]);
    82  
    83    subject.set('fuzzySearchEnabled', true);
    84    subject.set('searchTerm', 'Ameerica');
    85    assert.deepEqual(
    86      subject.get('listSearched'),
    87      [{ id: '1', name: 'United States of America', continent: 'North America' }],
    88      'America is matched due to fuzzy matching'
    89    );
    90  });
    91  
    92  test('the exact match search mode can be disabled', function(assert) {
    93    const subject = this.subject();
    94    subject.set('source', [
    95      { id: '1', name: 'United States of America', continent: 'North America' },
    96      { id: '2', name: 'Canada', continent: 'North America' },
    97      { id: '3', name: 'Mexico', continent: 'North America' },
    98    ]);
    99  
   100    subject.set('regexSearchProps', []);
   101    subject.set('searchTerm', 'Mexico');
   102  
   103    assert.deepEqual(
   104      subject.get('listSearched'),
   105      [{ id: '3', name: 'Mexico', continent: 'North America' }],
   106      'Mexico is matched exactly'
   107    );
   108  
   109    subject.set('exactMatchEnabled', false);
   110  
   111    assert.deepEqual(
   112      subject.get('listSearched'),
   113      [],
   114      'Nothing is matched now that exactMatch is disabled'
   115    );
   116  });
   117  
   118  test('the regex search mode can be disabled', function(assert) {
   119    const subject = this.subject();
   120    subject.set('source', [
   121      { id: '1', name: 'United States of America', continent: 'North America' },
   122      { id: '2', name: 'Canada', continent: 'North America' },
   123      { id: '3', name: 'Mexico', continent: 'North America' },
   124    ]);
   125  
   126    subject.set('searchTerm', '^.{6}$');
   127    assert.deepEqual(
   128      subject.get('listSearched'),
   129      [
   130        { id: '2', name: 'Canada', continent: 'North America' },
   131        { id: '3', name: 'Mexico', continent: 'North America' },
   132      ],
   133      'Canada and Mexico meet the regex criteria'
   134    );
   135  
   136    subject.set('regexEnabled', false);
   137  
   138    assert.deepEqual(
   139      subject.get('listSearched'),
   140      [],
   141      'Nothing is matched now that regex is disabled'
   142    );
   143  });
   144  
   145  test('each search mode has independent search props', function(assert) {
   146    const subject = this.subject();
   147    subject.set('source', [
   148      { id: '1', name: 'United States of America', continent: 'North America' },
   149      { id: '2', name: 'Canada', continent: 'North America' },
   150      { id: '3', name: 'Mexico', continent: 'North America' },
   151    ]);
   152  
   153    subject.set('fuzzySearchEnabled', true);
   154    subject.set('regexSearchProps', ['id']);
   155    subject.set('exactMatchSearchProps', ['continent']);
   156    subject.set('fuzzySearchProps', ['name']);
   157  
   158    subject.set('searchTerm', 'Nor America');
   159    assert.deepEqual(
   160      subject.get('listSearched'),
   161      [],
   162      'Not an exact match on continent, not a matchAllTokens match on fuzzy, not a regex match on id'
   163    );
   164  
   165    subject.set('searchTerm', 'America States');
   166    assert.deepEqual(
   167      subject.get('listSearched'),
   168      [{ id: '1', name: 'United States of America', continent: 'North America' }],
   169      'Fuzzy match on one country, but not an exact match on continent'
   170    );
   171  
   172    subject.set('searchTerm', '^(.a){3}$');
   173    assert.deepEqual(
   174      subject.get('listSearched'),
   175      [],
   176      'Canada is not matched by the regex because only id is looked at for regex search'
   177    );
   178  });