summaryrefslogtreecommitdiff
path: root/spec/javascripts/filtered_search
diff options
context:
space:
mode:
authorClement Ho <ClemMakesApps@gmail.com>2016-12-17 13:22:00 -0600
committerClement Ho <ClemMakesApps@gmail.com>2017-01-09 16:01:33 -0600
commite197f27f19ab7995d280f67754ea16c2629701b2 (patch)
tree922cc86d5d9d472fe0a76640ca91865a4c386bd2 /spec/javascripts/filtered_search
parent0e40c952d6d715580ed0ec891dc6f4fdc810673e (diff)
downloadgitlab-ce-e197f27f19ab7995d280f67754ea16c2629701b2.tar.gz
Refactor and use regex for string processing
Diffstat (limited to 'spec/javascripts/filtered_search')
-rw-r--r--spec/javascripts/filtered_search/dropdown_utils_spec.js.es625
-rw-r--r--spec/javascripts/filtered_search/filtered_search_dropdown_manager_spec.js.es622
-rw-r--r--spec/javascripts/filtered_search/filtered_search_tokenizer_spec.js.es6353
3 files changed, 99 insertions, 301 deletions
diff --git a/spec/javascripts/filtered_search/dropdown_utils_spec.js.es6 b/spec/javascripts/filtered_search/dropdown_utils_spec.js.es6
index 07293b9f877..369eb90e31c 100644
--- a/spec/javascripts/filtered_search/dropdown_utils_spec.js.es6
+++ b/spec/javascripts/filtered_search/dropdown_utils_spec.js.es6
@@ -34,11 +34,6 @@
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);
@@ -49,37 +44,27 @@
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({
+ describe('filterHint', () => {
+ it('should filter', () => {
+ let updatedItem = gl.DropdownUtils.filterHint({
hint: 'label',
}, 'l');
expect(updatedItem.droplab_hidden).toBe(false);
- updatedItem = gl.DropdownUtils.filterMethod({
+ updatedItem = gl.DropdownUtils.filterHint({
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({}, '');
+ const updatedItem = gl.DropdownUtils.filterHint({}, '');
expect(updatedItem.droplab_hidden).toBe(false);
});
});
diff --git a/spec/javascripts/filtered_search/filtered_search_dropdown_manager_spec.js.es6 b/spec/javascripts/filtered_search/filtered_search_dropdown_manager_spec.js.es6
index 17d414aaad1..562673a4ee5 100644
--- a/spec/javascripts/filtered_search/filtered_search_dropdown_manager_spec.js.es6
+++ b/spec/javascripts/filtered_search/filtered_search_dropdown_manager_spec.js.es6
@@ -21,13 +21,6 @@
});
describe('input has no existing value', () => {
- beforeEach(() => {
- spyOn(gl.FilteredSearchTokenizer, 'processTokens')
- .and.callFake(() => ({
- lastToken: {},
- }));
- });
-
it('should add word', () => {
gl.FilteredSearchDropdownManager.addWordToInput('firstWord');
expect(getInputValue()).toBe('firstWord');
@@ -61,26 +54,13 @@
value: 'roo',
};
- spyOn(gl.FilteredSearchTokenizer, 'processTokens').and.callFake(() => ({
- lastToken,
- }));
-
document.querySelector('.filtered-search').value = `${lastToken.key}:${lastToken.value}`;
gl.FilteredSearchDropdownManager.addWordToInput('root');
expect(getInputValue()).toBe('author:root');
});
it('should only add the remaining characters of the word (contains space)', () => {
- const lastToken = {
- key: 'label',
- value: 'test me',
- };
-
- spyOn(gl.FilteredSearchTokenizer, 'processTokens').and.callFake(() => ({
- lastToken,
- }));
-
- document.querySelector('.filtered-search').value = `${lastToken.key}:"${lastToken.value}"`;
+ document.querySelector('.filtered-search').value = 'label:~"test';
gl.FilteredSearchDropdownManager.addWordToInput('~\'"test me"\'');
expect(getInputValue()).toBe('label:~\'"test me"\'');
});
diff --git a/spec/javascripts/filtered_search/filtered_search_tokenizer_spec.js.es6 b/spec/javascripts/filtered_search/filtered_search_tokenizer_spec.js.es6
index c93f163e763..8e5992fa446 100644
--- a/spec/javascripts/filtered_search/filtered_search_tokenizer_spec.js.es6
+++ b/spec/javascripts/filtered_search/filtered_search_tokenizer_spec.js.es6
@@ -4,267 +4,100 @@
(() => {
describe('Filtered Search Tokenizer', () => {
- describe('parseToken', () => {
- it('should return key, value and symbol', () => {
- const { tokenKey, tokenValue, tokenSymbol } = gl.FilteredSearchTokenizer
- .parseToken('author:@user');
-
- expect(tokenKey).toBe('author');
- expect(tokenValue).toBe('@user');
- expect(tokenSymbol).toBe('@');
- });
-
- it('should return value with spaces', () => {
- const { tokenKey, tokenValue, tokenSymbol } = gl.FilteredSearchTokenizer
- .parseToken('label:~"test me"');
-
- expect(tokenKey).toBe('label');
- expect(tokenValue).toBe('~"test me"');
- expect(tokenSymbol).toBe('~');
- });
- });
-
- describe('getLastTokenObject', () => {
- beforeEach(() => {
- spyOn(gl.FilteredSearchTokenizer, 'getLastToken').and.callFake(input => input);
- });
-
- it('should return key and value', () => {
- const { key, value } = gl.FilteredSearchTokenizer.getLastTokenObject('author:@root');
- expect(key).toBe('author');
- expect(value).toBe(':@root');
- });
-
- describe('string without colon', () => {
- let lastTokenObject;
-
- beforeEach(() => {
- lastTokenObject = gl.FilteredSearchTokenizer.getLastTokenObject('author');
- });
-
- it('should return key as an empty string', () => {
- expect(lastTokenObject.key).toBe('');
- });
-
- it('should return input as value', () => {
- expect(lastTokenObject.value).toBe('author');
- });
- });
- });
-
- describe('getLastToken', () => {
- it('returns entire string when there is only one word', () => {
- const lastToken = gl.FilteredSearchTokenizer.getLastToken('input');
- expect(lastToken).toBe('input');
- });
-
- it('returns last word when there are multiple words', () => {
- const lastToken = gl.FilteredSearchTokenizer.getLastToken('this is a few words');
- expect(lastToken).toBe('words');
- });
-
- it('returns last token when there are multiple tokens', () => {
- const lastToken = gl.FilteredSearchTokenizer
- .getLastToken('label:fun author:root milestone:2.0');
- expect(lastToken).toBe('milestone:2.0');
- });
-
- it('returns last token containing spaces escaped by double quotes', () => {
- const lastToken = gl.FilteredSearchTokenizer
- .getLastToken('label:fun author:root milestone:2.0 label:~"Feature Proposal"');
- expect(lastToken).toBe('label:~"Feature Proposal"');
- });
-
- it('returns last token containing spaces escaped by single quotes', () => {
- const lastToken = gl.FilteredSearchTokenizer
- .getLastToken('label:fun author:root milestone:2.0 label:~\'Feature Proposal\'');
- expect(lastToken).toBe('label:~\'Feature Proposal\'');
- });
-
- it('returns last token containing special characters', () => {
- const lastToken = gl.FilteredSearchTokenizer
- .getLastToken('label:fun author:root milestone:2.0 label:~!@#$%^&*()');
- expect(lastToken).toBe('label:~!@#$%^&*()');
- });
- });
-
describe('processTokens', () => {
- describe('input does not contain any tokens', () => {
- let results;
- beforeEach(() => {
- results = gl.FilteredSearchTokenizer.processTokens('searchTerm');
- });
-
- it('returns input as searchToken', () => {
- expect(results.searchToken).toBe('searchTerm');
- });
-
- it('returns tokens as an empty array', () => {
- expect(results.tokens.length).toBe(0);
- });
-
- it('returns lastToken equal to searchToken', () => {
- expect(results.lastToken).toBe(results.searchToken);
- });
- });
-
- describe('input contains only tokens', () => {
- let results;
- beforeEach(() => {
- results = gl.FilteredSearchTokenizer
- .processTokens('author:@root label:~"Very Important" milestone:%v1.0 assignee:none');
- });
-
- it('returns searchToken as an empty string', () => {
- expect(results.searchToken).toBe('');
- });
-
- it('returns tokens array of size equal to the number of tokens in input', () => {
- expect(results.tokens.length).toBe(4);
- });
-
- it('returns tokens array that matches the tokens found in input', () => {
- expect(results.tokens[0].key).toBe('author');
- expect(results.tokens[0].value).toBe('@root');
- expect(results.tokens[0].wildcard).toBe(false);
-
- expect(results.tokens[1].key).toBe('label');
- expect(results.tokens[1].value).toBe('~Very Important');
- expect(results.tokens[1].wildcard).toBe(false);
-
- expect(results.tokens[2].key).toBe('milestone');
- expect(results.tokens[2].value).toBe('%v1.0');
- expect(results.tokens[2].wildcard).toBe(false);
-
- expect(results.tokens[3].key).toBe('assignee');
- expect(results.tokens[3].value).toBe('none');
- expect(results.tokens[3].wildcard).toBe(true);
- });
-
- it('returns lastToken equal to the last object in the tokens array', () => {
- expect(results.tokens[3]).toBe(results.lastToken);
- });
- });
-
- describe('input starts with search value and ends with tokens', () => {
- let results;
- beforeEach(() => {
- results = gl.FilteredSearchTokenizer
- .processTokens('searchTerm anotherSearchTerm milestone:none');
- });
-
- it('returns searchToken', () => {
- expect(results.searchToken).toBe('searchTerm anotherSearchTerm');
- });
-
- it('returns correct number of tokens', () => {
- expect(results.tokens.length).toBe(1);
- });
-
- it('returns correct tokens', () => {
- expect(results.tokens[0].key).toBe('milestone');
- expect(results.tokens[0].value).toBe('none');
- expect(results.tokens[0].wildcard).toBe(true);
- });
-
- it('returns lastToken', () => {
- expect(results.tokens[0]).toBe(results.lastToken);
- });
- });
-
- describe('input starts with token and ends with search value', () => {
- let results;
- beforeEach(() => {
- results = gl.FilteredSearchTokenizer
- .processTokens('assignee:@user searchTerm');
- });
-
- it('returns searchToken', () => {
- expect(results.searchToken).toBe('searchTerm');
- });
-
- it('returns correct number of tokens', () => {
- expect(results.tokens.length).toBe(1);
- });
-
- it('returns correct tokens', () => {
- expect(results.tokens[0].key).toBe('assignee');
- expect(results.tokens[0].value).toBe('@user');
- expect(results.tokens[0].wildcard).toBe(false);
- });
-
- it('returns lastToken as the searchTerm', () => {
- expect(results.lastToken).toBe(results.searchToken);
- });
- });
-
- describe('input contains search value wrapped between tokens', () => {
- let results;
- beforeEach(() => {
- results = gl.FilteredSearchTokenizer
- .processTokens('author:@root label:~"Won\'t fix" searchTerm anotherSearchTerm milestone:none');
- });
-
- it('returns searchToken', () => {
- expect(results.searchToken).toBe('searchTerm anotherSearchTerm');
- });
-
- it('returns correct number of tokens', () => {
- expect(results.tokens.length).toBe(3);
- });
-
-
- it('returns tokens array in the order it was processed', () => {
- expect(results.tokens[0].key).toBe('author');
- expect(results.tokens[0].value).toBe('@root');
- expect(results.tokens[0].wildcard).toBe(false);
-
- expect(results.tokens[1].key).toBe('label');
- expect(results.tokens[1].value).toBe('~Won\'t fix');
- expect(results.tokens[1].wildcard).toBe(false);
-
- expect(results.tokens[2].key).toBe('milestone');
- expect(results.tokens[2].value).toBe('none');
- expect(results.tokens[2].wildcard).toBe(true);
- });
-
- it('returns lastToken', () => {
- expect(results.tokens[2]).toBe(results.lastToken);
- });
- });
-
- describe('input search value is spaced in between tokens', () => {
- let results;
- beforeEach(() => {
- results = gl.FilteredSearchTokenizer
- .processTokens('author:@root searchTerm assignee:none anotherSearchTerm label:~Doing');
- });
-
- it('returns searchToken', () => {
- expect(results.searchToken).toBe('searchTerm anotherSearchTerm');
- });
-
- it('returns correct number of tokens', () => {
- expect(results.tokens.length).toBe(3);
- });
-
- it('returns tokens array in the order it was processed', () => {
- expect(results.tokens[0].key).toBe('author');
- expect(results.tokens[0].value).toBe('@root');
- expect(results.tokens[0].wildcard).toBe(false);
-
- expect(results.tokens[1].key).toBe('assignee');
- expect(results.tokens[1].value).toBe('none');
- expect(results.tokens[1].wildcard).toBe(true);
-
- expect(results.tokens[2].key).toBe('label');
- expect(results.tokens[2].value).toBe('~Doing');
- expect(results.tokens[2].wildcard).toBe(false);
- });
-
- it('returns lastToken', () => {
- expect(results.tokens[2]).toBe(results.lastToken);
- });
+ it('returns for input containing only search value', () => {
+ const results = gl.FilteredSearchTokenizer.processTokens('searchTerm');
+ expect(results.searchToken).toBe('searchTerm');
+ expect(results.tokens.length).toBe(0);
+ expect(results.lastToken).toBe(results.searchToken);
+ });
+
+ it('returns for input containing only tokens', () => {
+ const results = gl.FilteredSearchTokenizer
+ .processTokens('author:@root label:~"Very Important" milestone:%v1.0 assignee:none');
+ expect(results.searchToken).toBe('');
+ expect(results.tokens.length).toBe(4);
+ expect(results.tokens[3]).toBe(results.lastToken);
+
+ expect(results.tokens[0].key).toBe('author');
+ expect(results.tokens[0].value).toBe('root');
+ expect(results.tokens[0].symbol).toBe('@');
+
+ expect(results.tokens[1].key).toBe('label');
+ expect(results.tokens[1].value).toBe('Very Important');
+ expect(results.tokens[1].symbol).toBe('~');
+
+ expect(results.tokens[2].key).toBe('milestone');
+ expect(results.tokens[2].value).toBe('v1.0');
+ expect(results.tokens[2].symbol).toBe('%');
+
+ expect(results.tokens[3].key).toBe('assignee');
+ expect(results.tokens[3].value).toBe('none');
+ expect(results.tokens[3].symbol).toBe('');
+ });
+
+ it('returns for input starting with search value and ending with tokens', () => {
+ const results = gl.FilteredSearchTokenizer
+ .processTokens('searchTerm anotherSearchTerm milestone:none');
+ expect(results.searchToken).toBe('searchTerm anotherSearchTerm');
+ expect(results.tokens.length).toBe(1);
+ expect(results.tokens[0]).toBe(results.lastToken);
+ expect(results.tokens[0].key).toBe('milestone');
+ expect(results.tokens[0].value).toBe('none');
+ expect(results.tokens[0].symbol).toBe('');
+ });
+
+ it('returns for input starting with tokens and ending with search value', () => {
+ const results = gl.FilteredSearchTokenizer
+ .processTokens('assignee:@user searchTerm');
+
+ expect(results.searchToken).toBe('searchTerm');
+ expect(results.tokens.length).toBe(1);
+ expect(results.tokens[0].key).toBe('assignee');
+ expect(results.tokens[0].value).toBe('user');
+ expect(results.tokens[0].symbol).toBe('@');
+ expect(results.lastToken).toBe(results.searchToken);
+ });
+
+ it('returns for input containing search value wrapped between tokens', () => {
+ const results = gl.FilteredSearchTokenizer
+ .processTokens('author:@root label:~"Won\'t fix" searchTerm anotherSearchTerm milestone:none');
+
+ expect(results.searchToken).toBe('searchTerm anotherSearchTerm');
+ expect(results.tokens.length).toBe(3);
+ expect(results.tokens[2]).toBe(results.lastToken);
+
+ expect(results.tokens[0].key).toBe('author');
+ expect(results.tokens[0].value).toBe('root');
+ expect(results.tokens[0].symbol).toBe('@');
+
+ expect(results.tokens[1].key).toBe('label');
+ expect(results.tokens[1].value).toBe('Won\'t fix');
+ expect(results.tokens[1].symbol).toBe('~');
+
+ expect(results.tokens[2].key).toBe('milestone');
+ expect(results.tokens[2].value).toBe('none');
+ expect(results.tokens[2].symbol).toBe('');
+ });
+
+ it('returns for input containing search value in between tokens', () => {
+ const results = gl.FilteredSearchTokenizer
+ .processTokens('author:@root searchTerm assignee:none anotherSearchTerm label:~Doing');
+ expect(results.searchToken).toBe('searchTerm anotherSearchTerm');
+ expect(results.tokens.length).toBe(3);
+ expect(results.tokens[2]).toBe(results.lastToken);
+
+ expect(results.tokens[0].key).toBe('author');
+ expect(results.tokens[0].value).toBe('root');
+ expect(results.tokens[0].symbol).toBe('@');
+
+ expect(results.tokens[1].key).toBe('assignee');
+ expect(results.tokens[1].value).toBe('none');
+ expect(results.tokens[1].symbol).toBe('');
+
+ expect(results.tokens[2].key).toBe('label');
+ expect(results.tokens[2].value).toBe('Doing');
+ expect(results.tokens[2].symbol).toBe('~');
});
});
});