Skip to content

Commit 4c88e1f

Browse files
authored
Merge pull request #487 from IvanPostu/test/autocomplete-component
test(autocomplete): cover autocomplete component
2 parents ca88d67 + 78535f4 commit 4c88e1f

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

tests/spec/autocomplete/autocompleteSpec.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,94 @@ describe('Autocomplete Plugin', function () {
128128
});
129129
});
130130
});
131+
132+
it('destroy method should properly dispose autocomplete component', function () {
133+
const normal = document.querySelector('#normal-autocomplete');
134+
const limited = document.querySelector('#limited-autocomplete');
135+
136+
expect(normal.parentNode.querySelector('.autocomplete-content')).not.toBeNull();
137+
expect(limited.parentNode.querySelector('.autocomplete-content')).not.toBeNull();
138+
139+
const normalInstance = M.Autocomplete.getInstance(normal);
140+
const limitedInstance = M.Autocomplete.getInstance(limited);
141+
normalInstance.destroy();
142+
limitedInstance.destroy();
143+
144+
expect(normal.parentNode.querySelector('.autocomplete-content')).toBeNull();
145+
expect(limited.parentNode.querySelector('.autocomplete-content')).toBeNull();
146+
});
147+
148+
it('selectOption method should chose only from showed dropdown', function (done) {
149+
const normal = document.querySelector('#normal-autocomplete');
150+
const autocompleteInstance = resetAutocomplete(normal, [
151+
{ id: 'Value Q1' },
152+
{ id: 'Value Q' },
153+
{ id: 'Value R' }]);
154+
const autocompleteEl = normal.parentNode.querySelector('.autocomplete-content');
155+
156+
focus(normal);
157+
normal.value = 'Q';
158+
keyup(normal, 81);
159+
160+
setTimeout(function () {
161+
expect(autocompleteEl.children.length).toBe(2);
162+
const dropdownAutocompleteIds = Array
163+
.from(autocompleteEl.querySelectorAll('li'))
164+
.map(liElement => liElement.getAttribute('data-id'));
165+
expect(dropdownAutocompleteIds).toEqual(['Value Q1', 'Value Q']);
166+
167+
autocompleteInstance.selectOption('Value R');
168+
expect(normal.value)
169+
.withContext('Only options from dropdown can be selected through selectOption')
170+
.toBe('Q');
171+
autocompleteInstance.selectOption('Value Q');
172+
expect(normal.value)
173+
.withContext('Only options from dropdown can be selected through selectOption')
174+
.toBe('Value Q');
175+
done();
176+
}, 200);
177+
});
178+
179+
it('setValues method should chose from any init data entry', function (done) {
180+
const normal = document.querySelector('#normal-autocomplete');
181+
const autocompleteInstance = resetAutocomplete(normal, [
182+
{ id: 'Value Q1' },
183+
{ id: 'Value Q' },
184+
{ id: 'Value R' }]);
185+
const autocompleteEl = normal.parentNode.querySelector('.autocomplete-content');
186+
187+
focus(normal);
188+
normal.value = 'Q';
189+
keyup(normal, 81);
190+
191+
setTimeout(function () {
192+
expect(autocompleteEl.children.length).toBe(2);
193+
const dropdownAutocompleteIds = Array
194+
.from(autocompleteEl.querySelectorAll('li'))
195+
.map(liElement => liElement.getAttribute('data-id'));
196+
expect(dropdownAutocompleteIds).toEqual(['Value Q1', 'Value Q']);
197+
198+
autocompleteInstance.setValues([{ id: 'Value R' }]);
199+
expect(normal.value)
200+
.withContext('Any option from init data can be selected through setValues')
201+
.toBe('Value R');
202+
autocompleteInstance.setValues([{ id: 'Value Q' }]);
203+
expect(normal.value)
204+
.withContext('Any option from init data can be selected through setValues')
205+
.toBe('Value Q');
206+
done();
207+
}, 200);
208+
});
131209
});
132210

211+
function resetAutocomplete(autocompleteElement, data) {
212+
M.Autocomplete.getInstance(autocompleteElement).destroy();
213+
return M.Autocomplete.init(autocompleteElement, {
214+
data: data,
215+
minLength: 0
216+
});
217+
}
218+
133219
function openDropdownAndSelectFirstOption(autocomplete, onFinish) {
134220
click(autocomplete);
135221
keyup(autocomplete, 9); // works

0 commit comments

Comments
 (0)