@graphql-hive/federation-gateway-audit
Version:
Audit tool for Apollo Federation Gateway
241 lines (228 loc) • 4.73 kB
JavaScript
'use strict';
var testkit = require('./testkit-CAf-AsDy.cjs');
require('@apollo/composition');
require('graphql');
require('fets');
require('@apollo/subgraph');
require('graphql-yoga');
const products = [
{
id: "p1",
price: 699.99
}
];
var a = testkit.createSubgraph("a", {
typeDefs: (
/* GraphQL */
`
extend schema
@link(url: "https://specs.apollo.dev/federation/v2.3", import: ["@key"])
type Query {
product: Product
}
type Product @key(fields: "id") {
id: ID!
price: Float!
}
`
),
resolvers: {
Query: {
product() {
return {
id: products[0].id,
price: products[0].price
};
}
},
Product: {
__resolveReference(key) {
const product = products.find((product2) => product2.id === key.id);
if (!product) {
return null;
}
return {
id: product.id,
price: product.price
};
}
}
}
});
var b = testkit.createSubgraph("b", {
typeDefs: (
/* GraphQL */
`
extend schema
@link(
url: "https://specs.apollo.dev/federation/v2.3"
import: ["@key", "@external", "@requires"]
)
type Product @key(fields: "id") {
id: ID!
price: Float! @external
isExpensive: Boolean! @requires(fields: "price")
}
`
),
resolvers: {
Product: {
__resolveReference(key) {
const product = products.find((product2) => product2.id === key.id);
if (!product) {
return null;
}
if ("price" in key) {
return {
id: product.id,
price: key.price
};
}
return {
id: product.id
};
},
isExpensive(product) {
if (!product.price) {
throw new Error("Price is missing");
}
return product.price > 500;
}
}
}
});
var c = testkit.createSubgraph("c", {
typeDefs: (
/* GraphQL */
`
extend schema
@link(
url: "https://specs.apollo.dev/federation/v2.3"
import: ["@key", "@external", "@requires"]
)
type Product @key(fields: "id") {
id: ID!
isExpensive: Boolean! @external
include: Boolean! @requires(fields: "isExpensive")
skip: Boolean! @requires(fields: "isExpensive")
neverCalledInclude: Boolean! @requires(fields: "isExpensive")
neverCalledSkip: Boolean! @requires(fields: "isExpensive")
}
`
),
resolvers: {
Product: {
__resolveReference(key) {
const product = products.find((product2) => product2.id === key.id);
if (!product) {
return null;
}
if ("isExpensive" in key) {
return {
id: product.id,
isExpensive: key.isExpensive
};
}
return {
id: product.id
};
},
include(product) {
if (typeof product.isExpensive !== "boolean") {
throw new Error("isExpensive is missing");
}
return true;
},
neverCalledInclude() {
throw new Error("neverCalledInclude should not be called");
},
skip(product) {
if (typeof product.isExpensive !== "boolean") {
throw new Error("isExpensive is missing");
}
return true;
},
neverCalledSkip() {
throw new Error("neverCalledSkip should not be called");
}
}
}
});
var test = [
testkit.createTest(
/* GraphQL */
`
query ($bool: Boolean = false) {
product {
price
neverCalledInclude @include(if: $bool)
}
}
`,
{
data: {
product: {
price: 699.99
}
}
}
),
testkit.createTest(
/* GraphQL */
`
query ($bool: Boolean = true) {
product {
price
neverCalledSkip @skip(if: $bool)
}
}
`,
{
data: {
product: {
price: 699.99
}
}
}
),
testkit.createTest(
/* GraphQL */
`
query ($bool: Boolean = true) {
product {
price
include @include(if: $bool)
}
}
`,
{
data: {
product: {
price: 699.99,
include: true
}
}
}
),
testkit.createTest(
/* GraphQL */
`
query ($bool: Boolean = false) {
product {
price
skip @skip(if: $bool)
}
}
`,
{
data: {
product: {
price: 699.99,
skip: true
}
}
}
)
];
var index = testkit.serve("include-skip", [a, b, c], test);
exports.default = index;