Add jasmine tests to dropdown utils
This commit is contained in:
parent
2461b9b635
commit
1f7659912c
|
@ -0,0 +1,68 @@
|
|||
(() => {
|
||||
class DropdownUtils {
|
||||
static getEscapedText(text) {
|
||||
let escapedText = text;
|
||||
const hasSpace = text.indexOf(' ') !== -1;
|
||||
const hasDoubleQuote = text.indexOf('"') !== -1;
|
||||
|
||||
// Encapsulate value with quotes if it has spaces
|
||||
// Known side effect: values's with both single and double quotes
|
||||
// won't escape properly
|
||||
if (hasSpace) {
|
||||
if (hasDoubleQuote) {
|
||||
escapedText = `'${text}'`;
|
||||
} else {
|
||||
// Encapsulate singleQuotes or if it hasSpace
|
||||
escapedText = `"${text}"`;
|
||||
}
|
||||
}
|
||||
|
||||
return escapedText;
|
||||
}
|
||||
|
||||
static filterWithSymbol(filterSymbol, item, query) {
|
||||
const updatedItem = item;
|
||||
const { value } = gl.FilteredSearchTokenizer.getLastTokenObject(query);
|
||||
const valueWithoutColon = value.slice(1).toLowerCase();
|
||||
const prefix = valueWithoutColon[0];
|
||||
const valueWithoutPrefix = valueWithoutColon.slice(1);
|
||||
|
||||
const title = updatedItem.title.toLowerCase();
|
||||
|
||||
// Eg. filterSymbol = ~ for labels
|
||||
const matchWithoutPrefix =
|
||||
prefix === filterSymbol && title.indexOf(valueWithoutPrefix) !== -1;
|
||||
const match = title.indexOf(valueWithoutColon) !== -1;
|
||||
|
||||
updatedItem.droplab_hidden = !match && !matchWithoutPrefix;
|
||||
return updatedItem;
|
||||
}
|
||||
|
||||
static filterMethod(item, query) {
|
||||
const updatedItem = item;
|
||||
const { value } = gl.FilteredSearchTokenizer.getLastTokenObject(query);
|
||||
|
||||
if (value === '') {
|
||||
updatedItem.droplab_hidden = false;
|
||||
} else {
|
||||
updatedItem.droplab_hidden = updatedItem.hint.indexOf(value) === -1;
|
||||
}
|
||||
|
||||
return updatedItem;
|
||||
}
|
||||
|
||||
static setDataValueIfSelected(selected) {
|
||||
const dataValue = selected.getAttribute('data-value');
|
||||
|
||||
if (dataValue) {
|
||||
gl.FilteredSearchDropdownManager.addWordToInput(dataValue);
|
||||
}
|
||||
|
||||
// Return boolean based on whether it was set
|
||||
return dataValue !== null;
|
||||
}
|
||||
}
|
||||
|
||||
window.gl = window.gl || {};
|
||||
gl.DropdownUtils = DropdownUtils;
|
||||
})();
|
|
@ -0,0 +1,121 @@
|
|||
//= require filtered_search/dropdown_utils
|
||||
//= require filtered_search/filtered_search_tokenizer
|
||||
//= require filtered_search/filtered_search_dropdown_manager
|
||||
|
||||
(() => {
|
||||
describe('Dropdown Utils', () => {
|
||||
describe('getEscapedText', () => {
|
||||
it('should return same word when it has no space', () => {
|
||||
const escaped = gl.DropdownUtils.getEscapedText('textWithoutSpace');
|
||||
expect(escaped).toBe('textWithoutSpace');
|
||||
});
|
||||
|
||||
it('should escape with double quotes', () => {
|
||||
let escaped = gl.DropdownUtils.getEscapedText('text with space');
|
||||
expect(escaped).toBe('"text with space"');
|
||||
|
||||
escaped = gl.DropdownUtils.getEscapedText('won\'t fix');
|
||||
expect(escaped).toBe('"won\'t fix"');
|
||||
});
|
||||
|
||||
it('should escape with single quotes', () => {
|
||||
const escaped = gl.DropdownUtils.getEscapedText('won"t fix');
|
||||
expect(escaped).toBe('\'won"t fix\'');
|
||||
});
|
||||
|
||||
it('should escape with single quotes by default', () => {
|
||||
const escaped = gl.DropdownUtils.getEscapedText('won"t\' fix');
|
||||
expect(escaped).toBe('\'won"t\' fix\'');
|
||||
});
|
||||
});
|
||||
|
||||
describe('filterWithSymbol', () => {
|
||||
const item = {
|
||||
title: '@root',
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
spyOn(gl.FilteredSearchTokenizer, 'getLastTokenObject')
|
||||
.and.callFake(query => ({ value: query }));
|
||||
});
|
||||
|
||||
it('should filter without symbol', () => {
|
||||
const updatedItem = gl.DropdownUtils.filterWithSymbol('@', item, ':roo');
|
||||
expect(updatedItem.droplab_hidden).toBe(false);
|
||||
});
|
||||
|
||||
it('should filter with symbol', () => {
|
||||
const updatedItem = gl.DropdownUtils.filterWithSymbol('@', item, ':@roo');
|
||||
expect(updatedItem.droplab_hidden).toBe(false);
|
||||
});
|
||||
|
||||
it('should filter with invalid symbol', () => {
|
||||
const updatedItem = gl.DropdownUtils.filterWithSymbol('@', item, ':#');
|
||||
expect(updatedItem.droplab_hidden).toBe(true);
|
||||
});
|
||||
|
||||
it('should filter with colon', () => {
|
||||
const updatedItem = gl.DropdownUtils.filterWithSymbol('@', item, ':');
|
||||
expect(updatedItem.droplab_hidden).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('filterMethod', () => {
|
||||
beforeEach(() => {
|
||||
spyOn(gl.FilteredSearchTokenizer, 'getLastTokenObject')
|
||||
.and.callFake(query => ({ value: query }));
|
||||
});
|
||||
|
||||
it('should filter by hint', () => {
|
||||
let updatedItem = gl.DropdownUtils.filterMethod({
|
||||
hint: 'label',
|
||||
}, 'l');
|
||||
expect(updatedItem.droplab_hidden).toBe(false);
|
||||
|
||||
updatedItem = gl.DropdownUtils.filterMethod({
|
||||
hint: 'label',
|
||||
}, 'o');
|
||||
expect(updatedItem.droplab_hidden).toBe(true);
|
||||
});
|
||||
|
||||
it('should return droplab_hidden false when item has no hint', () => {
|
||||
const updatedItem = gl.DropdownUtils.filterMethod({}, '');
|
||||
expect(updatedItem.droplab_hidden).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('setDataValueIfSelected', () => {
|
||||
beforeEach(() => {
|
||||
spyOn(gl.FilteredSearchDropdownManager, 'addWordToInput')
|
||||
.and.callFake(() => {});
|
||||
});
|
||||
|
||||
it('calls addWordToInput when dataValue exists', () => {
|
||||
const selected = {
|
||||
getAttribute: () => 'value',
|
||||
};
|
||||
|
||||
gl.DropdownUtils.setDataValueIfSelected(selected);
|
||||
expect(gl.FilteredSearchDropdownManager.addWordToInput.calls.count()).toEqual(1);
|
||||
});
|
||||
|
||||
it('returns true when dataValue exists', () => {
|
||||
const selected = {
|
||||
getAttribute: () => 'value',
|
||||
};
|
||||
|
||||
const result = gl.DropdownUtils.setDataValueIfSelected(selected);
|
||||
expect(result).toBe(true);
|
||||
});
|
||||
|
||||
it('returns false when dataValue does not exist', () => {
|
||||
const selected = {
|
||||
getAttribute: () => null,
|
||||
};
|
||||
|
||||
const result = gl.DropdownUtils.setDataValueIfSelected(selected);
|
||||
expect(result).toBe(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
})();
|
Loading…
Reference in New Issue