Как проверить схему graphql с фрагментированными документами - PullRequest
0 голосов
/ 23 января 2020

Я подумал, что было бы здорово поддержать проверку схемы на уровне модульного теста, чтобы мы могли знать о нарушении изменений в запросах при обновлении нашего 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([])
    })
  }
})

Как я могу сказать загрузчику, что я нахожусь в другом каталоге относительно фрагмента?

1 Ответ

0 голосов
/ 23 января 2020

Я понял это. Ключ должен был использовать require вместо fs.readFileSync

import glob from 'glob'
import { validate } from 'graphql/validation'
import schema from 'api/lib/app/graphql/schema'
import path from 'path'

const gqlDir = path.join(__dirname, '..')
const queryDir = path.join(gqlDir, 'queries', 'shared')
const pattern = `${queryDir}/!(fragments)*.graphql`

const getGraphqlFiles = () => glob.sync(pattern)

describe('rent-js-api schema', () => {
  const files = getGraphqlFiles()
  files.forEach(file => {
    /* eslint-disable import/no-dynamic-require */
    const document = require(file)

    it(`${file} passes validation`, () => {
      const errors = validate(
        schema,
        document,
      )

      expect(errors).toEqual([])
    })
  })
})

, вот jest.config. json

{
  "setupFiles": [
    "<rootDir>/test/jest/shim.js",
    "<rootDir>/test/jest/setup.js"
  ],
  "moduleDirectories": ["node_modules", "src", "test/jest", "test"],
  "collectCoverage": false,
  "testMatch": ["**/*-test.js"],
  "collectCoverageFrom": [
    "**/src/**/*.{js,ts,jsx,tsx}",
    "!**/src/**/*-test.js",
    "!**/index.{ts,js}",
    "!**/src/**/const.{ts,js}",
    "!**/ui/theme/**",
    "!**/src/**/*.d.{ts,tsx}",
    "!**/node_modules/**",
    "!**/src/ui/*/themes/**"
  ],
  "coverageDirectory": "./coverage",
  "moduleNameMapper": {
    "\\.(css|scss)$": "<rootDir>/test/jest/noop-styles",
    "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/test/jest/noop-binary",
    "^.+\\.html$": "<rootDir>/test/jest/htmlLoader"
  },
  "moduleFileExtensions": [
    "graphql",
    "js",
    "json",
    "ts",
    "tsx"
  ],
  "transform": {
    "^.+\\.jsx?$": "babel-jest",
    "^.+\\.tsx?$": "babel-jest",
    "^.+\\.graphql$": "jest-transform-graphql"
  },
  "testPathIgnorePatterns": [
    "<rootDir>/node_modules/",
    "^.*__tests__/__helpers__.*"
  ],
  "snapshotSerializers": [
    "enzyme-to-json/serializer",
    "jest-serializer-html"
  ]
}
...