Configuring and Executing Search Error Testing in the Pipeline
Error testing is a crucial aspect of building resilient and robust search applications. This documentation provides a guide on how to simulate and handle different error conditions within a search pipeline, including HTTP status codes like 500, 404, and 401, as well as testing timeouts, slow queries, and invalid filters or sorting criteria. These tests help ensure that your system gracefully handles various failure scenarios, improving the user experience during unexpected situations.
We leverage the condition filters to trigger these error cases based on specific queries. This allows developers and QA teams to validate their system’s responses under controlled error conditions.
For a detailed exploration of this topic, check out the Medium article:
- Mastering Error Testing for a Search Application.
- https://medium.com/@tbwin/mastering-error-testing-for-a-search-application-53c4d3c79629
Use this guide as a reference for configuring and executing search error tests in your pipeline and ensure your search experience is reliable even in challenging situations.
Testing http status code 500
- query: 500
- !!com.quasiris.qsc.condition.QscJexlConditionActionFilter
active: true
id: search-pipeline.SearchFilterTrackingFilter.500
conditions:
- "c.queryStartsWith('500')"
actions:
- "a.throwRuntimeException('error testing')"
Testing http status code 404
- query: 404
- !!com.quasiris.qsc.condition.QscJexlConditionActionFilter
active: true
id: search-pipeline.SearchFilterTrackingFilter.404
conditions:
- "c.queryStartsWith('404')"
actions:
- "a.throwHttpClientStatusException(404, '404')"
Testing http status code 404
- query: 404
- !!com.quasiris.qsc.condition.QscJexlConditionActionFilter
active: true
id: search-pipeline.SearchFilterTrackingFilter.404
conditions:
- "c.queryStartsWith('404')"
actions:
- "a.throwHttpClientStatusException(404, '404')"
Testing Timeout
- query: timeout
- !!com.quasiris.qsc.condition.QscJexlConditionActionFilter
active: true
id: search-pipeline.SearchFilterTrackingFilter.sleep
conditions:
- "c.queryStartsWith('timeout')"
actions:
- "a.sleep(10000L)"
Testing slow queries
- query: sleep sneaker
- !!com.quasiris.qsc.condition.QscJexlConditionActionFilter
active: true
id: search-pipeline.SearchFilterTrackingFilter.sleep
conditions:
- "c.queryStartsWith('sleep')"
actions:
- "a.rewriteQuery('sleep ', '')"
- "a.sleep(5000L)"
Testing error when using a filter
- use the invalid filter
- !!com.quasiris.qsc.condition.QscJexlConditionActionFilter
active: true
id: search-pipeline.SearchFilterTrackingFilter.datePickerError
conditions:
- "c.hasFilter('datePickerError')"
actions:
- "a.throwRuntimeException('invalid filter')"
Testing error when using a sort criteria
- configure a sort option that has an invalid sort criteria configuration
- use the sort option
[{"price":{"order":"foo"}}]
The whole example
!!com.quasiris.qsf.pipeline.Pipeline
id: search-pipeline
timeout: 8000
filterList:
- !!com.quasiris.qsf.pipeline.filter.DebugFilter
active: true
id: search-pipeline.DebugFilter
- !!com.quasiris.qsc.search.service.query.QscSearchQueryFilter
active: true
id: search-pipeline.SearchFilterTrackingFilter
- !!com.quasiris.qsc.condition.QscJexlConditionActionFilter
active: true
id: search-pipeline.SearchFilterTrackingFilter.500
conditions:
- "c.queryStartsWith('500')"
actions:
- "a.throwRuntimeException('error testing')"
- !!com.quasiris.qsc.condition.QscJexlConditionActionFilter
active: true
id: search-pipeline.SearchFilterTrackingFilter.404
conditions:
- "c.queryStartsWith('404')"
actions:
- "a.throwHttpClientStatusException(404, '404')"
- !!com.quasiris.qsc.condition.QscJexlConditionActionFilter
active: true
id: search-pipeline.SearchFilterTrackingFilter.401
conditions:
- "c.queryStartsWith('401')"
actions:
- "a.throwQscSecurityException()"
- !!com.quasiris.qsc.condition.QscJexlConditionActionFilter
active: true
id: search-pipeline.SearchFilterTrackingFilter.sleep
conditions:
- "c.queryStartsWith('timeout')"
actions:
- "a.sleep(10000L)"
- !!com.quasiris.qsc.condition.QscJexlConditionActionFilter
active: true
id: search-pipeline.SearchFilterTrackingFilter.sleep
conditions:
- "c.queryStartsWith('sleep')"
actions:
- "a.rewriteQuery('sleep ', '')"
- "a.sleep(5000L)"
- !!com.quasiris.qsc.condition.QscJexlConditionActionFilter
active: true
id: search-pipeline.SearchFilterTrackingFilter.datePickerError
conditions:
- "c.hasFilter('datePickerError')"
actions:
- "a.throwRuntimeException('invalid filter')"
- !!com.quasiris.qsc.tracking.SearchFilterTrackingFilter
active: true
id: search-pipeline.SearchFilterTrackingFilter
- !!com.quasiris.qsc.search.service.rules.QueryRuleFilter
active: true
baseUrl: {{ searchIndexBaseUrl }}
env: {{ env }}
id: queryRuleFilter
- !!com.quasiris.qsf.pipeline.filter.elastic.ElasticFilter
active: true
baseUrl: {{searchIndexBaseUrl}}
id: searchElasticFilter
resultSetId: {{searchCode}}
queryTransformer: !!com.quasiris.qsc.search.service.QscSearchQueryTransformer
profile: {{profile}}
searchResultTransformer: !!com.quasiris.qsc.search.service.QscResultTransformer
elasticSearchClient: !!com.quasiris.qsf.commons.elasticsearch.client.ElasticSearchClient
useApacheClient: false
- !!com.quasiris.qsf.pipeline.filter.ConditionFilter
active: true
condition: !!com.quasiris.qsf.pipeline.filter.conditions.EmptyResultCondition
resultSetId: {{searchCode}}
id: conditional.isSpellcheck
pipeline:
filterList:
- !!com.quasiris.qsf.pipeline.filter.TokenizerFilter
active: true
id: qsc-spellcheck.TokenizerFilter
- !!com.quasiris.qsf.pipeline.filter.elastic.SpellCheckElasticFilter
active: true
baseUrl: {{searchIndexBaseUrl}}-spellcheck
id: qsc-spellcheck.SpellCheckElasticFilter
maxTokenLenght: 10
minTokenLenght: 4
minTokenWeight: 1
sentenceScoringEnabled: false
restartPipelineId: search-pipeline
id: qsc-spellcheck
timeout: 1000
- !!com.quasiris.qsf.pipeline.filter.QSFQLResponseRefinementFilter
active: true
id: search-pipeline.QSFQLResponseRefinementFilter
resultId: {{searchCode}}
- !!com.quasiris.qsf.pipeline.filter.elastic.ElasticTrackingFilter
active: true
baseUrl: {{trackingIndexBaseUrl}}
customParameter:
app: search
searchCode: {{searchCode}}
tenantCode: {{tenant}}
env: {{env}}
id: search-pipeline.ElasticTrackingFilter
idFieldName: id
resultSetId: {{searchCode}}
rotation: none
trackingId: null