Skip to content

Commit 832008a

Browse files
fix(spec): avoid crash when requestBody has no content field (#10837)
1 parent 0d6f4e0 commit 832008a

2 files changed

Lines changed: 83 additions & 1 deletion

File tree

src/core/plugins/spec/selectors.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,11 @@ export const getOAS3RequiredRequestBodyContentType = (state, pathMethod) => {
546546
if (requestBody.getIn(["required"])) {
547547
requiredObj.requestBody = requestBody.getIn(["required"])
548548
}
549-
requestBody.getIn(["content"]).entrySeq().forEach((contentType) => { // e.g application/json
549+
const requestBodyContent = requestBody.getIn(["content"])
550+
if (!requestBodyContent) {
551+
return requiredObj
552+
}
553+
requestBodyContent.entrySeq().forEach((contentType) => { // e.g application/json
550554
const key = contentType[0]
551555
if (contentType[1].getIn(["schema", "required"])) {
552556
const val = contentType[1].getIn(["schema", "required"]).toJS()

test/unit/core/plugins/spec/selectors.js

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
consumesOptionsFor,
1616
taggedOperations,
1717
isMediaTypeSchemaPropertiesEqual,
18+
getOAS3RequiredRequestBodyContentType,
1819
validationErrors
1920
} from "core/plugins/spec/selectors"
2021

@@ -1239,6 +1240,83 @@ describe("taggedOperations", function () {
12391240
expect(result.toJS()).toEqual([])
12401241
})
12411242
})
1243+
describe("getOAS3RequiredRequestBodyContentType", () => {
1244+
const pathMethod = ["/test", "post"]
1245+
1246+
it("should return default requiredObj when requestBody is missing", () => {
1247+
const state = fromJS({
1248+
resolvedSubtrees: {
1249+
paths: {
1250+
"/test": {
1251+
post: {}
1252+
}
1253+
}
1254+
}
1255+
})
1256+
1257+
const result = getOAS3RequiredRequestBodyContentType(state, pathMethod)
1258+
1259+
expect(result).toEqual({
1260+
requestBody: false,
1261+
requestContentType: {}
1262+
})
1263+
})
1264+
1265+
it("should not crash and return requiredObj when requestBody has no content", () => {
1266+
const state = fromJS({
1267+
resolvedSubtrees: {
1268+
paths: {
1269+
"/test": {
1270+
post: {
1271+
requestBody: {
1272+
required: true
1273+
}
1274+
}
1275+
}
1276+
}
1277+
}
1278+
})
1279+
1280+
const result = getOAS3RequiredRequestBodyContentType(state, pathMethod)
1281+
1282+
expect(result).toEqual({
1283+
requestBody: true,
1284+
requestContentType: {}
1285+
})
1286+
})
1287+
1288+
it("should collect required schema fields per content type when content is present", () => {
1289+
const state = fromJS({
1290+
resolvedSubtrees: {
1291+
paths: {
1292+
"/test": {
1293+
post: {
1294+
requestBody: {
1295+
required: true,
1296+
content: {
1297+
"application/json": {
1298+
schema: {
1299+
required: ["name", "email"]
1300+
}
1301+
}
1302+
}
1303+
}
1304+
}
1305+
}
1306+
}
1307+
}
1308+
})
1309+
1310+
const result = getOAS3RequiredRequestBodyContentType(state, pathMethod)
1311+
1312+
expect(result).toEqual({
1313+
requestBody: true,
1314+
requestContentType: {
1315+
"application/json": ["name", "email"]
1316+
}
1317+
})
1318+
})
1319+
})
12421320
describe("isMediaTypeSchemaPropertiesEqual", () => {
12431321
const stateSingleMediaType = fromJS({
12441322
resolvedSubtrees: {

0 commit comments

Comments
 (0)