From 6008c21e8c240b993a47c6e3656a17cc3ae6927f Mon Sep 17 00:00:00 2001 From: Delmer Reed Date: Mon, 13 Aug 2018 11:11:51 -0400 Subject: [PATCH] Add tests for log filters --- ui/src/logs/constants/search.ts | 12 -- ui/src/logs/containers/LogsPage.tsx | 5 +- ui/src/logs/utils/search.ts | 16 ++- ui/test/logs/utils/logFilters.test.ts | 164 ++++++++++++++++++++++++++ 4 files changed, 178 insertions(+), 19 deletions(-) delete mode 100644 ui/src/logs/constants/search.ts create mode 100644 ui/test/logs/utils/logFilters.test.ts diff --git a/ui/src/logs/constants/search.ts b/ui/src/logs/constants/search.ts deleted file mode 100644 index 57b18cb69..000000000 --- a/ui/src/logs/constants/search.ts +++ /dev/null @@ -1,12 +0,0 @@ -import {createRule} from 'src/logs/utils/search' - -import {TermPart, TermType, TermRule} from 'src/types/logs' - -export const LOG_SEARCH_TERMS: TermRule[] = [ - createRule(TermPart.SINGLE_QUOTED, TermType.EXCLUDE), - createRule(TermPart.DOUBLE_QUOTED, TermType.EXCLUDE), - createRule(TermPart.SINGLE_QUOTED), - createRule(TermPart.DOUBLE_QUOTED), - createRule(TermPart.UNQUOTED_WORD, TermType.EXCLUDE), - createRule(TermPart.UNQUOTED_WORD), -] diff --git a/ui/src/logs/containers/LogsPage.tsx b/ui/src/logs/containers/LogsPage.tsx index 79321fce5..ab4e15d2b 100644 --- a/ui/src/logs/containers/LogsPage.tsx +++ b/ui/src/logs/containers/LogsPage.tsx @@ -44,7 +44,6 @@ import {getDeep} from 'src/utils/wrappers' import {colorForSeverity} from 'src/logs/utils/colors' import OverlayTechnology from 'src/reusable_ui/components/overlays/OverlayTechnology' import {SeverityFormatOptions, SEVERITY_SORTING_ORDER} from 'src/logs/constants' -import {LOG_SEARCH_TERMS} from 'src/logs/constants/search' import {Source, Namespace} from 'src/types' @@ -532,9 +531,11 @@ class LogsPage extends Component { } private handleSubmitSearch = (value: string): void => { - searchToFilters(value, LOG_SEARCH_TERMS).forEach(filter => { + searchToFilters(value).forEach(filter => { this.props.addFilter(filter) }) + + this.props.setSearchTermAsync('') } private handleFilterDelete = (id: string): void => { diff --git a/ui/src/logs/utils/search.ts b/ui/src/logs/utils/search.ts index de3fe2e1d..125043fb6 100644 --- a/ui/src/logs/utils/search.ts +++ b/ui/src/logs/utils/search.ts @@ -25,11 +25,17 @@ const getPattern = (type: TermType, phrase: TermPart) => { } } -export const searchToFilters = ( - searchTerm: string, - rules: TermRule[] -): Filter[] => { - const allTerms = extractTermRules(searchTerm, rules) +export const LOG_SEARCH_TERMS: TermRule[] = [ + createRule(TermPart.SINGLE_QUOTED, TermType.EXCLUDE), + createRule(TermPart.DOUBLE_QUOTED, TermType.EXCLUDE), + createRule(TermPart.SINGLE_QUOTED), + createRule(TermPart.DOUBLE_QUOTED), + createRule(TermPart.UNQUOTED_WORD, TermType.EXCLUDE), + createRule(TermPart.UNQUOTED_WORD), +] + +export const searchToFilters = (searchTerm: string): Filter[] => { + const allTerms = extractTermRules(searchTerm, LOG_SEARCH_TERMS) return termsToFilters(allTerms) } diff --git a/ui/test/logs/utils/logFilters.test.ts b/ui/test/logs/utils/logFilters.test.ts new file mode 100644 index 000000000..0da5352dd --- /dev/null +++ b/ui/test/logs/utils/logFilters.test.ts @@ -0,0 +1,164 @@ +import {searchToFilters} from 'src/logs/utils/search' +import {Operator} from 'src/types/logs' + +describe('Logs.Search.logFilters', () => { + const isUUID = expect.stringMatching( + /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/ + ) + + it('can return like filters for terms', () => { + const text = 'seq_!@.#: TERMS /api/search' + const actual = searchToFilters(text) + + const expected = [ + { + id: isUUID, + key: 'message', + value: 'seq_!@.#:', + operator: Operator.LIKE, + }, + { + id: isUUID, + key: 'message', + value: 'TERMS', + operator: Operator.LIKE, + }, + { + id: isUUID, + key: 'message', + value: '/api/search', + operator: Operator.LIKE, + }, + ] + + expect(actual).toEqual(expected) + }) + + it('can return not like filters for term exclusions', () => { + const text = '/api/search -status_bad -@123!' + const actual = searchToFilters(text) + + const expected = [ + { + id: isUUID, + key: 'message', + value: 'status_bad', + operator: Operator.NOT_LIKE, + }, + { + id: isUUID, + key: 'message', + value: '@123!', + operator: Operator.NOT_LIKE, + }, + { + id: isUUID, + key: 'message', + value: '/api/search', + operator: Operator.LIKE, + }, + ] + + expect(actual).toEqual(expected) + }) + + it('can create filters for phrases', () => { + const text = '"/api/search status:200" "a success"' + const actual = searchToFilters(text) + + const expected = [ + { + id: isUUID, + key: 'message', + value: '/api/search status:200', + operator: Operator.LIKE, + }, + { + id: isUUID, + key: 'message', + value: 'a success', + operator: Operator.LIKE, + }, + ] + + expect(actual).toEqual(expected) + }) + + it('can create filters for excluded phrases', () => { + const text = '-"/api/search status:200" -"a success"' + const actual = searchToFilters(text) + + const expected = [ + { + id: isUUID, + key: 'message', + value: '/api/search status:200', + operator: Operator.NOT_LIKE, + }, + { + id: isUUID, + key: 'message', + value: 'a success', + operator: Operator.NOT_LIKE, + }, + ] + + expect(actual).toEqual(expected) + }) + + it('can create filters for phrases and terms', () => { + const text = `status:4\d{2} -"NOT FOUND" 'some "quote"' -thing` + const actual = searchToFilters(text) + + const expected = [ + { + id: isUUID, + key: 'message', + value: 'NOT FOUND', + operator: Operator.NOT_LIKE, + }, + { + id: isUUID, + key: 'message', + value: 'some "quote"', + operator: Operator.LIKE, + }, + { + id: isUUID, + key: 'message', + value: 'thing', + operator: Operator.NOT_LIKE, + }, + { + id: isUUID, + key: 'message', + value: 'status:4d{2}', + operator: Operator.LIKE, + }, + ] + + expect(actual).toEqual(expected) + }) + + it('cannot handle double quoted phrase containing single quotes', () => { + const text = `"some 'quote'"` + const actual = searchToFilters(text) + + const expected = [ + { + id: isUUID, + key: 'message', + value: 'quote', + operator: Operator.LIKE, + }, + { + id: isUUID, + key: 'message', + value: 'some', + operator: Operator.LIKE, + }, + ] + + expect(actual).toEqual(expected) + }) +})