Skip to content

Commit a0c3762

Browse files
authored
fix: joi supports string values with null default (#361)
apply fix/tests from #360 to the joi schema builder
1 parent 6a4b1ad commit a0c3762

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

packages/openapi-code-generator/src/typescript/common/schema-builders/joi-schema-builder.spec.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,20 @@ describe.each(testVersions)(
625625

626626
await expect(execute(undefined)).resolves.toBe(0)
627627
})
628+
629+
it("supports default values of null when nullable", async () => {
630+
const {code, execute} = await getActualFromModel({
631+
...base,
632+
nullable: true,
633+
default: null,
634+
})
635+
636+
expect(code).toMatchInlineSnapshot(
637+
`"const x = joi.number().allow(null).default(null)"`,
638+
)
639+
640+
await expect(execute(undefined)).resolves.toBeNull()
641+
})
628642
})
629643

630644
describe("strings", () => {
@@ -766,6 +780,20 @@ describe.each(testVersions)(
766780
await expect(execute(undefined)).resolves.toBe("example")
767781
})
768782

783+
it("supports default values of null when nullable", async () => {
784+
const {code, execute} = await getActualFromModel({
785+
...base,
786+
nullable: true,
787+
default: null,
788+
})
789+
790+
expect(code).toMatchInlineSnapshot(
791+
`"const x = joi.string().allow(null).default(null)"`,
792+
)
793+
794+
await expect(execute(undefined)).resolves.toBeNull()
795+
})
796+
769797
it("supports empty string default values", async () => {
770798
const {code, execute} = await getActualFromModel({
771799
...base,
@@ -906,6 +934,20 @@ describe.each(testVersions)(
906934
await expect(execute(undefined)).resolves.toBe(true)
907935
})
908936

937+
it("supports default values of null when nullable", async () => {
938+
const {code, execute} = await getActualFromModel({
939+
...base,
940+
nullable: true,
941+
default: null,
942+
})
943+
944+
expect(code).toMatchInlineSnapshot(
945+
`"const x = joi.boolean().truthy(1, "1").falsy(0, "0").allow(null).default(null)"`,
946+
)
947+
948+
await expect(execute(undefined)).resolves.toBeNull()
949+
})
950+
909951
it("support enum of 'true'", async () => {
910952
const {code, execute} = await getActualFromModel({
911953
...base,

packages/openapi-code-generator/src/typescript/common/schema-builders/joi-schema-builder.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,10 @@ export class JoiBuilder extends AbstractSchemaBuilder<
313313
// for stuff like this, eg: https://github.com/github/rest-api-description/issues/3878
314314
// lets coerce defaults to be strings when the model type is expecting that.
315315
const needsWrapping =
316-
model.type === "string" && typeof model.default !== "string"
316+
model.type === "string" &&
317+
typeof model.default !== "string" &&
318+
!(model.nullable && model.default === null)
319+
317320
const defaultValue = JSON.stringify(model.default)
318321

319322
return [

0 commit comments

Comments
 (0)