@searchkit/schema
Version:
Elasticsearch GraphQL Resolvers
172 lines (163 loc) • 4.98 kB
text/typescript
import nock from 'nock'
import { SearchkitConfig } from '@searchkit/sdk'
import { MultiMatchQuery } from '@searchkit/sdk'
import { RangeFacet, RefinementSelectFacet, DateRangeFacet } from '@searchkit/sdk'
import { setupTestServer, callQuery } from './support/helper'
import HitsMock from './__mock-data__/HitResolver/Hits.json'
describe('Summary Resolver', () => {
describe('should return as expected', () => {
const runQuery = async (gql) => {
const response = await callQuery({ gql })
return response
}
const config: SearchkitConfig = {
host: 'http://localhost:9200',
index: 'movies',
hits: {
fields: ['actors']
},
sortOptions: [
{ id: 'relevance', label: 'Relevance', field: '_score' },
{ id: 'released', label: 'Recent Releases', field: { released: 'desc' } }
],
query: new MultiMatchQuery({ fields: ['actors', 'title^4', 'plot'] }),
facets: [
new RefinementSelectFacet({
identifier: 'actors',
field: 'actors.keyword',
label: 'Actors'
}),
new RefinementSelectFacet({ identifier: 'type', field: 'type', label: 'Type' }),
new RefinementSelectFacet({
identifier: 'genres',
field: 'genres.keyword',
label: 'Genres'
}),
new RangeFacet({
identifier: 'imdbrating',
field: 'imdbrating',
label: 'IMDB Rating',
range: {
interval: 10,
max: 100,
min: 0
}
}),
new DateRangeFacet({ identifier: 'released', field: 'released', label: 'Release' })
]
}
it('should return correct summary', async () => {
setupTestServer({
config,
addToQueryType: true,
typeName: 'ResultSet',
hitTypeName: 'ResultHit'
})
const gql = `
{
results(query: "", filters: [
{ identifier: "actors", value: "Jeff Lindsay" },
{ identifier: "imdbrating", min: 0, max: 50 },
{ identifier: "released", dateMin: "2012-12-18T00:00:00.000Z", dateMax: "2020-12-18T00:00:00.000Z" }
]) {
summary {
total
appliedFilters {
id
identifier
label
display
... on DateRangeSelectedFilter {
dateMin
dateMax
}
... on NumericRangeSelectedFilter {
min
max
}
... on ValueSelectedFilter {
value
}
}
sortOptions {
id
label
}
query
}
hits(page: {size: 10, from: 0 }) {
items {
id
}
page {
total
totalPages
pageNumber
from
size
}
}
}
}
`
const scope = nock('http://localhost:9200')
.post('/movies/_search')
.reply((uri, body) => {
expect(body).toMatchInlineSnapshot(`
Object {
"_source": Object {
"includes": Array [
"actors",
],
},
"aggs": Object {},
"from": 0,
"post_filter": Object {
"bool": Object {
"must": Array [
Object {
"bool": Object {
"must": Array [
Object {
"term": Object {
"actors.keyword": "Jeff Lindsay",
},
},
],
},
},
Object {
"range": Object {
"imdbrating": Object {
"gte": 0,
"lte": 50,
},
},
},
Object {
"range": Object {
"released": Object {
"gte": "2012-12-18T00:00:00.000Z",
"lte": "2020-12-18T00:00:00.000Z",
},
},
},
],
},
},
"size": 10,
"sort": Array [
Object {
"_score": "desc",
},
],
}
`)
return [200, HitsMock]
})
const response = await runQuery(gql)
expect(response.body.data).toMatchSnapshot()
expect(response.status).toEqual(200)
})
})
})