Skip to content

Commit ce6f2d7

Browse files
committed
test(core/protocols): use serde instead of JSON native
1 parent 6351f79 commit ce6f2d7

File tree

4 files changed

+42
-14
lines changed

4 files changed

+42
-14
lines changed

packages/core/src/submodules/protocols/json/JsonShapeDeserializer.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ export class JsonShapeDeserializer extends SerdeContextConfig implements ShapeDe
108108
if (value instanceof NumericValue) {
109109
return value;
110110
}
111+
const untyped = value as any;
112+
if (untyped.type === "bigDecimal" && "string" in untyped) {
113+
return new NumericValue(untyped.string, untyped.type);
114+
}
111115
return new NumericValue(String(value), "bigDecimal");
112116
}
113117

@@ -123,7 +127,19 @@ export class JsonShapeDeserializer extends SerdeContextConfig implements ShapeDe
123127
}
124128

125129
if (ns.isDocumentSchema()) {
126-
return structuredClone(value);
130+
if (isObject) {
131+
const out = Array.isArray(value) ? [] : ({} as any);
132+
for (const [k, v] of Object.entries(value)) {
133+
if (v instanceof NumericValue) {
134+
out[k] = v;
135+
} else {
136+
out[k] = this._read(ns, v);
137+
}
138+
}
139+
return out;
140+
} else {
141+
return structuredClone(value);
142+
}
127143
}
128144

129145
// covers string, numeric, boolean, document, bigDecimal

packages/core/src/submodules/protocols/json/JsonShapeSerializer.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { determineTimestampFormat } from "@smithy/core/protocols";
22
import { NormalizedSchema, SCHEMA } from "@smithy/core/schema";
3-
import { dateToUtcString, generateIdempotencyToken, LazyJsonString } from "@smithy/core/serde";
3+
import { dateToUtcString, generateIdempotencyToken, LazyJsonString, NumericValue } from "@smithy/core/serde";
44
import { Schema, ShapeSerializer } from "@smithy/types";
55
import { toBase64 } from "@smithy/util-base64";
66

@@ -138,8 +138,20 @@ export class JsonShapeSerializer extends SerdeContextConfig implements ShapeSeri
138138
}
139139
}
140140

141-
if (ns.isDocumentSchema() && isObject) {
142-
return structuredClone(value);
141+
if (ns.isDocumentSchema()) {
142+
if (isObject) {
143+
const out = Array.isArray(value) ? [] : ({} as any);
144+
for (const [k, v] of Object.entries(value)) {
145+
if (v instanceof NumericValue) {
146+
out[k] = v;
147+
} else {
148+
out[k] = this._write(ns, v);
149+
}
150+
}
151+
return out;
152+
} else {
153+
return structuredClone(value);
154+
}
143155
}
144156

145157
return value;

packages/core/src/submodules/protocols/schema-testing/new-document-type-test-cases.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
"float": 0,
8989
"double": 0,
9090
"bigInteger": 0,
91-
"bigDecimal": 0.0,
91+
"bigDecimal": 0,
9292
"timestamp": 0,
9393
"timestampDateTime": "1970-01-01T00:00:00Z",
9494
"timestampHttpDate": "Thu, 01 Jan 1970 00:00:00 GMT",
@@ -111,7 +111,7 @@
111111
"float": 0,
112112
"double": 0,
113113
"bigInteger": 0,
114-
"bigDecimal": 0.0,
114+
"bigDecimal": 0,
115115
"timestamp": 0,
116116
"timestampDateTime": "1970-01-01T00:00:00Z",
117117
"timestampHttpDate": "Thu, 01 Jan 1970 00:00:00 GMT",

packages/core/src/submodules/protocols/schema-testing/schema-documents.spec.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ function getJsonCodec(test: { settings: JsonSettings }): JsonCodec {
8686
*/
8787
function readDocument(deserializer: JsonShapeDeserializer, data: DocumentType): any {
8888
if (data && typeof data === "object" && typeof (data as any).__type === "string") {
89-
const object = structuredClone(data as any);
89+
const object = data as any;
9090
const [namespace, name] = object.__type.split("#");
9191
delete object.__type;
9292
const schema = TypeRegistry.for(namespace).getSchema(name);
@@ -105,18 +105,19 @@ describe("schema conversion tests for serializations, data objects, and document
105105
const serializer = codec.createSerializer();
106106
const deserializer = codec.createDeserializer();
107107

108-
const serialization = JSON.stringify(test.serialized);
109-
const documentFromSerialization = JSON.parse(serialization);
108+
serializer.write(SCHEMA.DOCUMENT, test.serialized);
109+
const serialization = serializer.flush();
110+
const documentFromSerialization = await deserializer.read(SCHEMA.DOCUMENT, serialization);
110111
const canonicalDataObject = await deserializer.read(subjectSchema, serialization);
111112

112113
serializer.writeDiscriminatedDocument(subjectSchema, canonicalDataObject);
113-
const documentFromDataObject = JSON.parse(serializer.flush());
114+
const documentFromDataObject = await deserializer.read(SCHEMA.DOCUMENT, serializer.flush());
114115

115116
// 1. data object from serialization
116117
expect(typeof documentFromSerialization).toBe("object");
117118

118119
// 2. data object document back to data object
119-
const dataObjectFromDocument = await readDocument(deserializer, documentFromDataObject);
120+
const dataObjectFromDocument = await deserializer.readObject(subjectSchema, documentFromDataObject);
120121
expect(dataObjectFromDocument).toEqual(canonicalDataObject);
121122

122123
// 3. data object from serialization document
@@ -134,9 +135,8 @@ describe("schema conversion tests for serializations, data objects, and document
134135
expect(serializationFromSerializedDocument).toEqual(serialization);
135136

136137
// 6. serialization from data object document
137-
const undiscriminatedDocument = structuredClone(documentFromDataObject);
138-
delete undiscriminatedDocument.__type;
139-
serializer.write(SCHEMA.DOCUMENT, undiscriminatedDocument);
138+
delete documentFromDataObject.__type;
139+
serializer.write(SCHEMA.DOCUMENT, documentFromDataObject);
140140
const serializationFromDocumentFromDataObject = serializer.flush();
141141
expect(serializationFromDocumentFromDataObject).toEqual(serialization);
142142
});

0 commit comments

Comments
 (0)