@graphql-hive/federation-gateway-audit
Version:
Audit tool for Apollo Federation Gateway
508 lines (494 loc) • 10.2 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 users = [
{
id: "u1",
name: "u1-name"
}
];
var a = testkit.createSubgraph("a", {
typeDefs: (
/* GraphQL */
`
extend schema
@link(
url: "https://specs.apollo.dev/federation/v2.3"
import: ["@shareable"]
)
type User {
id: ID @shareable
}
type Query {
users: [User!]!
}
`
),
resolvers: {
Query: {
users() {
return users.map((u) => ({ __typename: "User", id: u.id }));
}
}
}
});
function accounts() {
return [
...users.map((user) => ({ __typename: "User", ...user })),
{ __typename: "Admin", id: "a1", name: "a1-name" }
];
}
var b = testkit.createSubgraph("b", {
typeDefs: (
/* GraphQL */
`
extend schema
@link(
url: "https://specs.apollo.dev/federation/v2.3"
import: ["@shareable", "@key"]
)
union Account = User | Admin
type User @key(fields: "id") {
id: ID!
name: String
similarAccounts: [Account!]!
}
type Admin {
id: ID
name: String @shareable
similarAccounts: [Account!]!
}
type Query {
accounts: [Account!]!
}
`
),
resolvers: {
Query: {
accounts
},
User: {
__resolveReference(key) {
return users.find((user) => user.id === key.id);
},
similarAccounts: accounts
},
Admin: {
similarAccounts: accounts
}
}
});
var test = [
testkit.createTest(
/* GraphQL */
`
{
users {
id
name
}
accounts {
... on User {
id
name
}
... on Admin {
id
name
}
}
}
`,
{
data: {
users: [
{
id: "u1",
name: "u1-name"
}
],
accounts: [
{
id: "u1",
name: "u1-name"
},
{
id: "a1",
name: "a1-name"
}
]
}
}
),
testkit.createTest(
/* GraphQL */
`
query NestedInternalAlias {
users {
id
name
}
accounts {
... on User {
id
name
similarAccounts {
... on User {
id
name
}
... on Admin {
id
name
}
}
}
... on Admin {
id
name
similarAccounts {
... on User {
id
name
}
... on Admin {
id
name
}
}
}
}
}
`,
{
data: {
users: [
{
id: "u1",
name: "u1-name"
}
],
accounts: [
{
id: "u1",
name: "u1-name",
similarAccounts: [
{
id: "u1",
name: "u1-name"
},
{
id: "a1",
name: "a1-name"
}
]
},
{
id: "a1",
name: "a1-name",
similarAccounts: [
{
id: "u1",
name: "u1-name"
},
{
id: "a1",
name: "a1-name"
}
]
}
]
}
}
),
testkit.createTest(
/* GraphQL */
`
query DeeplyNestedInternalAlias {
users {
id
name
}
accounts {
... on User {
id
name
similarAccounts {
... on User {
id
name
similarAccounts {
... on User {
id
name
}
... on Admin {
id
name
}
}
}
... on Admin {
id
name
similarAccounts {
... on User {
id
name
}
... on Admin {
id
name
}
}
}
}
}
... on Admin {
id
name
similarAccounts {
... on User {
id
name
similarAccounts {
... on User {
id
name
}
... on Admin {
id
name
}
}
}
... on Admin {
id
name
similarAccounts {
... on User {
id
name
}
... on Admin {
id
name
}
}
}
}
}
}
}
`,
{
data: {
users: [
{
id: "u1",
name: "u1-name"
}
],
accounts: [
{
id: "u1",
name: "u1-name",
similarAccounts: [
{
id: "u1",
name: "u1-name",
similarAccounts: [
{
id: "u1",
name: "u1-name"
},
{
id: "a1",
name: "a1-name"
}
]
},
{
id: "a1",
name: "a1-name",
similarAccounts: [
{
id: "u1",
name: "u1-name"
},
{
id: "a1",
name: "a1-name"
}
]
}
]
},
{
id: "a1",
name: "a1-name",
similarAccounts: [
{
id: "u1",
name: "u1-name",
similarAccounts: [
{
id: "u1",
name: "u1-name"
},
{
id: "a1",
name: "a1-name"
}
]
},
{
id: "a1",
name: "a1-name",
similarAccounts: [
{
id: "u1",
name: "u1-name"
},
{
id: "a1",
name: "a1-name"
}
]
}
]
}
]
}
}
),
testkit.createTest(
/* GraphQL */
`
query DeeplyNested {
accounts {
... on User {
name
similarAccounts {
... on User {
name
similarAccounts {
... on User {
name
}
... on Admin {
name
}
}
}
... on Admin {
name
similarAccounts {
... on User {
name
}
... on Admin {
name
}
}
}
}
}
... on Admin {
name
similarAccounts {
... on User {
name
similarAccounts {
... on User {
name
}
... on Admin {
name
}
}
}
... on Admin {
name
similarAccounts {
... on User {
name
}
... on Admin {
name
}
}
}
}
}
}
}
`,
{
data: {
accounts: [
{
name: "u1-name",
similarAccounts: [
{
name: "u1-name",
similarAccounts: [
{
name: "u1-name"
},
{
name: "a1-name"
}
]
},
{
name: "a1-name",
similarAccounts: [
{
name: "u1-name"
},
{
name: "a1-name"
}
]
}
]
},
{
name: "a1-name",
similarAccounts: [
{
name: "u1-name",
similarAccounts: [
{
name: "u1-name"
},
{
name: "a1-name"
}
]
},
{
name: "a1-name",
similarAccounts: [
{
name: "u1-name"
},
{
name: "a1-name"
}
]
}
]
}
]
}
}
)
];
var index = testkit.serve("child-type-mismatch", [a, b], test);
exports.default = index;