@searchkit/sdk
Version:
Elasticsearch Universal SDK for Searchkit
99 lines (87 loc) • 3.38 kB
text/typescript
import nock from 'nock'
import SearchkitRequest, { MultiMatchQuery, SearchkitConfig, VisibleWhen } from '../../src'
import { FacetSelectedRule, RefinementSelectFacet } from '../../src/facets'
import ResultsNoHitsMock from '../__mock-data__/Facets/results-no-hits.json'
import QueryManager from '../../src/core/QueryManager'
describe('Visible When Rule system', () => {
it('success', async () => {
const customRule = jest.fn((queryManager: QueryManager, ctx: any) => true)
const config: SearchkitConfig = {
host: 'http://localhost:9200',
index: 'movies',
hits: {
fields: ['actors', 'writers']
},
query: new MultiMatchQuery({ fields: ['actors', 'writers', 'title^4', 'plot'] }),
facets: [
new RefinementSelectFacet({ identifier: 'type', field: 'type.raw', label: 'Type' }),
VisibleWhen(
[
new RefinementSelectFacet({
identifier: 'writers',
field: 'writers.raw',
label: 'Writers',
display: 'override',
multipleSelect: true
}),
new RefinementSelectFacet({
identifier: 'actors',
field: 'actors.raw',
label: 'Actors'
}),
new RefinementSelectFacet({
identifier: 'genres',
field: 'genres.raw',
label: 'Genres'
})
],
[FacetSelectedRule('type', 'Movie'), customRule]
)
]
}
const request = SearchkitRequest(config)
const scope = nock('http://localhost:9200')
.post('/movies/_search')
.reply(200, (uri, body) => {
const facetFieldRequests = (body as any).aggs.facet_bucket_all.aggs
expect(facetFieldRequests).toBeTruthy()
expect(facetFieldRequests.type.terms.field).toBe('type.raw')
expect(Object.keys(facetFieldRequests)).toHaveLength(1)
return ResultsNoHitsMock
})
let response = await request.execute({
facets: true
})
expect(response).toMatchSnapshot()
expect(response.facets).toHaveLength(1)
expect(response.facets.map((f) => f.identifier)).toEqual(['type'])
nock('http://localhost:9200')
.post('/movies/_search')
.reply(200, (uri, body) => {
const facetFieldRequests = (body as any).aggs.facet_bucket_all.aggs
expect(facetFieldRequests).toBeTruthy()
expect(facetFieldRequests.type.terms.field).toBe('type.raw')
expect(Object.keys(facetFieldRequests).sort()).toEqual(['type', 'actors', 'genres'].sort())
return ResultsNoHitsMock
})
request.setFilters([{ identifier: 'type', value: 'Movie' }])
response = await request.execute({
facets: true
})
expect(response).toMatchSnapshot()
expect(response.facets).toHaveLength(4)
expect(response.facets.map((f) => f.identifier).sort()).toEqual(
['type', 'writers', 'genres', 'actors'].sort()
)
customRule.mockReturnValueOnce(false)
nock('http://localhost:9200')
.post('/movies/_search')
.reply(200, (uri, body) => ResultsNoHitsMock)
response = await request.execute({
facets: true
})
expect(response).toMatchSnapshot()
expect(response.facets).toHaveLength(1)
expect(response.facets.map((f) => f.identifier).sort()).toEqual(['type'].sort())
})
})