DenoでGraphQL
目的
大体以下のパターンがテストできれば良い
正常系
異常系
クエリ不正(schema定義で弾かれるやつ)
データ不正(データがないときとか)
テストを書く手間を可能な限り減らしたい
課題
スキーマ定義を手書きしない GitHubのスキーマ定義をダウンロードして使用できる GitHubのschema定義に従ってバリデーションしたい buildSchemaでschema定義がそのまま利用可能
テストデータ自動生成
やり方
denoでgraphql-jsを使う
httpでクエリを受け取って、graphql-jsでschema、query、resolverを定義してリクエストを処理する
resolverのモックデータがunionまたインターフェイスの場合は__typenameプロパティを入れる必要がある
サンプルコード
code:ts
import { Issue, PageInfo, SearchResultItemConnection } from "./types.d.ts";
const schema = buildSchema(await Deno.readTextFile("./schema.docs.graphql"));
const resolvers = {
search: (
{ type, query, first }: { type: string; query: string; first?: number },
): SearchResultItemConnection => {
const issues = [
{
id: "1",
title: "hello",
},
{
id: "2",
title: "world",
},
] as Issue[];
return {
codeCount: 1,
discussionCount: 1,
issueCount: 1,
nodes: issues.map((issue) => {
issue.__typename = "Issue";
return issue;
}),
pageInfo: {
hasNextPage: false,
hasPreviousPage: false,
} as PageInfo,
repositoryCount: 1,
userCount: 1,
wikiCount: 1,
};
},
};
serve(async (req: Request) => {
const text = await req.text();
const body = JSON.parse(text);
const resp = await graphql({
schema,
source: body.query,
variableValues: body.variables,
rootValue: resolvers,
});
return new Response(JSON.stringify(resp), {
headers: { "Content-Type": "application/json" },
});
}, { port: 8080 });
テストクエリ
code:gql:query
query {
search(type: ISSUE, query: "is:Issue", first:1) {
nodes {
... on Issue {
id
title
}
}
}
}
レスポンス
code:json:response
{
"data": {
"search": {
"nodes": [
{
"id": "1",
"title": "hello"
},
{
"id": "2",
"title": "world"
}
]
}
}
}
coc-nvim で graphql のスキーマ定義で定義ジャンプする方法
coc-graphql をインストール
プロジェクトのルートに.graphqlrc.yamlを置く
code:.graphqlrc.yaml
schema: './schema.docs.graphql' # スキーマファイルを指定