Skip to content

Commit 883d183

Browse files
authored
fix: monolithic schema version promotion (#8243)
1 parent 6f23583 commit 883d183

4 files changed

Lines changed: 119 additions & 1 deletion

File tree

.changeset/nine-cows-create.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'hive': patch
3+
---
4+
5+
Fix unexpected exception that could be raised when promoting a schema version within a monolithic project.

integration-tests/tests/api/schema/promotion.spec.ts

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,3 +1021,113 @@ test.concurrent('promote delete schema version results in correct state', async
10211021
expect(serviceDeletedVersion.valid).toEqual(true);
10221022
expect(promotedVersion.supergraph).toEqual(serviceDeletedVersion.supergraph);
10231023
});
1024+
1025+
test.concurrent('promote monolith schema version succeeds', async ({ expect }) => {
1026+
const { createOrg } = await initSeed().createOwner();
1027+
const { createProject, createOrganizationAccessToken } = await createOrg();
1028+
const { target, fetchVersions } = await createProject(ProjectType.Single);
1029+
const { privateAccessKey } = await createOrganizationAccessToken({
1030+
resources: {
1031+
mode: ResourceAssignmentModeType.All,
1032+
},
1033+
permissions: [
1034+
'schemaVersion:publish',
1035+
'target:modifySettings',
1036+
'project:describe',
1037+
'schemaVersion:promote',
1038+
],
1039+
});
1040+
1041+
await publishSchema(
1042+
{
1043+
author: 'a',
1044+
commit: 'a',
1045+
sdl: /* GraphQL */ `
1046+
type Query {
1047+
a: String!
1048+
}
1049+
`,
1050+
target: {
1051+
byId: target.id,
1052+
},
1053+
},
1054+
privateAccessKey,
1055+
).then(r => r.expectNoGraphQLErrors());
1056+
await publishSchema(
1057+
{
1058+
author: 'b',
1059+
commit: 'b',
1060+
sdl: /* GraphQL */ `
1061+
type Query {
1062+
b: String!
1063+
}
1064+
`,
1065+
target: {
1066+
byId: target.id,
1067+
},
1068+
},
1069+
privateAccessKey,
1070+
).then(r => r.expectNoGraphQLErrors());
1071+
1072+
const [publishedVersion, versionToPromote] = await fetchVersions(2);
1073+
assertNonNullish(versionToPromote);
1074+
assertNonNullish(publishedVersion);
1075+
expect(versionToPromote.sdl).toContain('a: String!');
1076+
1077+
let promoteResult = await schemaVersionPromote(
1078+
{
1079+
source: {
1080+
fromSchemaVersionById: versionToPromote.id,
1081+
},
1082+
target: {
1083+
toTarget: {
1084+
byId: target.id,
1085+
},
1086+
},
1087+
},
1088+
privateAccessKey,
1089+
).then(r => r.expectNoGraphQLErrors());
1090+
1091+
expect(promoteResult.schemaVersionPromote.error).toEqual(null);
1092+
assertNonNullish(promoteResult.schemaVersionPromote.ok);
1093+
let promotedVersionDetails = await getSchemaVersionWithAllDetails(
1094+
target.id,
1095+
promoteResult.schemaVersionPromote.ok.newSchemaVersion.id,
1096+
privateAccessKey,
1097+
);
1098+
assertNonNull(promotedVersionDetails);
1099+
expect(promotedVersionDetails.origin).toEqual({
1100+
__typename: 'SchemaVersionPromoteOrigin',
1101+
schemaVersionId: versionToPromote.id,
1102+
});
1103+
expect(promotedVersionDetails.sdl).toContain('a: String!');
1104+
1105+
// why not also publish another version just to be sure
1106+
promoteResult = await schemaVersionPromote(
1107+
{
1108+
source: {
1109+
fromSchemaVersionById: publishedVersion.id,
1110+
},
1111+
target: {
1112+
toTarget: {
1113+
byId: target.id,
1114+
},
1115+
},
1116+
},
1117+
privateAccessKey,
1118+
).then(r => r.expectNoGraphQLErrors());
1119+
1120+
expect(promoteResult.schemaVersionPromote.error).toEqual(null);
1121+
assertNonNullish(promoteResult.schemaVersionPromote.ok);
1122+
promotedVersionDetails = await getSchemaVersionWithAllDetails(
1123+
target.id,
1124+
promoteResult.schemaVersionPromote.ok.newSchemaVersion.id,
1125+
privateAccessKey,
1126+
);
1127+
assertNonNull(promotedVersionDetails);
1128+
expect(promotedVersionDetails.origin).toEqual({
1129+
__typename: 'SchemaVersionPromoteOrigin',
1130+
schemaVersionId: publishedVersion.id,
1131+
});
1132+
expect(promotedVersionDetails.sdl).toContain('b: String!');
1133+
});

packages/services/api/src/modules/schema/providers/schema-version-helper.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,9 @@ export class SchemaVersionHelper {
409409
} satisfies ResolversUnionTypes<any>['SubgraphDiff'];
410410
}
411411
if (edge.type === 'added') {
412+
invariant(!!edge.node.service_name, 'node of edge cannot be null');
413+
invariant(!!edge.node.service_url, 'url of edge cannot be null');
414+
412415
return {
413416
__typename: 'SubgraphDiffAdded',
414417
subgraphVersion: {

packages/services/api/src/modules/schema/providers/schema-version-store.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1777,7 +1777,7 @@ export type SchemaLogDiffInput = {
17771777

17781778
const SchemaLogWithEdgesModel = z.union([
17791779
SchemaLogEdgeAddedModel.extend({
1780-
node: CompositePushSchemaLogModel,
1780+
node: z.union([CompositePushSchemaLogModel, SinglePushSchemaLogModel]),
17811781
}),
17821782
SchemaLogEdgeChangedModel.extend({
17831783
node: z.union([CompositePushSchemaLogModel, SinglePushSchemaLogModel]),

0 commit comments

Comments
 (0)