Skip to content

Commit 6eb27de

Browse files
izumin5210claude
andauthored
test: add comprehensive tests for printer functions (#441)
## Summary This PR adds comprehensive snapshot tests for the printer functions in both protoc-gen-pothos and protoc-gen-nexus packages, ensuring code generation quality and consistency. ## What's Changed - Added test coverage for all printer functions: , , , and - Total of 63 test cases covering various protobuf patterns and edge cases - Support for multiple protobuf implementations: ts-proto, protobuf-es, google-protobuf, protobufjs - Snapshot testing to track generated code output and detect regressions ## Test Coverage - Simple and complex message types - Nested types and enums - Oneof fields (required and optional) - Empty messages - Extension fields - Edge cases like squashed unions and cross-package imports ## Benefits - Provides confidence when making changes to code generation logic - Documents expected output for various input patterns - Enables safe refactoring of printer implementations - Catches unintended changes in generated code 🤖 Generated with [Claude Code](https://claude.ai/code) --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent d9d7475 commit 6eb27de

File tree

22 files changed

+6053
-79
lines changed

22 files changed

+6053
-79
lines changed

packages/@proto-graphql/codegen-core/package.json

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,7 @@
22
"name": "@proto-graphql/codegen-core",
33
"version": "0.5.2",
44
"description": "",
5-
"keywords": [
6-
"graphql",
7-
"grpc",
8-
"nexus",
9-
"protobuf",
10-
"typescript"
11-
],
5+
"keywords": ["graphql", "grpc", "nexus", "protobuf", "typescript"],
126
"repository": "git@github.com:proto-graphql/proto-graphql-js.git",
137
"author": "izumin5210 <m@izum.in>",
148
"license": "MIT",
@@ -28,12 +22,7 @@
2822
}
2923
}
3024
},
31-
"files": [
32-
"src/",
33-
"dist/",
34-
"!src/**/*.test.ts",
35-
"!src/**/__tests__/"
36-
],
25+
"files": ["src/", "dist/", "!src/**/*.test.ts", "!src/**/__tests__/"],
3726
"sideEffects": false,
3827
"private": false,
3928
"publishConfig": {

packages/@proto-graphql/protoc-plugin-helpers/package.json

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,7 @@
22
"name": "@proto-graphql/protoc-plugin-helpers",
33
"version": "0.4.2",
44
"description": "",
5-
"keywords": [
6-
"graphql",
7-
"grpc",
8-
"nexus",
9-
"protobuf",
10-
"typescript"
11-
],
5+
"keywords": ["graphql", "grpc", "nexus", "protobuf", "typescript"],
126
"repository": "git@github.com:proto-graphql/proto-graphql-js.git",
137
"author": "izumin5210 <m@izum.in>",
148
"license": "MIT",
@@ -28,12 +22,7 @@
2822
}
2923
}
3024
},
31-
"files": [
32-
"src/",
33-
"dist/",
34-
"!src/**/*.test.ts",
35-
"!src/**/__tests__/"
36-
],
25+
"files": ["src/", "dist/", "!src/**/*.test.ts", "!src/**/__tests__/"],
3726
"sideEffects": false,
3827
"private": false,
3928
"publishConfig": {

packages/@proto-graphql/scalars-protobuf-es/package.json

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,7 @@
22
"name": "@proto-graphql/scalars-protobuf-es",
33
"version": "0.4.2",
44
"description": "",
5-
"keywords": [
6-
"graphql",
7-
"grpc",
8-
"protobuf",
9-
"typescript"
10-
],
5+
"keywords": ["graphql", "grpc", "protobuf", "typescript"],
116
"repository": "git@github.com:proto-graphql/proto-graphql-js.git",
127
"author": "izumin5210 <m@izum.in>",
138
"license": "MIT",
@@ -27,12 +22,7 @@
2722
}
2823
}
2924
},
30-
"files": [
31-
"src/",
32-
"dist/",
33-
"!src/**/*.test.ts",
34-
"!src/**/__tests__/"
35-
],
25+
"files": ["src/", "dist/", "!src/**/*.test.ts", "!src/**/__tests__/"],
3626
"sideEffects": false,
3727
"private": false,
3828
"publishConfig": {

packages/@proto-nexus/proto-fields-plugin/package.json

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,7 @@
22
"name": "@proto-nexus/proto-fields-plugin",
33
"version": "0.5.6",
44
"description": "Nexus plugin for building subset types from proto-nexus's artifacts",
5-
"keywords": [
6-
"graphql",
7-
"grpc",
8-
"nexus",
9-
"protobuf",
10-
"typescript"
11-
],
5+
"keywords": ["graphql", "grpc", "nexus", "protobuf", "typescript"],
126
"repository": "git@github.com:proto-graphql/proto-graphql-js.git",
137
"author": "izumin5210 <m@izum.in>",
148
"license": "MIT",
@@ -30,12 +24,7 @@
3024
"engines": {
3125
"node": ">= 14.0.0"
3226
},
33-
"files": [
34-
"src/",
35-
"dist/",
36-
"!src/**/*.test.ts",
37-
"!src/**/__tests__/"
38-
],
27+
"files": ["src/", "dist/", "!src/**/*.test.ts", "!src/**/__tests__/"],
3928
"peerDependencies": {
4029
"nexus": "^1.0.0"
4130
},

packages/protoc-gen-nexus/package.json

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,7 @@
22
"name": "protoc-gen-nexus",
33
"version": "0.8.2",
44
"description": "Generate DSL for GraphQL Nexus from Protocol Buffers IDL",
5-
"keywords": [
6-
"graphql",
7-
"grpc",
8-
"nexus",
9-
"protobuf",
10-
"typescript"
11-
],
5+
"keywords": ["graphql", "grpc", "nexus", "protobuf", "typescript"],
126
"bin": {
137
"protoc-gen-nexus": "./bin/protoc-gen-nexus.cjs"
148
},
@@ -31,13 +25,7 @@
3125
}
3226
}
3327
},
34-
"files": [
35-
"bin/",
36-
"src/",
37-
"dist/",
38-
"!src/**/*.test.ts",
39-
"!src/**/__tests__/"
40-
],
28+
"files": ["bin/", "src/", "dist/", "!src/**/*.test.ts", "!src/**/__tests__/"],
4129
"sideEffects": false,
4230
"private": false,
4331
"publishConfig": {
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2+
3+
exports[`createEnumTypeCode > google-protobuf > 'generates code for a simple enum' 1`] = `
4+
"import { enumType } from "nexus";
5+
6+
export const MyEnum = enumType({
7+
"name": "MyEnum",
8+
"members": [{ "name": "FOO", "value": 1, "extensions": { "protobufEnumValue": { "name": "MY_ENUM_FOO" } } }, {
9+
"name": "BAR",
10+
"value": 2,
11+
"description": "This is Bar.",
12+
"extensions": { "protobufEnumValue": { "name": "MY_ENUM_BAR" } },
13+
}, { "name": "BAZ", "value": 3, "extensions": { "protobufEnumValue": { "name": "MY_ENUM_BAZ" } } }],
14+
"extensions": {
15+
"protobufEnum": { "name": "MyEnum", "fullName": "testapi.enums.MyEnum", "package": "testapi.enums" },
16+
},
17+
});
18+
"
19+
`;
20+
21+
exports[`createEnumTypeCode > google-protobuf > 'generates code for an enum without un…' 1`] = `
22+
"import { enumType } from "nexus";
23+
24+
export const MyEnumWithoutUnspecified = enumType({
25+
"name": "MyEnumWithoutUnspecified",
26+
"members": [{
27+
"name": "FOO",
28+
"value": 0,
29+
"extensions": { "protobufEnumValue": { "name": "MY_ENUM_WITHOUT_UNSPECIFIED_FOO" } },
30+
}, {
31+
"name": "BAR",
32+
"value": 1,
33+
"extensions": { "protobufEnumValue": { "name": "MY_ENUM_WITHOUT_UNSPECIFIED_BAR" } },
34+
}, {
35+
"name": "BAZ",
36+
"value": 2,
37+
"extensions": { "protobufEnumValue": { "name": "MY_ENUM_WITHOUT_UNSPECIFIED_BAZ" } },
38+
}],
39+
"extensions": {
40+
"protobufEnum": {
41+
"name": "MyEnumWithoutUnspecified",
42+
"fullName": "testapi.enums.MyEnumWithoutUnspecified",
43+
"package": "testapi.enums",
44+
},
45+
},
46+
});
47+
"
48+
`;
49+
50+
exports[`createEnumTypeCode > google-protobuf > 'generates code for enum with extensio…' 1`] = `
51+
"import { enumType } from "nexus";
52+
53+
export const TestPrefixPrefixedEnum = enumType({
54+
"name": "TestPrefixPrefixedEnum",
55+
"members": [
56+
{ "name": "PREFIXED_FOO", "value": 1, "extensions": { "protobufEnumValue": { "name": "PREFIXED_FOO" } } },
57+
{ "name": "PREFIXED_BAR", "value": 2, "extensions": { "protobufEnumValue": { "name": "PREFIXED_BAR" } } },
58+
],
59+
"extensions": {
60+
"protobufEnum": {
61+
"name": "PrefixedEnum",
62+
"fullName": "testapis.extensions.PrefixedEnum",
63+
"package": "testapis.extensions",
64+
},
65+
},
66+
});
67+
"
68+
`;
69+
70+
exports[`createEnumTypeCode > google-protobuf > 'generates code for nested enum' 1`] = `
71+
"import { enumType } from "nexus";
72+
73+
export const ParentMessageNestedEnum = enumType({
74+
"name": "ParentMessageNestedEnum",
75+
"members": [{ "name": "FOO", "value": 1, "extensions": { "protobufEnumValue": { "name": "FOO" } } }, {
76+
"name": "BAR",
77+
"value": 2,
78+
"extensions": { "protobufEnumValue": { "name": "BAR" } },
79+
}],
80+
"extensions": {
81+
"protobufEnum": {
82+
"name": "NestedEnum",
83+
"fullName": "testapis.nested.ParentMessage.NestedEnum",
84+
"package": "testapis.nested",
85+
},
86+
},
87+
});
88+
"
89+
`;
90+
91+
exports[`createEnumTypeCode > protobufjs > 'generates code for a simple enum' 1`] = `
92+
"import { enumType } from "nexus";
93+
94+
export const MyEnum = enumType({
95+
"name": "MyEnum",
96+
"members": [{ "name": "FOO", "value": 1, "extensions": { "protobufEnumValue": { "name": "MY_ENUM_FOO" } } }, {
97+
"name": "BAR",
98+
"value": 2,
99+
"description": "This is Bar.",
100+
"extensions": { "protobufEnumValue": { "name": "MY_ENUM_BAR" } },
101+
}, { "name": "BAZ", "value": 3, "extensions": { "protobufEnumValue": { "name": "MY_ENUM_BAZ" } } }],
102+
"extensions": {
103+
"protobufEnum": { "name": "MyEnum", "fullName": "testapi.enums.MyEnum", "package": "testapi.enums" },
104+
},
105+
});
106+
"
107+
`;
108+
109+
exports[`createEnumTypeCode > protobufjs > 'generates code for an enum without un…' 1`] = `
110+
"import { enumType } from "nexus";
111+
112+
export const MyEnumWithoutUnspecified = enumType({
113+
"name": "MyEnumWithoutUnspecified",
114+
"members": [{
115+
"name": "FOO",
116+
"value": 0,
117+
"extensions": { "protobufEnumValue": { "name": "MY_ENUM_WITHOUT_UNSPECIFIED_FOO" } },
118+
}, {
119+
"name": "BAR",
120+
"value": 1,
121+
"extensions": { "protobufEnumValue": { "name": "MY_ENUM_WITHOUT_UNSPECIFIED_BAR" } },
122+
}, {
123+
"name": "BAZ",
124+
"value": 2,
125+
"extensions": { "protobufEnumValue": { "name": "MY_ENUM_WITHOUT_UNSPECIFIED_BAZ" } },
126+
}],
127+
"extensions": {
128+
"protobufEnum": {
129+
"name": "MyEnumWithoutUnspecified",
130+
"fullName": "testapi.enums.MyEnumWithoutUnspecified",
131+
"package": "testapi.enums",
132+
},
133+
},
134+
});
135+
"
136+
`;
137+
138+
exports[`createEnumTypeCode > protobufjs > 'generates code for nested enum' 1`] = `
139+
"import { enumType } from "nexus";
140+
141+
export const ParentMessageNestedEnum = enumType({
142+
"name": "ParentMessageNestedEnum",
143+
"members": [{ "name": "FOO", "value": 1, "extensions": { "protobufEnumValue": { "name": "FOO" } } }, {
144+
"name": "BAR",
145+
"value": 2,
146+
"extensions": { "protobufEnumValue": { "name": "BAR" } },
147+
}],
148+
"extensions": {
149+
"protobufEnum": {
150+
"name": "NestedEnum",
151+
"fullName": "testapis.nested.ParentMessage.NestedEnum",
152+
"package": "testapis.nested",
153+
},
154+
},
155+
});
156+
"
157+
`;

0 commit comments

Comments
 (0)