@searchkit/schema
Version:
Elasticsearch GraphQL Resolvers
143 lines (137 loc) • 4.21 kB
text/typescript
import nock from 'nock'
import { SearchkitConfig, MultiMatchQuery } from '../src/index'
import { setupTestServer, callQuery } from './support/helper'
import HitsMock from './__mock-data__/HitResolver/Hits.json'
describe('Base Query', () => {
const runQuery = async (query = '', page = { size: 10, from: 0 }, sorting?: string) => {
const gql = `
{
results( query: "heat", filters: [{ identifier: "type", value: "movie"}]) {
hits {
items {
... on ResultHit {
id
fields {
writers
actors
}
}
}
}
}
}
`
const response = await callQuery({ gql })
return response
}
it('should return correct Results', async () => {
const moviesSearchConfig: SearchkitConfig = {
host: 'http://localhost:9200',
index: 'movies',
hits: {
fields: ['actors', 'writers']
},
query: new MultiMatchQuery({ fields: ['actors', 'writers', 'title^4', 'plot'] })
}
setupTestServer({
typeName: 'ResultSet',
hitTypeName: 'ResultHit',
config: moviesSearchConfig,
addToQueryType: true,
getBaseFilters: (parent, parameters, ctx) => {
expect(parent).toBe(undefined)
expect(parameters).toBeDefined()
expect(ctx).toBeDefined()
return [{ term: { status: 'published' } }]
}
})
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 {
"term": Object {
"status": "published",
},
},
],
"should": Array [
Object {
"multi_match": Object {
"fields": Array [
"actors",
"writers",
"title^4",
"plot",
],
"operator": "and",
"query": "heat",
"type": "best_fields",
},
},
Object {
"multi_match": Object {
"fields": Array [
"actors",
"writers",
"title^4",
"plot",
],
"query": "heat",
"type": "cross_fields",
},
},
Object {
"multi_match": Object {
"fields": Array [
"actors",
"writers",
"title^4",
"plot",
],
"query": "heat",
"type": "phrase",
},
},
Object {
"multi_match": Object {
"fields": Array [
"actors",
"writers",
"title^4",
"plot",
],
"query": "heat",
"type": "phrase_prefix",
},
},
],
},
},
"size": 10,
"sort": Array [
Object {
"_score": "desc",
},
],
}
`)
return [200, HitsMock]
})
const response = await runQuery()
expect(response.body.data).toMatchSnapshot('userhits')
expect(response.status).toEqual(200)
})
})