Skip to content

Commit 36b63a2

Browse files
MrLeebodrwpow
authored andcommitted
Rewrite tests to test for alphabetization of specific object types
1 parent f9cfd6b commit 36b63a2

32 files changed

+467
-120817
lines changed

src/transform/parameters.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { GlobalContext, ParameterObject, ReferenceObject } from "../types.js";
2-
import { comment, tsReadonly } from "../utils.js";
2+
import { comment, getEntries, tsReadonly } from "../utils.js";
33
import { transformSchemaObj } from "./schema.js";
44

55
interface TransformParametersOptions extends GlobalContext {
@@ -57,9 +57,9 @@ export function transformParametersArray(
5757
}
5858

5959
// transform output
60-
for (const [paramIn, paramGroup] of Object.entries(mappedParams)) {
60+
for (const [paramIn, paramGroup] of getEntries(mappedParams, ctx)) {
6161
output += ` ${readonly}${paramIn}: {\n`; // open in
62-
for (const [paramName, paramObj] of Object.entries(paramGroup)) {
62+
for (const [paramName, paramObj] of getEntries(paramGroup, ctx)) {
6363
let paramComment = "";
6464
if (paramObj.deprecated) paramComment += `@deprecated `;
6565
if (paramObj.description) paramComment += paramObj.description;

src/transform/request.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export function transformRequestBodyObj(requestBody: RequestBody, ctx: GlobalCon
2020

2121
if (requestBody.content && Object.keys(requestBody.content).length) {
2222
output += ` ${readonly}content: {\n`; // open content
23-
for (const [k, v] of Object.entries(requestBody.content)) {
23+
for (const [k, v] of getEntries(requestBody.content, ctx)) {
2424
output += ` ${readonly}"${k}": ${transformSchemaObj(v.schema, { ...ctx, required: new Set<string>() })};\n`;
2525
}
2626
output += ` }\n`; // close content

src/transform/responses.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ export function transformResponsesObj(responsesObj: Record<string, any>, ctx: Gl
4747
switch (ctx.version) {
4848
case 3: {
4949
output += ` ${readonly}content: {\n`; // open content
50-
for (const contentType of Object.keys(response.content)) {
51-
const contentResponse = response.content[contentType] as any;
50+
// TODO: proper type definitions for this
51+
for (const [contentType, contentResponse] of getEntries<any>(response.content, ctx)) {
5252
const responseType =
53-
contentResponse && contentResponse?.schema
53+
"schema" in contentResponse
5454
? transformSchemaObj(contentResponse.schema, { ...ctx, required: new Set<string>() })
5555
: "unknown";
5656
output += ` ${readonly}"${contentType}": ${responseType};\n`;

src/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,6 @@ export function replaceKeys(obj: Record<string, any>): Record<string, any> {
295295

296296
export function getEntries<Item>(obj: ArrayLike<Item> | Record<string, Item>, options: GlobalContext) {
297297
const entries = Object.entries(obj);
298-
if (options.alphabetize) entries.sort(([a], [b]) => a.localeCompare(b, "en"));
298+
if (options.alphabetize) entries.sort(([a], [b]) => a.localeCompare(b, "en", { numeric: true }));
299299
return entries;
300300
}

test/core/operation.test.js

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,4 +187,101 @@ describe("parameters", () => {
187187
188188
}`);
189189
});
190+
191+
describe("with alphabetize", () => {
192+
function createOperationTransform(schema) {
193+
return transformOperationObj(schema, {
194+
...defaults,
195+
alphabetize: true,
196+
version: 3,
197+
pathItem: {
198+
parameters: [
199+
{
200+
in: "path",
201+
name: "p2",
202+
schema: {
203+
type: "string",
204+
},
205+
},
206+
{
207+
in: "path",
208+
name: "p3",
209+
schema: {
210+
type: "string",
211+
},
212+
},
213+
],
214+
},
215+
});
216+
}
217+
218+
it("sorts content types", () => {
219+
const actual = createOperationTransform({
220+
requestBody: {
221+
content: {
222+
"font/woff2": {
223+
schema: { type: "string" },
224+
},
225+
"font/otf": {
226+
schema: { type: "string" },
227+
},
228+
"font/sfnt": {
229+
schema: { type: "string" },
230+
},
231+
"font/ttf": {
232+
schema: { type: "string" },
233+
},
234+
"font/woff": {
235+
schema: { type: "string" },
236+
},
237+
},
238+
},
239+
});
240+
expect(actual.trim()).to.equal(`parameters: {
241+
path: {
242+
"p2"?: string;
243+
"p3"?: string;
244+
}
245+
246+
}
247+
requestBody: {
248+
content: {
249+
"font/otf": string;
250+
"font/sfnt": string;
251+
"font/ttf": string;
252+
"font/woff": string;
253+
"font/woff2": string;
254+
}
255+
}`);
256+
});
257+
258+
it("sorts operation parameters", () => {
259+
const actual = createOperationTransform({
260+
parameters: [
261+
{
262+
in: "path",
263+
name: "p2",
264+
schema: {
265+
type: "number",
266+
},
267+
},
268+
{
269+
in: "path",
270+
name: "p1",
271+
schema: {
272+
type: "string",
273+
},
274+
},
275+
],
276+
});
277+
expect(actual.trim()).to.equal(`parameters: {
278+
path: {
279+
"p1"?: string;
280+
"p2"?: number;
281+
"p3"?: string;
282+
}
283+
284+
}`);
285+
});
286+
});
190287
});

test/core/parameters.test.js

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,58 @@ describe("transformParametersArray()", () => {
6767
);
6868
});
6969

70+
it("basic (alphabetize)", () => {
71+
const schema = [
72+
{ in: "query", name: "delta", required: true, type: "string" },
73+
{ in: "query", name: "charlie", required: true, type: "string" },
74+
{ in: "query", name: "alpha", required: true, type: "string" },
75+
{ in: "query", name: "bravo", required: true, type: "string" },
76+
];
77+
78+
const actual = transformParametersArray(schema, {
79+
...defaults,
80+
version: 2,
81+
alphabetize: true,
82+
globalParameters: {
83+
per_page: { in: "query", name: "per_page", required: true, type: "number" },
84+
page: { in: "query", name: "page", type: "number" },
85+
since: { in: "query", name: "since", type: "string" },
86+
},
87+
}).trim();
88+
expect(actual).to.equal(`query: {
89+
"alpha": string;
90+
"bravo": string;
91+
"charlie": string;
92+
"delta": string;
93+
}`);
94+
});
95+
96+
it("numeric (alphabetize)", () => {
97+
const schema = [
98+
{ in: "query", name: "1000", required: true, type: "string" },
99+
{ in: "query", name: "123", required: true, type: "string" },
100+
{ in: "query", name: "1001", required: true, type: "string" },
101+
{ in: "query", name: "111", required: true, type: "string" },
102+
];
103+
104+
const actual = transformParametersArray(schema, {
105+
...defaults,
106+
version: 2,
107+
alphabetize: true,
108+
globalParameters: {
109+
per_page: { in: "query", name: "per_page", required: true, type: "number" },
110+
page: { in: "query", name: "page", type: "number" },
111+
since: { in: "query", name: "since", type: "string" },
112+
},
113+
}).trim();
114+
expect(actual).to.equal(`query: {
115+
"111": string;
116+
"123": string;
117+
"1000": string;
118+
"1001": string;
119+
}`);
120+
});
121+
70122
const refSchema = [
71123
{ $ref: 'parameters["per_page"]' },
72124
{ $ref: 'parameters["page"]' },
@@ -107,6 +159,24 @@ describe("transformParametersArray()", () => {
107159
readonly "per_page": parameters["per_page"];
108160
readonly "page"?: parameters["page"];
109161
readonly "since"?: parameters["since"];
162+
}`);
163+
});
164+
165+
it("$ref (alphabetize)", () => {
166+
const actual = transformParametersArray(refSchema, {
167+
...defaults,
168+
version: 2,
169+
alphabetize: true,
170+
globalParameters: {
171+
per_page: { in: "query", name: "per_page", required: true, type: "number" },
172+
page: { in: "query", name: "page", type: "number" },
173+
since: { in: "query", name: "since", type: "string" },
174+
},
175+
}).trim();
176+
expect(actual).to.equal(`query: {
177+
"page"?: parameters["page"];
178+
"per_page": parameters["per_page"];
179+
"since"?: parameters["since"];
110180
}`);
111181
});
112182
});
@@ -171,6 +241,58 @@ describe("transformParametersArray()", () => {
171241
);
172242
});
173243

244+
it("basic (alphabetize)", () => {
245+
const schema = [
246+
{ in: "query", name: "delta", required: true, schema: { type: "string" } },
247+
{ in: "query", name: "charlie", required: true, schema: { type: "string" } },
248+
{ in: "query", name: "alpha", required: true, schema: { type: "string" } },
249+
{ in: "query", name: "bravo", required: true, schema: { type: "string" } },
250+
];
251+
252+
const actual = transformParametersArray(schema, {
253+
...defaults,
254+
version: 3,
255+
alphabetize: true,
256+
globalParameters: {
257+
per_page: { in: "query", name: "per_page", required: true, type: "number" },
258+
page: { in: "query", name: "page", type: "number" },
259+
since: { in: "query", name: "since", type: "string" },
260+
},
261+
}).trim();
262+
expect(actual).to.equal(`query: {
263+
"alpha": string;
264+
"bravo": string;
265+
"charlie": string;
266+
"delta": string;
267+
}`);
268+
});
269+
270+
it("numeric (alphabetize)", () => {
271+
const schema = [
272+
{ in: "query", name: "1000", required: true, schema: { type: "string" } },
273+
{ in: "query", name: "123", required: true, schema: { type: "string" } },
274+
{ in: "query", name: "1001", required: true, schema: { type: "string" } },
275+
{ in: "query", name: "111", required: true, schema: { type: "string" } },
276+
];
277+
278+
const actual = transformParametersArray(schema, {
279+
...defaults,
280+
version: 3,
281+
alphabetize: true,
282+
globalParameters: {
283+
per_page: { in: "query", name: "per_page", required: true, type: "number" },
284+
page: { in: "query", name: "page", type: "number" },
285+
since: { in: "query", name: "since", type: "string" },
286+
},
287+
}).trim();
288+
expect(actual).to.equal(`query: {
289+
"111": string;
290+
"123": string;
291+
"1000": string;
292+
"1001": string;
293+
}`);
294+
});
295+
174296
const refSchema = [
175297
{ $ref: 'components["parameters"]["per_page"]' },
176298
{ $ref: 'components["parameters"]["page"]' },
@@ -214,6 +336,24 @@ describe("transformParametersArray()", () => {
214336
}`);
215337
});
216338

339+
it("$ref (alphabetize)", () => {
340+
const actual = transformParametersArray(refSchema, {
341+
...defaults,
342+
version: 3,
343+
alphabetize: true,
344+
globalParameters: {
345+
per_page: { in: "query", name: "per_page", required: true, type: "number" },
346+
page: { in: "query", name: "page", type: "number" },
347+
since: { in: "query", name: "since", type: "string" },
348+
},
349+
}).trim();
350+
expect(actual).to.equal(`query: {
351+
"page"?: components["parameters"]["page"];
352+
"per_page": components["parameters"]["per_page"];
353+
"since"?: components["parameters"]["since"];
354+
}`);
355+
});
356+
217357
it("nullable", () => {
218358
const schema = [
219359
{ in: "query", name: "nullableString", schema: { type: "string", nullable: true } },

0 commit comments

Comments
 (0)