@searchkit/schema
Version:
Elasticsearch GraphQL Resolvers
293 lines (279 loc) • 7.68 kB
text/typescript
import nock from 'nock'
import { NumericRangeFilter, SearchkitConfig } from '@searchkit/sdk'
import { callQuery, setupTestServer } from '../support/helper'
import HitsMock from '../__mock-data__/HitResolver/Hits.json'
describe('Numeric Range Filter', () => {
const runQuery = async (filters = '') => {
const gql = `
{
results( query: "heat", filters: [${filters}]) {
summary {
appliedFilters {
id
... on ValueSelectedFilter {
value
label
display
}
... on NumericRangeSelectedFilter {
min
max
label
display
}
}
}
}
}
`
const response = await callQuery({ gql })
return response
}
it('should apply filter with min and max', async () => {
const moviesSearchConfig: SearchkitConfig = {
host: 'http://localhost:9200',
index: 'movies',
hits: {
fields: ['actors', 'writers']
},
filters: [
new NumericRangeFilter({
identifier: 'imdbRating',
field: 'imdbRating',
label: 'IMDB Rating'
})
]
}
setupTestServer({
typeName: 'ResultSet',
hitTypeName: 'ResultHit',
config: moviesSearchConfig,
addToQueryType: true
})
const scope = nock('http://localhost:9200')
.post('/movies/_search')
.reply((uri, body) => {
expect(body).toMatchInlineSnapshot(`
Object {
"_source": Object {
"includes": Array [
"actors",
"writers",
],
},
"aggs": Object {},
"from": 0,
"query": Object {
"bool": Object {
"filter": Array [
Object {
"bool": Object {
"filter": Array [
Object {
"range": Object {
"imdbRating": Object {
"gte": 2,
"lte": 6,
},
},
},
],
},
},
],
},
},
"size": 0,
"sort": Array [
Object {
"_score": "desc",
},
],
}
`)
return [200, HitsMock]
})
const response = await runQuery('{ identifier: "imdbRating", min: 2, max: 6 }')
expect(response.body.data).toMatchInlineSnapshot(`
Object {
"results": Object {
"summary": Object {
"appliedFilters": Array [
Object {
"display": "RangeFilter",
"id": "imdbRating_2_6",
"label": "IMDB Rating",
"max": 6,
"min": 2,
},
],
},
},
}
`)
})
it('should apply filter with min only', async () => {
const moviesSearchConfig: SearchkitConfig = {
host: 'http://localhost:9200',
index: 'movies',
hits: {
fields: ['actors', 'writers']
},
filters: [
new NumericRangeFilter({
identifier: 'imdbRating',
field: 'imdbRating',
label: 'IMDB Rating'
})
]
}
setupTestServer({
typeName: 'ResultSet',
hitTypeName: 'ResultHit',
config: moviesSearchConfig,
addToQueryType: true
})
const scope = nock('http://localhost:9200')
.post('/movies/_search')
.reply((uri, body) => {
expect(body).toMatchInlineSnapshot(`
Object {
"_source": Object {
"includes": Array [
"actors",
"writers",
],
},
"aggs": Object {},
"from": 0,
"query": Object {
"bool": Object {
"filter": Array [
Object {
"bool": Object {
"filter": Array [
Object {
"range": Object {
"imdbRating": Object {
"gte": 2,
},
},
},
],
},
},
],
},
},
"size": 0,
"sort": Array [
Object {
"_score": "desc",
},
],
}
`)
return [200, HitsMock]
})
const response = await runQuery('{ identifier: "imdbRating", min: 2 }')
expect(response.body.data).toMatchInlineSnapshot(`
Object {
"results": Object {
"summary": Object {
"appliedFilters": Array [
Object {
"display": "RangeFilter",
"id": "imdbRating_2_undefined",
"label": "IMDB Rating",
"max": null,
"min": 2,
},
],
},
},
}
`)
})
it('should apply filter with max only', async () => {
const moviesSearchConfig: SearchkitConfig = {
host: 'http://localhost:9200',
index: 'movies',
hits: {
fields: ['actors', 'writers']
},
filters: [
new NumericRangeFilter({
identifier: 'imdbRating',
field: 'imdbRating',
label: 'IMDB Rating'
})
]
}
setupTestServer({
typeName: 'ResultSet',
hitTypeName: 'ResultHit',
config: moviesSearchConfig,
addToQueryType: true
})
const scope = nock('http://localhost:9200')
.post('/movies/_search')
.reply((uri, body) => {
expect(body).toMatchInlineSnapshot(`
Object {
"_source": Object {
"includes": Array [
"actors",
"writers",
],
},
"aggs": Object {},
"from": 0,
"query": Object {
"bool": Object {
"filter": Array [
Object {
"bool": Object {
"filter": Array [
Object {
"range": Object {
"imdbRating": Object {
"lte": 2,
},
},
},
],
},
},
],
},
},
"size": 0,
"sort": Array [
Object {
"_score": "desc",
},
],
}
`)
return [200, HitsMock]
})
const response = await runQuery('{ identifier: "imdbRating", max: 2 }')
expect(response.body.data).toMatchInlineSnapshot(`
Object {
"results": Object {
"summary": Object {
"appliedFilters": Array [
Object {
"display": "RangeFilter",
"id": "imdbRating_undefined_2",
"label": "IMDB Rating",
"max": 2,
"min": null,
},
],
},
},
}
`)
})
})