A repo to test subgraph libraries compatibility with the Apollo Federation Specification
TypeScriptMIT
Apollo Federation Subgraph Library Compatibility Testing Strategy
The purpose of this repository is to provide a centralized strategy focused on understanding a given subgraph library's compatibility against the Apollo Federation Specification.
Latest Results
The following open-source GraphQL server libraries provide support for Apollo Federation and are included in our test suite.
This repository contains a structured testing suite based on a federated schema that covers the Apollo Federation Specification. The federated schema is constructued of 3 subgraphs (users, inventory and products) that will be started and used to test various libraries that support Apollo Federation. The users and inventory subgraphs are provided by this repository in addition to the graph router instance. Library implementors will each implement the products schema and provide a docker file that can be used with docker compose; templates for these files are provided along with examples.
Subgraph Schemas
Users
typeUser@key(fields: "email") {
email: ID!name: StringtotalProductsCreated: Int
}
_service - support a rover subgraph introspect command (this is the Apollo Federation equivalent of Introspection for subgraphs)
query { _service { sdl } }
@key and _entities - support defining a single @key, multiple @key definitions, multiple-fields @key and a complex fields @key. Below is an example of the single @key query that is sent from the graph router to the implementing products subgraph (the variables will be changed to test all @key definitions):
This will be tested through a query covering Product.delivery where the library implementors dimensions { size weight } will need to be an expected { size: "1", weight: 1 } to pass. Example query that will be sent directly to products subgraph.
@provides - This will be covered by the library implementors at Product.createdBy where they will be expected to provide the User.totalProductsCreated to be anythingother than 4
extends or @extends - This is covered in the products subgraph extension of the User
ftv1 (Federated Traces version 1) - A query with the apollo-federated-include-trace:ftv1 header will be sent to the products subgraph which should return a value for the extensions.ftv1 in the result.
NOTE: In the initial release of this testing strategy, we will not be validating ftv1 to ensure it's in the proper format
@link
Must be seen as a valid schema directive in the subgraph library service sdl. Is verified by checking for its inclusion in the query { _service { sdl } } result.
@tag
Must be seen as a valid schema directive in the subgraph library service sdl. Is verified by checking for its inclusion in the query { _service { sdl } } result.
@shareable
Must be seen as a valid schema directive in the subgraph library service sdl. Is verified by checking for its inclusion in the query { _service { sdl } } result. Must also be able to query shareable types.
@override
Must be seen as a valid schema directive in the subgraph library service sdl. Is verified by checking for its inclusion in the query { _service { sdl } } result. Must also be able to return the value of an overridden field.
@inaccessible
Must be seen as a valid schema directive in the subgraph library service sdl. Is verified by checking for its inclusion in the query { _service { sdl } } result. Must also be able to query inaccessible fields from the Products schema.
Setting up the testing suite
npm install
npm run setup
npm run build - compiles typescript code and composes supergraph SDL
npm run docker - build docker images for graph-router, users and inventory
Running the Test
npm run test will test all folders in the implementations folder. You can provide a comma separated string as an additional argument to test only specific libraries.
Test Results
A results.md file will be created that displays the testing results
Contributing a new library to this test suite
Fork this repository and navigate to the Apollo Federation Library Maintainers Implementation Guide for implementation instructions. Once you've completed the implementations instructions, feel free to create a PR and we'll review it. If you have any questions please open a GitHub issue on this repository.