Skip to content

Commit 881e4fe

Browse files
authored
test: improve assertion messages (#1572)
1 parent 3db70fa commit 881e4fe

File tree

7 files changed

+325
-194
lines changed

7 files changed

+325
-194
lines changed

Makefile

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ generate-protocol-tests:
1111
./gradlew :smithy-typescript-protocol-test-codegen:build
1212
rm -rf ./private/smithy-rpcv2-cbor
1313
cp -r ./smithy-typescript-protocol-test-codegen/build/smithyprojections/smithy-typescript-protocol-test-codegen/smithy-rpcv2-cbor/typescript-codegen ./private/smithy-rpcv2-cbor
14-
cp ./packages/core/vitest.config.ts ./private/smithy-rpcv2-cbor/vitest.config.js
1514
node ./scripts/post-protocol-test-codegen
1615
npx prettier --write ./private/smithy-rpcv2-cbor
1716
yarn

private/smithy-rpcv2-cbor/package.json

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
"build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4",
1111
"clean": "rimraf ./dist-* && rimraf *.tsbuildinfo || exit 0",
1212
"prepack": "yarn run clean && yarn run build",
13-
"merged": "echo \"this is merged from user configuration.\""
13+
"merged": "echo \"this is merged from user configuration.\"",
14+
"test": "yarn g:vitest run --passWithNoTests"
1415
},
1516
"main": "./dist-cjs/index.js",
1617
"types": "./dist-types/index.d.ts",
@@ -51,7 +52,8 @@
5152
"concurrently": "7.0.0",
5253
"downlevel-dts": "0.10.1",
5354
"rimraf": "^3.0.0",
54-
"typescript": "~5.2.2"
55+
"typescript": "~5.2.2",
56+
"vitest": "2.1.8"
5557
},
5658
"engines": {
5759
"node": ">=18.0.0"

private/smithy-rpcv2-cbor/test/functional/rpcv2cbor.spec.ts

+280-170
Large diffs are not rendered by default.
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { defineConfig } from "vite";
2+
3+
export default defineConfig({
4+
test: {
5+
include: ["**/*.spec.ts"],
6+
globals: true,
7+
},
8+
});

private/smithy-rpcv2-cbor/vitest.config.js

-9
This file was deleted.

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/HttpProtocolTestGenerator.java

+32-12
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,8 @@ private void initializeWriterIfNeeded() {
234234
writer.addDependency(TypeScriptDependency.PROTOCOL_HTTP);
235235
// Add the template to each generated test.
236236
writer.write(IoUtils.readUtf8Resource(getClass(), "protocol-test-stub.ts"));
237+
writer.addImport("test", "it", TypeScriptDependency.VITEST);
238+
writer.addImport("expect", null, TypeScriptDependency.VITEST);
237239
}
238240
}
239241

@@ -466,7 +468,6 @@ private void writeHttpResponseAssertions(HttpMalformedResponseDefinition respons
466468
writer.write("expect(r.statusCode).toBe($L);", responseDefinition.getCode());
467469
responseDefinition.getHeaders().forEach((header, value) -> {
468470
header = header.toLowerCase();
469-
writer.write("expect(r.headers[$S]).toBeDefined();", header);
470471
writer.write("expect(r.headers[$S]).toBe($S);", header, value);
471472
});
472473
writer.write("");
@@ -484,11 +485,20 @@ private void writeHttpResponseAssertions(HttpMalformedResponseDefinition respons
484485

485486
private void writeHttpQueryAssertions(HttpRequestTestCase testCase) {
486487
testCase.getRequireQueryParams().forEach(requiredQueryParam ->
487-
writer.write("expect(r.query[$S]).toBeDefined();", requiredQueryParam));
488+
writer.write("""
489+
expect(
490+
r.query[$1S],
491+
`Query key $1S should have been defined in $${JSON.stringify(r.query)}`
492+
).toBeDefined();""", requiredQueryParam)
493+
);
488494
writer.write("");
489495

490496
testCase.getForbidQueryParams().forEach(forbidQueryParam ->
491-
writer.write("expect(r.query[$S]).toBeUndefined();", forbidQueryParam));
497+
writer.write("""
498+
expect(
499+
r.query[$1S],
500+
`Query key $1S should have been undefined in $${JSON.stringify(r.query)}`
501+
).toBeUndefined();""", forbidQueryParam));
492502
writer.write("");
493503

494504
List<String> explicitQueryValues = testCase.getQueryParams();
@@ -506,25 +516,31 @@ private void writeHttpQueryAssertions(HttpRequestTestCase testCase) {
506516

507517
private void writeHttpHeaderAssertions(HttpMessageTestCase testCase) {
508518
testCase.getRequireHeaders().forEach(requiredHeader -> {
509-
writer.write("expect(r.headers[$S]).toBeDefined();", requiredHeader.toLowerCase());
519+
writer.write("""
520+
expect(
521+
r.headers[$1S],
522+
`Header key $1S should have been defined in $${JSON.stringify(r.headers)}`
523+
).toBeDefined();""", requiredHeader.toLowerCase());
510524
});
511525
writer.write("");
512526

513527
testCase.getForbidHeaders().forEach(forbidHeader ->
514-
writer.write("expect(r.headers[$S]).toBeUndefined();", forbidHeader.toLowerCase()));
528+
writer.write("""
529+
expect(
530+
r.headers[$1S],
531+
`Header key $1S should have been undefined in $${JSON.stringify(r.headers)}`
532+
).toBeUndefined();""", forbidHeader.toLowerCase()));
515533
writer.write("");
516534

517535
testCase.getHeaders().forEach((header, value) -> {
518536
header = header.toLowerCase();
519-
writer.write("expect(r.headers[$S]).toBeDefined();", header);
520537
writer.write("expect(r.headers[$S]).toBe($S);", header, value);
521538
});
522539
writer.write("");
523540
}
524541

525542
private void writeHttpHostAssertion(HttpRequestTestCase testCase) {
526543
testCase.getResolvedHost().ifPresent(resolvedHost -> {
527-
writer.write("expect(r.headers[\"host\"]).toBeDefined();");
528544
writer.write("expect(r.headers[\"host\"]).toBe($S);", resolvedHost);
529545
writer.write("");
530546
});
@@ -540,7 +556,7 @@ private void writeHttpBodyAssertions(String body, String mediaType, boolean isCl
540556
}
541557

542558
// Fast fail if we don't have a body.
543-
writer.write("expect(r.body).toBeDefined();");
559+
writer.write("expect(r.body, `Body was undefined.`).toBeDefined();");
544560

545561
// Otherwise load a media type specific comparator and do a comparison.
546562
String comparatorInvoke = registerBodyComparatorStub(mediaType);
@@ -566,7 +582,7 @@ private void writeHttpBodyAssertions(String body, String mediaType, boolean isCl
566582

567583
private void writeHttpBodyMessageAssertion(String messageRegex, String mediaType) {
568584
// Fast fail if we don't have a body.
569-
writer.write("expect(r.body).toBeDefined();");
585+
writer.write("expect(r.body, `Body was undefined`).toBeDefined();");
570586

571587
// Otherwise load a media type specific matcher
572588
String comparatorInvoke = registerMessageRegexStub(mediaType);
@@ -825,7 +841,7 @@ private void writeResponseTestSetup(OperationShape operation, HttpResponseTestCa
825841
private void writeResponseAssertions(Shape operationOrError, HttpResponseTestCase testCase) {
826842
writer.write("expect(r['$$metadata'].httpStatusCode).toBe($L);", testCase.getCode());
827843

828-
writeReponseParamAssertions(operationOrError, testCase);
844+
writeResponseParamAssertions(operationOrError, testCase);
829845
}
830846

831847
private void writeRequestParamAssertions(OperationShape operation, HttpRequestTestCase testCase) {
@@ -859,7 +875,7 @@ private void writeRequestParamAssertions(OperationShape operation, HttpRequestTe
859875
}
860876
}
861877

862-
private void writeReponseParamAssertions(Shape operationOrError, HttpResponseTestCase testCase) {
878+
private void writeResponseParamAssertions(Shape operationOrError, HttpResponseTestCase testCase) {
863879
ObjectNode params = testCase.getParams();
864880
if (!params.isEmpty()) {
865881
StructureShape testOutputShape;
@@ -917,7 +933,11 @@ private void writeParamAssertions(
917933

918934
// Perform parameter comparisons.
919935
writer.openBlock("Object.keys(paramsToValidate).forEach(param => {", "});", () -> {
920-
writer.write("expect(r[param]).toBeDefined();");
936+
writer.write("""
937+
expect(
938+
r[param],
939+
`The output field $${param} should have been defined in $${JSON.stringify(r, null, 2)}`
940+
).toBeDefined();""");
921941
if (hasStreamingPayloadBlob) {
922942
writer.openBlock("if (param === $S) {", "} else {", payloadBinding.get().getMemberName(), () ->
923943
writer.write("""

yarn.lock

+1
Original file line numberDiff line numberDiff line change
@@ -2986,6 +2986,7 @@ __metadata:
29862986
rimraf: "npm:^3.0.0"
29872987
tslib: "npm:^2.6.2"
29882988
typescript: "npm:~5.2.2"
2989+
vitest: "npm:2.1.8"
29892990
languageName: unknown
29902991
linkType: soft
29912992

0 commit comments

Comments
 (0)