@searchkit/schema
Version:
Elasticsearch GraphQL Resolvers
250 lines (231 loc) • 6.5 kB
text/typescript
import nock from 'nock'
import { SearchkitConfig } from '@searchkit/sdk'
import { MultiMatchQuery } from '@searchkit/sdk'
import { RefinementSelectFacet } from '@searchkit/sdk'
import { setupTestServer, callQuery } from '../support/helper'
import FacetMock from '../__mock-data__/FacetResolver/Facet.json'
describe('Facet 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', 'writers']
},
query: new MultiMatchQuery({ fields: ['actors', 'writers', 'title^4', 'plot'] }),
facets: [
new RefinementSelectFacet({
identifier: 'writers',
field: 'writers.raw',
label: 'Writers',
multipleSelect: true
})
]
}
it('should return correct Results', async () => {
setupTestServer({
config,
addToQueryType: true,
typeName: 'ResultSet',
hitTypeName: 'ResultHit'
})
const gql = `
{
results(query: "") {
facet(identifier: "writers", query: "te") {
identifier
type
label
display
entries {
count
label
}
}
}
}
`
const scope = nock('http://localhost:9200')
.post('/movies/_search')
.reply((uri, body) => {
expect(body).toMatchInlineSnapshot(`
Object {
"_source": Object {
"includes": Array [
"actors",
"writers",
],
},
"aggs": Object {
"facet_bucket_all": Object {
"aggs": Object {
"writers": Object {
"terms": Object {
"field": "writers.raw",
"include": "[tT][eE].*",
"size": 5,
},
},
},
"filter": Object {
"bool": Object {
"must": Array [],
},
},
},
},
"from": 0,
"size": 0,
"sort": Array [
Object {
"_score": "desc",
},
],
}
`)
return [200, FacetMock]
})
const response = await runQuery(gql)
expect(response.body.data).toMatchSnapshot()
expect(response.status).toEqual(200)
})
it('Adjust size at query time', async () => {
setupTestServer({
config,
addToQueryType: true,
typeName: 'ResultSet',
hitTypeName: 'ResultHit'
})
const gql = `
{
results(query: "") {
facet(identifier: "writers", size: 20) {
identifier
type
label
display
entries {
count
label
}
}
}
}
`
const scope = nock('http://localhost:9200')
.post('/movies/_search')
.reply((uri, body: any) => {
expect(body.aggs.facet_bucket_all.aggs.writers.terms.size).toEqual(20)
return [200, FacetMock]
})
const response = await runQuery(gql)
expect(response.status).toEqual(200)
})
it('Adjust size at configuration', async () => {
setupTestServer({
config: {
...config,
facets: [
new RefinementSelectFacet({
identifier: 'writers',
field: 'writers.raw',
label: 'Writers',
multipleSelect: true,
size: 30
})
]
},
typeName: 'ResultSet',
hitTypeName: 'ResultHit',
addToQueryType: true
})
const gql = `
{
results(query: "") {
facet(identifier: "writers") {
identifier
type
label
display
entries {
count
label
}
}
}
}
`
const scope = nock('http://localhost:9200')
.post('/movies/_search')
.reply((uri, body: any) => {
expect(body.aggs.facet_bucket_all.aggs.writers.terms.size).toEqual(30)
return [200, FacetMock]
})
const response = await runQuery(gql)
expect(response.status).toEqual(200)
})
it('multiple facet queries', async () => {
setupTestServer({
config: {
...config,
facets: [
new RefinementSelectFacet({
identifier: 'writers',
field: 'writers.raw',
label: 'Writers',
multipleSelect: true
}),
new RefinementSelectFacet({
identifier: 'actors',
field: 'actors.raw',
label: 'Actors'
})
]
},
typeName: 'ResultSet',
hitTypeName: 'ResultHit',
addToQueryType: true
})
const gql = `
{
results(query: "") {
writersFacet: facet(identifier: "writers") {
identifier
type
label
display
entries {
count
label
}
}
actorsFacet: facet(identifier: "actors") {
identifier
type
label
display
entries {
count
label
}
}
}
}
`
const scope = nock('http://localhost:9200')
.post('/movies/_search')
.reply((uri, body: any) => {
expect(Object.keys(body.aggs.facet_bucket_all.aggs)).toEqual(['writers', 'actors'])
return [200, FacetMock]
})
const response = await runQuery(gql)
expect(response.body.data.results.writersFacet).not.toBeNull()
expect(response.body.data.results.actorsFacet).not.toBeNull()
expect(response.status).toEqual(200)
})
})
})