UNPKG

@graphql-hive/federation-gateway-audit

Version:
708 lines (689 loc) 13 kB
'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", username: "u1-username", age: 11 }, { id: "u2", name: "u2-name", username: "u2-username", age: 22 } ]; const accounts = [ { __typename: "Admin", id: "u1", name: "Alice", isMain: false, isActive: true }, { __typename: "Admin", id: "u2", name: "Bob", isMain: true, isActive: true }, { __typename: "Regular", id: "u3", name: "Charlie", isMain: false, isActive: true } ]; var a = testkit.createSubgraph("a", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@shareable"] ) type Query { users: [NodeWithName!]! } interface NodeWithName @key(fields: "id") { id: ID! name: String } type User implements NodeWithName @key(fields: "id") { id: ID! name: String age: Int } interface Account @key(fields: "id") { id: ID! } type Admin implements Account @key(fields: "id") { id: ID! isMain: Boolean! isActive: Boolean! @shareable } type Regular implements Account @key(fields: "id") { id: ID! isMain: Boolean! } ` ), resolvers: { NodeWithName: { __resolveReference(key) { const node = users.find((u) => u.id === key.id); if (!node) { return null; } return { __typename: "User", id: node.id, name: node.name, age: node.age }; } }, User: { __resolveReference(key) { const user = users.find((u) => u.id === key.id); if (!user) { return null; } return { __typename: "User", id: user.id, name: user.name, age: user.age }; } }, Account: { __resolveReference(key) { const account = accounts.find((account2) => account2.id === key.id); if (!account) { return null; } return { __typename: account.__typename, id: account.id, isActive: account.isActive }; } }, Admin: { __resolveReference(key) { const admin = accounts.find((account) => account.id === key.id); if (!admin) { return null; } if (admin.__typename !== "Admin") { return null; } return { __typename: admin.__typename, id: admin.id, isMain: admin.isMain, isActive: admin.isActive }; }, isMain(admin) { if (typeof admin.isMain === "boolean") { return admin.isMain; } const account = accounts.find((a) => a.id === admin.id); if (!account) { return null; } return account.isMain; } }, Regular: { __resolveReference(key) { const admin = accounts.find((account) => account.id === key.id); if (!admin) { return null; } return { __typename: admin.__typename, id: admin.id, isMain: admin.isMain, isActive: admin.isActive }; }, isMain(admin) { if (typeof admin.isMain === "boolean") { return admin.isMain; } const account = accounts.find((a) => a.id === admin.id); if (!account) { return null; } return account.isMain; } }, Query: { users() { return users.map((u) => ({ __typename: "User", id: u.id, name: u.name, age: u.age })); } } } }); var b = testkit.createSubgraph("b", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@interfaceObject", "@shareable"] ) type Query { anotherUsers: [NodeWithName] accounts: [Account] @shareable } type Account @key(fields: "id") @interfaceObject { id: ID! name: String! } type NodeWithName @key(fields: "id") @interfaceObject { id: ID! username: String } ` ), resolvers: { NodeWithName: { __resolveReference(key) { const node = users.find((u) => u.id === key.id); if (!node) { return null; } return { __typename: "User", id: node.id, username: node.username }; }, username(node) { const user = users.find((u) => u.id === node.id); if (!user) { return null; } return user.username; } }, Account: { __resolveReference(key) { const account = accounts.find((account2) => account2.id === key.id); if (!account) { return null; } return { // I deliberately return a wrong __typename here to make sure it's not used by the gateway __typename: "Never", id: account.id }; }, name(account) { return accounts.find((u) => u.id === account.id)?.name; } }, Query: { anotherUsers() { return users.map((u) => ({ __typename: "User", id: u.id, username: u.username })); }, accounts() { return accounts.map((user) => { return { // I deliberately return a wrong __typename here to make sure it's not used by the gateway __typename: "Never", id: user.id }; }); } } } }); var c = testkit.createSubgraph("c", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@interfaceObject", "@shareable"] ) type Account @key(fields: "id") @interfaceObject { id: ID! isActive: Boolean! @shareable } ` ), resolvers: { Account: { __resolveReference(key) { const account = accounts.find((account2) => account2.id === key.id); if (!account) { return null; } return { // I deliberately return a wrong __typename here to make sure it's not used by the gateway __typename: "Never", id: account.id }; }, isActive(account) { return false; } }, Query: { accounts() { return accounts.map((user) => { return { // I deliberately return a wrong __typename here to make sure it's not used by the gateway __typename: "Never", id: user.id }; }); } } } }); var test = [ testkit.createTest( /* GraphQL */ ` query { anotherUsers { id name username } } `, { data: { anotherUsers: [ { id: "u1", name: "u1-name", username: "u1-username" }, { id: "u2", name: "u2-name", username: "u2-username" } ] } } ), testkit.createTest( /* GraphQL */ ` query { users { id name username } } `, { data: { users: [ { id: "u1", name: "u1-name", username: "u1-username" }, { id: "u2", name: "u2-name", username: "u2-username" } ] } } ), testkit.createTest( /* GraphQL */ ` query { anotherUsers { ... on User { age } } } `, { data: { anotherUsers: [ { age: 11 }, { age: 22 } ] } } ), testkit.createTest( /* GraphQL */ ` query { users { ... on User { age } } } `, { data: { users: [ { age: 11 }, { age: 22 } ] } } ), testkit.createTest( /* GraphQL */ ` query { anotherUsers { ... on User { age id name username } id name } } `, { data: { anotherUsers: [ { age: 11, id: "u1", name: "u1-name", username: "u1-username" }, { age: 22, id: "u2", name: "u2-name", username: "u2-username" } ] } } ), testkit.createTest( /* GraphQL */ ` query { users { ... on User { age id name username } id name } } `, { data: { users: [ { age: 11, id: "u1", name: "u1-name", username: "u1-username" }, { age: 22, id: "u2", name: "u2-name", username: "u2-username" } ] } } ), testkit.createTest( /* GraphQL */ ` query { users { ... on User { age id name username } id name } } `, { data: { users: [ { age: 11, id: "u1", name: "u1-name", username: "u1-username" }, { age: 22, id: "u2", name: "u2-name", username: "u2-username" } ] } } ), testkit.createTest( /* GraphQL */ ` query { accounts { name } } `, { data: { accounts: [ { name: "Alice" }, { name: "Bob" }, { name: "Charlie" } ] } } ), testkit.createTest( /* GraphQL */ ` query { accounts { ... on Admin { name } } } `, { data: { accounts: [ { name: "Alice" }, { name: "Bob" }, {} ] } } ), testkit.createTest( /* GraphQL */ ` query { accounts { name # NOTE # __typename is not available in the interfaceObject, needs to be resolved indirectly __typename } } `, { data: { accounts: [ { name: "Alice", __typename: "Admin" }, { name: "Bob", __typename: "Admin" }, { name: "Charlie", __typename: "Regular" } ] } } ), testkit.createTest( /* GraphQL */ ` query { accounts { ... on Admin { __typename } } } `, { data: { accounts: [ { __typename: "Admin" }, { __typename: "Admin" }, {} ] } } ), testkit.createTest( /* GraphQL */ ` query { accounts { id isActive } } `, { data: { accounts: [ { id: "u1", isActive: false }, { id: "u2", isActive: false }, { id: "u3", isActive: false } ] } } ), testkit.createTest( /* GraphQL */ ` query { accounts { # NOTE # id is available in the interfaceObject and can be resolved as there's no type condition involved id ... on Admin { isActive } } } `, { data: { accounts: [ { id: "u1", isActive: true }, { id: "u2", isActive: true }, { id: "u3" } ] } } ) ]; var index = testkit.serve("simple-interface-object", [a, b, c], test); exports.default = index;