Я подумал, что было бы здорово поддержать проверку схемы на уровне модульного теста, чтобы мы могли знать о нарушении изменений в запросах при обновлении нашего API
. Я бы хотел настроить тест так, что он поддерживает автоматическое обнаружение любых новых *.graphql
файлов, но при этом процесс jest считает, что текущий рабочий каталог находится в __tests__
, поэтому, когда я оцениваю документ graphql вручную с загрузчиком, относительные фрагменты в запросах, подобных этому, завершаются неудачно :
#import "./fragments/FullUserData.graphql"
query User(
$zid: String!
) {
user {
userData: get(
zid: $zid
) {
...FullUserData
}
}
}
сообщение об ошибке:
Error: Cannot find module './fragments/FullUserData.graphql' from 'schemaValidation-test.js'"
Если я переместу папку фрагментов в __tests__
dir, тест будет успешным. Любые идеи о том, что я могу сделать, чтобы обмануть оценку для обработки фрагмента, как если бы я был относительно каталога фрагментов?
__tests__/
- schemaValidation-test.js
queries/
- someQuery.graphql
- fragments/someFragment.graphql
Я пытался process.chdir()
к каталогу запросов изнутри шутка, но не игра в кости
вот валидатор:
// __tests__/schemaValidation-test.js
import glob from 'glob'
import { validate } from 'graphql/validation'
import loader from 'graphql-tag/loader'
import schema from 'api/lib/app/graphql/schema'
import path from 'path'
import fs from 'fs'
const gqlDir = path.join(__dirname, '..')
const queryDir = path.join(gqlDir, 'queries', 'shared')
const pattern = `${queryDir}/!(fragments)*.graphql`
const getGraphqlFiles = () => glob.sync(pattern)
describe('api schema', () => {
const files = getGraphqlFiles()
for(var file of files) {
const buffer = fs.readFileSync(file)
let document = (buffer || "").toString()
try {
document = eval(loader.call(
{ cacheable: () => ({}) },
document
))
} catch (e) {
fail(`could not parse ${file}, ${e}`)
}
it(`${file} passes validation`, () => {
const errors = validate(
schema,
document,
)
expect(errors).toEqual([])
})
}
})
Как я могу сказать загрузчику, что я нахожусь в другом каталоге относительно фрагмента?