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 });