Add tests for log filters

pull/4163/head
Delmer Reed 2018-08-13 11:11:51 -04:00
parent 95e1523429
commit 6008c21e8c
4 changed files with 178 additions and 19 deletions

View File

@ -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),
]

View File

@ -44,7 +44,6 @@ import {getDeep} from 'src/utils/wrappers'
import {colorForSeverity} from 'src/logs/utils/colors' import {colorForSeverity} from 'src/logs/utils/colors'
import OverlayTechnology from 'src/reusable_ui/components/overlays/OverlayTechnology' import OverlayTechnology from 'src/reusable_ui/components/overlays/OverlayTechnology'
import {SeverityFormatOptions, SEVERITY_SORTING_ORDER} from 'src/logs/constants' import {SeverityFormatOptions, SEVERITY_SORTING_ORDER} from 'src/logs/constants'
import {LOG_SEARCH_TERMS} from 'src/logs/constants/search'
import {Source, Namespace} from 'src/types' import {Source, Namespace} from 'src/types'
@ -532,9 +531,11 @@ class LogsPage extends Component<Props, State> {
} }
private handleSubmitSearch = (value: string): void => { private handleSubmitSearch = (value: string): void => {
searchToFilters(value, LOG_SEARCH_TERMS).forEach(filter => { searchToFilters(value).forEach(filter => {
this.props.addFilter(filter) this.props.addFilter(filter)
}) })
this.props.setSearchTermAsync('')
} }
private handleFilterDelete = (id: string): void => { private handleFilterDelete = (id: string): void => {

View File

@ -25,11 +25,17 @@ const getPattern = (type: TermType, phrase: TermPart) => {
} }
} }
export const searchToFilters = ( export const LOG_SEARCH_TERMS: TermRule[] = [
searchTerm: string, createRule(TermPart.SINGLE_QUOTED, TermType.EXCLUDE),
rules: TermRule[] createRule(TermPart.DOUBLE_QUOTED, TermType.EXCLUDE),
): Filter[] => { createRule(TermPart.SINGLE_QUOTED),
const allTerms = extractTermRules(searchTerm, rules) 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) return termsToFilters(allTerms)
} }

View File

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