From b48d8643c5239692e15fd4ad6f6bfa44a9408782 Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Wed, 7 Aug 2024 16:17:36 -0700 Subject: [PATCH 1/3] add test cases to show min join version is used for various fed versions --- composition-js/src/__tests__/compose.test.ts | 33 ++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/composition-js/src/__tests__/compose.test.ts b/composition-js/src/__tests__/compose.test.ts index e0a538fab..fe2f5d066 100644 --- a/composition-js/src/__tests__/compose.test.ts +++ b/composition-js/src/__tests__/compose.test.ts @@ -4655,6 +4655,39 @@ describe('composition', () => { const authenticatedDirectiveExists = schema.directives().find(d => d.name === 'authenticated'); expect(authenticatedDirectiveExists).toBeUndefined(); }); + + describe('uses minimum required spec versions', () => { + function subgraphWithFederationSpecVersion(version: string) { + const schemaString = ` + extend schema @link(url: "https://specs.apollo.dev/federation/v${version}", import: ["@key"]) + + type Query { + a: A + } + + type A @key(fields: "id") { + id: ID! + } + `; + return { + typeDefs: gql`${schemaString}`, + name: 'subgraphA', + }; + } + + it.each([ + { subgraphFedVersion: "2.4", expectedJoinVersion: "0.3"}, + { subgraphFedVersion: "2.5", expectedJoinVersion: "0.3"}, + { subgraphFedVersion: "2.6", expectedJoinVersion: "0.3"}, + { subgraphFedVersion: "2.7", expectedJoinVersion: "0.4"}, + { subgraphFedVersion: "2.8", expectedJoinVersion: "0.5" }, + ])("federation -> join versions", ({ subgraphFedVersion, expectedJoinVersion }) => { + const subgraph = subgraphWithFederationSpecVersion(subgraphFedVersion); + const result = composeServices([subgraph]); + assertCompositionSuccess(result); + expect(result.supergraphSdl).toContain(`join/v${expectedJoinVersion}`); + }); + }); }); describe('@source* directives', () => { From b28555eb733dbf457f55d8ba1cc9b84b9af4453e Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Thu, 8 Aug 2024 13:18:06 -0700 Subject: [PATCH 2/3] cover all fed versions --- composition-js/src/__tests__/compose.test.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/composition-js/src/__tests__/compose.test.ts b/composition-js/src/__tests__/compose.test.ts index fe2f5d066..879161d08 100644 --- a/composition-js/src/__tests__/compose.test.ts +++ b/composition-js/src/__tests__/compose.test.ts @@ -4676,10 +4676,14 @@ describe('composition', () => { } it.each([ - { subgraphFedVersion: "2.4", expectedJoinVersion: "0.3"}, - { subgraphFedVersion: "2.5", expectedJoinVersion: "0.3"}, - { subgraphFedVersion: "2.6", expectedJoinVersion: "0.3"}, - { subgraphFedVersion: "2.7", expectedJoinVersion: "0.4"}, + { subgraphFedVersion: "2.0", expectedJoinVersion: "0.3" }, + { subgraphFedVersion: "2.1", expectedJoinVersion: "0.3" }, + { subgraphFedVersion: "2.2", expectedJoinVersion: "0.3" }, + { subgraphFedVersion: "2.3", expectedJoinVersion: "0.3" }, + { subgraphFedVersion: "2.4", expectedJoinVersion: "0.3" }, + { subgraphFedVersion: "2.5", expectedJoinVersion: "0.3" }, + { subgraphFedVersion: "2.6", expectedJoinVersion: "0.3" }, + { subgraphFedVersion: "2.7", expectedJoinVersion: "0.4" }, { subgraphFedVersion: "2.8", expectedJoinVersion: "0.5" }, ])("federation -> join versions", ({ subgraphFedVersion, expectedJoinVersion }) => { const subgraph = subgraphWithFederationSpecVersion(subgraphFedVersion); From 538444847ae6608f4f571f63d8f2ff8618471f54 Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Thu, 8 Aug 2024 13:22:57 -0700 Subject: [PATCH 3/3] add a comment about why join v0.3 for fed 2.0 --- internals-js/src/specs/joinSpec.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internals-js/src/specs/joinSpec.ts b/internals-js/src/specs/joinSpec.ts index bd45fa212..cb4640000 100644 --- a/internals-js/src/specs/joinSpec.ts +++ b/internals-js/src/specs/joinSpec.ts @@ -287,6 +287,10 @@ export class JoinSpecDefinition extends FeatureDefinition { export const JOIN_VERSIONS = new FeatureDefinitions(joinIdentity) .add(new JoinSpecDefinition(new FeatureVersion(0, 1))) .add(new JoinSpecDefinition(new FeatureVersion(0, 2))) + // Though join v0.2 supports federation v2.0 as mentioned above, we should + // still prefer join v0.3 as a minimum for all of federation v2.0-2.6 since + // v0.3 offers improvements around union members and enum values that we're + // interested in. .add(new JoinSpecDefinition(new FeatureVersion(0, 3), new FeatureVersion(2, 0))) .add(new JoinSpecDefinition(new FeatureVersion(0, 4), new FeatureVersion(2, 7))) .add(new JoinSpecDefinition(new FeatureVersion(0, 5), new FeatureVersion(2, 8)));