Add tests for log filters
parent
95e1523429
commit
6008c21e8c
|
@ -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),
|
|
||||||
]
|
|
|
@ -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 => {
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
})
|
||||||
|
})
|
Loading…
Reference in New Issue