Skip to content

Commit 466594b

Browse files
[#175498392] Handle enum for boolean type in openapi definition (#208)
1 parent 1d05f9c commit 466594b

File tree

3 files changed

+141
-1
lines changed

3 files changed

+141
-1
lines changed

__mocks__/api.yaml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,55 @@ definitions:
302302
- value1
303303
- value2
304304
- value3
305+
EnumTrueTest:
306+
type: object
307+
properties:
308+
flag:
309+
type: boolean
310+
enum:
311+
- true
312+
EnumFalseTest:
313+
type: object
314+
properties:
315+
flag:
316+
type: boolean
317+
enum:
318+
- false
319+
EnabledUserTest:
320+
type: object
321+
properties:
322+
description:
323+
type: string
324+
enabled:
325+
type: boolean
326+
enum:
327+
- true
328+
username:
329+
type: string
330+
required:
331+
- enabled
332+
- description
333+
- username
334+
DisabledUserTest:
335+
type: object
336+
properties:
337+
enabled:
338+
type: boolean
339+
enum:
340+
- false
341+
reason:
342+
type: string
343+
username:
344+
type: string
345+
required:
346+
- enabled
347+
- reason
348+
- username
349+
DisjointUnionsUserTest:
350+
x-one-of: true
351+
allOf:
352+
- $ref: "#/definitions/EnabledUserTest"
353+
- $ref: "#/definitions/DisabledUserTest"
305354
MessageContent:
306355
type: object
307356
properties:

e2e/src/__tests__/test-api/definitions.test.ts

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ import { WithinRangeIntegerTest } from "../../generated/testapi/WithinRangeInteg
2020
import { WithinRangeNumberTest } from "../../generated/testapi/WithinRangeNumberTest";
2121
import { WithinRangeStringTest } from "../../generated/testapi/WithinRangeStringTest";
2222

23+
import { DisabledUserTest } from "../../generated/testapi/DisabledUserTest";
24+
import { DisjointUnionsUserTest } from "../../generated/testapi/DisjointUnionsUserTest";
25+
import { EnabledUserTest } from "../../generated/testapi/EnabledUserTest";
26+
import { EnumFalseTest } from "../../generated/testapi/EnumFalseTest";
27+
import { EnumTrueTest } from "../../generated/testapi/EnumTrueTest";
28+
2329
const { generatedFilesDir, isSpecEnabled } = config.specs.testapi;
2430

2531
// if there's no need for this suite in this particular run, just skip it
@@ -288,3 +294,84 @@ describe("WithinRangeStringTest defintion", () => {
288294
}
289295
);
290296
});
297+
298+
describe("EnumTrueTest definition", () => {
299+
const statusOk = { flag: true };
300+
const statusKo = { flag: false };
301+
302+
it("should decode statusOk with EnumTrueTest", () => {
303+
const result = EnumTrueTest.decode(statusOk);
304+
expect(result.isRight()).toBe(true);
305+
});
306+
307+
it("should not decode statusKo with EnumTrueTest", () => {
308+
const result = EnumTrueTest.decode(statusKo);
309+
310+
expect(result.isLeft()).toBe(true);
311+
});
312+
});
313+
314+
describe("EnumFalseTest definition", () => {
315+
const statusOk = { flag: false };
316+
const statusKo = { flag: true };
317+
318+
it("should decode statusOk with EnumFalseTest", () => {
319+
const result = EnumFalseTest.decode(statusOk);
320+
expect(result.isRight()).toBe(true);
321+
});
322+
323+
it("should not decode statusKo with EnumFalseTest", () => {
324+
const result = EnumFalseTest.decode(statusKo);
325+
326+
expect(result.isLeft()).toBe(true);
327+
});
328+
});
329+
330+
describe("DisjointUnionsUserTest definition", () => {
331+
const enabledUser = {
332+
description: "Description for the user",
333+
enabled: true,
334+
username: "user"
335+
};
336+
const disabledUser = {
337+
enabled: false,
338+
reason: "reason for the user",
339+
username: "user"
340+
};
341+
342+
const invalidUser = {
343+
description: "Description for the user",
344+
enabled: false,
345+
username: "user"
346+
};
347+
348+
it("should decode enabledUser with DisjointUnionsUserTest", () => {
349+
const userTest = DisjointUnionsUserTest.decode(enabledUser);
350+
const enabledUserTest = EnabledUserTest.decode(enabledUser);
351+
const disabledUserTest = DisabledUserTest.decode(enabledUser);
352+
353+
expect(userTest.isRight()).toBe(true);
354+
expect(enabledUserTest.isRight()).toBe(true);
355+
expect(disabledUserTest.isLeft()).toBe(true);
356+
});
357+
358+
it("should decode disabledUser with DisjointUnionsUserTest", () => {
359+
const userTest = DisjointUnionsUserTest.decode(disabledUser);
360+
const enabledUserTest = EnabledUserTest.decode(disabledUser);
361+
const disabledUserTest = DisabledUserTest.decode(disabledUser);
362+
363+
expect(userTest.isRight()).toBe(true);
364+
expect(disabledUserTest.isRight()).toBe(true);
365+
expect(enabledUserTest.isLeft()).toBe(true);
366+
});
367+
368+
it("should not decode invalidUser with DisjointUnionsUserTest", () => {
369+
const userTest = DisjointUnionsUserTest.decode(invalidUser);
370+
const enabledUserTest = EnabledUserTest.decode(invalidUser);
371+
const disabledUserTest = DisabledUserTest.decode(invalidUser);
372+
373+
expect(userTest.isLeft()).toBe(true);
374+
expect(disabledUserTest.isLeft()).toBe(true);
375+
expect(enabledUserTest.isLeft()).toBe(true);
376+
});
377+
});

templates/macros.njk

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,11 @@
215215
# defines a boolean property
216216
#}
217217
{% macro defineBoolean(definitionName, definition, inline = false) -%}
218-
{% set typedef %}t.boolean{% endset %}
218+
{% if definition["enum"] and definition["enum"] | length == 1%}
219+
{% set typedef %}t.literal({{definition["enum"][0]}}){% endset %}
220+
{% else %}
221+
{% set typedef %}t.boolean{% endset %}
222+
{% endif %}
219223
{{ defineConst(definition.default, definitionName, typedef, false, inline) }}
220224
{% endmacro %}
221225

0 commit comments

Comments
 (0)