Skip to content

Commit 6f30294

Browse files
committed
AB-289-refactored-code-and-added-test-case
1 parent a8de5ff commit 6f30294

File tree

2 files changed

+232
-88
lines changed

2 files changed

+232
-88
lines changed

libV2/schemaUtils.js

Lines changed: 100 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -739,49 +739,51 @@ let QUERYPARAM = 'query',
739739
/**
740740
* Processes and resolves types from Nested JSON schema structure.
741741
*
742-
* @param {Object} resolvedSchema - The resolved JSON schema to process.
743-
* @param {Set<string>} [parentRequired=new Set()] - A set of parent-required property keys to inherit.
742+
* @param {Object} resolvedSchema - The resolved JSON schema to process for type extraction.
744743
* @returns {Object} The processed schema details.
745744
*/
746745
processSchema = (resolvedSchema) => {
747746
if (resolvedSchema.type === 'object' && resolvedSchema.properties) {
748747
const schemaDetails = {
749-
type: resolvedSchema.type || 'unknown',
748+
type: resolvedSchema.type,
750749
properties: {},
751750
required: []
752751
},
753752
requiredProperties = new Set(resolvedSchema.required || []);
754753

755-
for (let [key, prop] of Object.entries(resolvedSchema.properties)) {
754+
for (let [propName, propValue] of Object.entries(resolvedSchema.properties)) {
755+
if (!propValue.type) {
756+
continue;
757+
}
756758
const propertyDetails = {
757-
type: prop.type || 'unknown',
758-
deprecated: prop.deprecated,
759-
enum: prop.enum || undefined,
760-
minLength: prop.minLength !== undefined ? prop.minLength : undefined,
761-
maxLength: prop.maxLength !== undefined ? prop.maxLength : undefined,
762-
minimum: prop.minimum !== undefined ? prop.minimum : undefined,
763-
maximum: prop.maximum !== undefined ? prop.maximum : undefined,
764-
pattern: prop.pattern || undefined,
765-
example: prop.example !== undefined ? prop.example : undefined,
766-
description: prop.description !== undefined ? prop.description : undefined,
767-
format: prop.format || undefined
759+
type: propValue.type,
760+
deprecated: propValue.deprecated,
761+
enum: propValue.enum || undefined,
762+
minLength: propValue.minLength,
763+
maxLength: propValue.maxLength,
764+
minimum: propValue.minimum,
765+
maximum: propValue.maximum,
766+
pattern: propValue.pattern,
767+
example: propValue.example,
768+
description: propValue.description,
769+
format: propValue.format
768770
};
769771

770-
if (requiredProperties.has(key)) {
771-
schemaDetails.required.push(key);
772+
if (requiredProperties.has(propName)) {
773+
schemaDetails.required.push(propName);
772774
}
773-
if (prop.properties) {
774-
let res = processSchema(prop);
775-
propertyDetails.properties = res.properties;
776-
if (res.required) {
777-
propertyDetails.required = res.required;
775+
if (propValue.properties) {
776+
let processedProperties = processSchema(propValue);
777+
propertyDetails.properties = processedProperties.properties;
778+
if (processedProperties.required) {
779+
propertyDetails.required = processedProperties.required;
778780
}
779781
}
780-
else if (prop.type === 'array' && prop.items) {
781-
propertyDetails.items = processSchema(prop.items);
782+
else if (propValue.type === 'array' && propValue.items) {
783+
propertyDetails.items = processSchema(propValue.items);
782784
}
783785

784-
schemaDetails.properties[key] = propertyDetails;
786+
schemaDetails.properties[propName] = propertyDetails;
785787
}
786788
if (schemaDetails.required && schemaDetails.required.length === 0) {
787789
schemaDetails.required = undefined;
@@ -790,15 +792,15 @@ let QUERYPARAM = 'query',
790792
}
791793
else if (resolvedSchema.type === 'array' && resolvedSchema.items) {
792794
const arrayDetails = {
793-
type: resolvedSchema.type || 'unknown',
795+
type: resolvedSchema.type,
794796
items: processSchema(resolvedSchema.items)
795797
};
796798
if (resolvedSchema.minItems !== undefined) { arrayDetails.minItems = resolvedSchema.minItems; }
797799
if (resolvedSchema.maxItems !== undefined) { arrayDetails.maxItems = resolvedSchema.maxItems; }
798800
return arrayDetails;
799801
}
800802
return {
801-
type: resolvedSchema.type || 'unknown'
803+
type: resolvedSchema.type
802804
};
803805
},
804806

@@ -820,6 +822,7 @@ let QUERYPARAM = 'query',
820822
) => {
821823
// reset readOnly and writeOnly prop cache before resolving schema to make sure we have fresh cache
822824
resetReadWritePropCache(context);
825+
823826
let resolvedSchema = _resolveSchema(context, schema, stack, resolveFor, seenRef);
824827

825828
/**
@@ -844,6 +847,7 @@ let QUERYPARAM = 'query',
844847
_.unset(resolvedSchema, utils.getJsonPathArray(key));
845848
});
846849
}
850+
847851
return resolvedSchema;
848852
},
849853

@@ -1590,6 +1594,7 @@ let QUERYPARAM = 'query',
15901594
}
15911595
});
15921596
}
1597+
15931598
// This is to handle cases when the jsf throws errors on finding unsupported types/formats
15941599
try {
15951600
bodyData = fakeSchema(context, requestBodySchema, shouldGenerateFromExample);
@@ -1603,11 +1608,12 @@ let QUERYPARAM = 'query',
16031608
bodyData = '';
16041609
}
16051610
}
1611+
16061612
}
1607-
if (context.enableTypeFetching && requestBodySchema.type !== undefined &&
1608-
requestBodySchema.type !== 'unknown') {
1609-
let properties = processSchema(requestBodySchema);
1610-
resolvedSchemaTypes.push(properties);
1613+
1614+
if (context.enableTypeFetching && requestBodySchema.type !== undefined) {
1615+
const requestBodySchemaTypes = processSchema(requestBodySchema);
1616+
resolvedSchemaTypes.push(requestBodySchemaTypes);
16111617
}
16121618

16131619
// Generate multiple examples when either request or response contains more than one example
@@ -1639,13 +1645,16 @@ let QUERYPARAM = 'query',
16391645
if (_.isEmpty(matchedRequestBodyExamples)) {
16401646
matchedRequestBodyExamples = requestBodyExamples;
16411647
}
1648+
16421649
const generatedBody = generateExamples(
16431650
context, responseExamples, matchedRequestBodyExamples, requestBodySchema, isBodyTypeXML);
1651+
16441652
return {
16451653
generatedBody,
16461654
resolvedSchemaType: resolvedSchemaTypes[0]
16471655
};
16481656
}
1657+
16491658
return {
16501659
generatedBody: [{ [bodyKey]: bodyData }],
16511660
resolvedSchemaType: resolvedSchemaTypes[0]
@@ -1660,7 +1669,7 @@ let QUERYPARAM = 'query',
16601669
urlencoded: urlEncodedParams
16611670
},
16621671
resolvedBody,
1663-
result,
1672+
resolvedBodyResult,
16641673
resolvedSchemaTypeObject;
16651674

16661675
if (_.isEmpty(requestBodyContent)) {
@@ -1671,15 +1680,16 @@ let QUERYPARAM = 'query',
16711680
requestBodyContent.schema = resolveSchema(context, requestBodyContent.schema);
16721681
}
16731682

1674-
result = resolveBodyData(context, requestBodyContent.schema);
1683+
resolvedBodyResult = resolveBodyData(context, requestBodyContent.schema);
16751684
resolvedBody =
1676-
result && Array.isArray(result.generatedBody) && result.generatedBody.length > 0 ?
1677-
result.generatedBody[0] :
1678-
undefined;
1679-
resolvedSchemaTypeObject =
1680-
result && result.resolvedSchemaType !== undefined ?
1681-
result.resolvedSchemaType :
1685+
1686+
resolvedBodyResult && Array.isArray(resolvedBodyResult.generatedBody) &&
1687+
resolvedBodyResult.generatedBody[0] ?
1688+
resolvedBodyResult.generatedBody[0] :
16821689
undefined;
1690+
1691+
resolvedSchemaTypeObject = resolvedBodyResult &&
1692+
resolvedBodyResult.resolvedSchemaType ? resolvedBodyResult.resolvedSchemaType : undefined;
16831693
resolvedBody && (bodyData = resolvedBody.request);
16841694

16851695
const encoding = requestBodyContent.encoding || {};
@@ -1728,22 +1738,25 @@ let QUERYPARAM = 'query',
17281738
formdata: formDataParams
17291739
},
17301740
resolvedBody,
1731-
result,
1741+
resolvedBodyResult,
17321742
resolvedSchemaTypeObject;
17331743

17341744
if (_.isEmpty(requestBodyContent)) {
17351745
return requestBodyData;
17361746
}
17371747

1738-
result = resolveBodyData(context, requestBodyContent.schema);
1748+
resolvedBodyResult = resolveBodyData(context, requestBodyContent.schema);
17391749
resolvedBody =
1740-
result && Array.isArray(result.generatedBody) && result.generatedBody.length > 0 ?
1741-
result.generatedBody[0] :
1742-
undefined;
1750+
resolvedBodyResult && Array.isArray(resolvedBodyResult.generatedBody) &&
1751+
resolvedBodyResult.generatedBody[0] ?
1752+
resolvedBodyResult.generatedBody[0] :
1753+
undefined;
1754+
17431755
resolvedSchemaTypeObject =
1744-
result && result.resolvedSchemaType !== undefined ?
1756+
resolvedBodyResult && resolvedBodyResult.resolvedSchemaType ?
17451757
result.resolvedSchemaType :
17461758
undefined;
1759+
17471760
resolvedBody && (bodyData = resolvedBody.request);
17481761

17491762
encoding = _.get(requestBodyContent, 'encoding', {});
@@ -1848,7 +1861,7 @@ let QUERYPARAM = 'query',
18481861
dataToBeReturned = {},
18491862
{ concreteUtils } = context,
18501863
resolvedBody,
1851-
result,
1864+
resolvedBodyResult,
18521865
resolvedSchemaTypeObject;
18531866

18541867
headerFamily = getHeaderFamily(bodyType);
@@ -1860,15 +1873,18 @@ let QUERYPARAM = 'query',
18601873
}
18611874
// Handling for Raw mode data
18621875
else {
1863-
result = resolveBodyData(context, requestContent[bodyType], bodyType);
1876+
resolvedBodyResult = resolveBodyData(context, requestContent[bodyType], bodyType);
18641877
resolvedBody =
1865-
result && Array.isArray(result.generatedBody) && result.generatedBody.length > 0 ?
1866-
result.generatedBody[0] :
1867-
undefined;
1878+
resolvedBodyResult && Array.isArray(resolvedBodyResult.generatedBody) &&
1879+
resolvedBodyResult.generatedBody[0] ?
1880+
resolvedBodyResult.generatedBody[0] :
1881+
undefined;
1882+
18681883
resolvedSchemaTypeObject =
1869-
result && result.resolvedSchemaType !== undefined ?
1870-
result.resolvedSchemaType :
1884+
resolvedBodyResult && resolvedBodyResult.resolvedSchemaType ?
1885+
resolvedBodyResult.resolvedSchemaType :
18711886
undefined;
1887+
18721888
resolvedBody && (bodyData = resolvedBody.request);
18731889

18741890
if ((bodyType === TEXT_XML || bodyType === APP_XML || headerFamily === HEADER_TYPE.XML)) {
@@ -2015,20 +2031,21 @@ let QUERYPARAM = 'query',
20152031
return reqParam;
20162032
},
20172033

2018-
createProperties = (schema, param) => {
2034+
createProperties = (param) => {
2035+
const { schema } = param;
20192036
return {
2020-
type: schema.type || 'unknown',
2021-
format: schema.format || undefined,
2022-
default: schema.default !== undefined ? schema.default : undefined,
2037+
type: schema.type,
2038+
format: schema.format,
2039+
default: schema.default,
20232040
required: param.required || false,
20242041
deprecated: param.deprecated || false,
20252042
enum: schema.enum || undefined,
2026-
minLength: schema.minLength !== undefined ? schema.minLength : undefined,
2027-
maxLength: schema.maxLength !== undefined ? schema.maxLength : undefined,
2028-
minimum: schema.minimum !== undefined ? schema.minimum : undefined,
2029-
maximum: schema.maximum !== undefined ? schema.maximum : undefined,
2030-
pattern: schema.pattern || undefined,
2031-
example: schema.example !== undefined ? schema.example : undefined
2043+
minLength: schema.minLength,
2044+
maxLength: schema.maxLength,
2045+
minimum: schema.minimum,
2046+
maximum: schema.maximum,
2047+
pattern: schema.pattern,
2048+
example: schema.example
20322049
};
20332050
},
20342051

@@ -2060,15 +2077,14 @@ let QUERYPARAM = 'query',
20602077
keyName,
20612078
paramValue = resolveValueOfParameter(context, param);
20622079

2063-
if (param && param.schema) {
2064-
const { name, schema } = param;
2065-
keyName = name;
2066-
properties = createProperties(schema, param);
2080+
if (param && param.name && param.schema && param.schema.type) {
2081+
keyName = param.name;
2082+
properties = createProperties(param);
20672083
}
2084+
20682085
queryParamTypeInfo = { keyName, properties };
2069-
if (keyName && param.schema && param.schema.type) {
2070-
queryParamTypes.push(queryParamTypeInfo);
2071-
}
2086+
2087+
queryParamTypes.push(queryParamTypeInfo);
20722088

20732089
if (typeof paramValue === 'number' || typeof paramValue === 'boolean') {
20742090
// the SDK will keep the number-ness,
@@ -2114,16 +2130,13 @@ let QUERYPARAM = 'query',
21142130
keyName,
21152131
paramValue = resolveValueOfParameter(context, param);
21162132

2117-
if (param && param.schema) {
2118-
const { name, schema } = param;
2119-
keyName = name;
2120-
properties = createProperties(schema, param);
2133+
if (param && param.name && param.schema && param.schema.type) {
2134+
keyName = param.name;
2135+
properties = createProperties(param);
21212136
}
21222137

21232138
pathParamTypeInfo = { keyName, properties };
2124-
if (keyName && param.schema && param.schema.type) {
2125-
pathParamTypes.push(pathParamTypeInfo);
2126-
}
2139+
pathParamTypes.push(pathParamTypeInfo);
21272140

21282141
if (typeof paramValue === 'number' || typeof paramValue === 'boolean') {
21292142
// the SDK will keep the number-ness,
@@ -2202,10 +2215,10 @@ let QUERYPARAM = 'query',
22022215
paramValue = resolveValueOfParameter(context, param);
22032216

22042217
if (param && param.name && param.schema && param.schema.type) {
2205-
const { name, schema } = param;
2206-
keyName = name;
2207-
properties = createProperties(schema, param);
2218+
keyName = param.name;
2219+
properties = createProperties(param);
22082220
}
2221+
22092222
headerTypeInfo = { keyName, properties };
22102223

22112224
headerTypes.push(headerTypeInfo);
@@ -2354,17 +2367,17 @@ let QUERYPARAM = 'query',
23542367
keyName = name;
23552368
properties = {
23562369
type: schema.type,
2357-
format: schema.format || undefined,
2358-
default: schema.default !== undefined ? schema.default : undefined,
2370+
format: schema.format,
2371+
default: schema.default,
23592372
required: schema.required || false,
23602373
deprecated: schema.deprecated || false,
23612374
enum: schema.enum || undefined,
2362-
minLength: schema.minLength !== undefined ? schema.minLength : undefined,
2363-
maxLength: schema.maxLength !== undefined ? schema.maxLength : undefined,
2364-
minimum: schema.minimum !== undefined ? schema.minimum : undefined,
2365-
maximum: schema.maximum !== undefined ? schema.maximum : undefined,
2366-
pattern: schema.pattern || undefined,
2367-
example: schema.example !== undefined ? schema.example : undefined
2375+
minLength: schema.minLength,
2376+
maxLength: schema.maxLength,
2377+
minimum: schema.minimum,
2378+
maximum: schema.maximum,
2379+
pattern: schema.pattern,
2380+
example: schema.example
23682381
};
23692382

23702383
}
@@ -2516,7 +2529,6 @@ let QUERYPARAM = 'query',
25162529
{ resolvedHeaderTypes, headers } = resolveResponseHeaders(context, responseSchema.headers),
25172530
responseBodyHeaderObj;
25182531
resolvedExamplesObject = resolvedExamples[0] && resolvedExamples[0].resolvedResponseBodyTypes;
2519-
// eslint-disable-next-line one-var
25202532
responseBodyHeaderObj =
25212533
{
25222534
body: JSON.stringify(resolvedExamplesObject, null, 2),

0 commit comments

Comments
 (0)