Merge pull request #413 from postmanlabs/issue/379

Set param type in request to `file` if schema type is `string` and format is `binary`
This commit is contained in:
Vishal Shingala
2021-10-11 12:38:28 +05:30
committed by GitHub
4 changed files with 43 additions and 16 deletions

View File

@@ -337,7 +337,7 @@ module.exports = {
// Discard format if not supported by both json-schema-faker and ajv or pattern is also defined
if (!_.includes(SUPPORTED_FORMATS, schema.format) || (schema.pattern && schema.format)) {
delete schema.format;
return _.omit(schema, 'format');
}
}

View File

@@ -1701,6 +1701,7 @@ module.exports = {
var contentObj, // content is required
bodyData,
param,
originalParam,
paramArray = [],
updateOptions = {},
reqBody = new sdk.RequestBody(),
@@ -1832,11 +1833,27 @@ module.exports = {
}
}
// Fetch the original param and if it is of type 'string' and format 'binary'
// then set the type of FormParam to 'file'
originalParam = _.get(contentObj[FORM_DATA], ['schema', 'properties', key]);
if (originalParam &&
originalParam.type === 'string' &&
originalParam.format === 'binary'
) {
param = new sdk.FormParam({
key: key,
value: '',
type: 'file'
});
}
else {
param = new sdk.FormParam({
key: key,
value: value,
type: 'text'
});
}
param.description = description;
paramArray.push(param);
});

View File

@@ -93,13 +93,15 @@ describe('DEREF FUNCTION TESTS ', function() {
}
},
parameterSource = 'REQUEST',
output = deref.resolveRefs(schema, parameterSource, componentsAndPaths),
output_withdot = deref.resolveRefs(schemaWithDotInKey, parameterSource, componentsAndPaths),
output_customFormat = deref.resolveRefs(schemaWithCustomFormat, parameterSource, componentsAndPaths),
output_withAllOf = deref.resolveRefs(schemaWithAllOf, parameterSource, componentsAndPaths),
output_validationTypeArray = deref.resolveRefs(schemaWithTypeArray, parameterSource, componentsAndPaths,
{}, 'VALIDATION'),
output_emptyObject = deref.resolveRefs(schemaWithEmptyObject, parameterSource, componentsAndPaths);
// deref.resolveRefs modifies the input schema and components so cloning to keep tests independent of each other
output = deref.resolveRefs(schema, parameterSource, _.cloneDeep(componentsAndPaths)),
output_withdot = deref.resolveRefs(schemaWithDotInKey, parameterSource, _.cloneDeep(componentsAndPaths)),
output_customFormat = deref.resolveRefs(schemaWithCustomFormat, parameterSource,
_.cloneDeep(componentsAndPaths)),
output_withAllOf = deref.resolveRefs(schemaWithAllOf, parameterSource, _.cloneDeep(componentsAndPaths)),
output_validationTypeArray = deref.resolveRefs(schemaWithTypeArray, parameterSource,
_.cloneDeep(componentsAndPaths), {}, 'VALIDATION'),
output_emptyObject = deref.resolveRefs(schemaWithEmptyObject, parameterSource, _.cloneDeep(componentsAndPaths));
expect(output).to.deep.include({ type: 'object',
required: ['id'],
@@ -302,6 +304,8 @@ describe('DEREF FUNCTION TESTS ', function() {
expect(_.get(schemaResoltionCache, ['#/components/schemas/schemaUsed', 'schema'])).to.not.deep
.equal(componentsAndPaths.components.schemas.schemaUsed);
resolvedSchema = deref.resolveRefs(schema, parameterSource, componentsAndPaths, schemaResoltionCache);
// Restoring the original format as it is deleted if not supported by json-schema-faker and ajv
resolvedSchema.properties.id.format = 'int64';
/**
* Even though schema cache contains schemaUsed as impartially cached,resolution were it's used again will

View File

@@ -1777,14 +1777,18 @@ describe('SCHEMA UTILITY FUNCTION TESTS ', function () {
schema: {
type: 'object',
properties: {
file: {
array: {
type: 'array',
items: {
type: 'string'
}
},
file: {
type: 'string',
format: 'binary'
}
},
required: ['file']
required: ['array']
}
}
}
@@ -1792,7 +1796,9 @@ describe('SCHEMA UTILITY FUNCTION TESTS ', function () {
result, resultBody;
result = SchemaUtils.convertToPmBody(requestBody);
resultBody = (result.body.formdata.toJSON());
expect(resultBody[0].key).to.equal('file');
expect(resultBody[0].key).to.equal('array');
expect(resultBody[1].key).to.equal('file');
expect(resultBody[1].type).to.equal('file');
expect(result.contentHeader).to.deep.include(
{ key: 'Content-Type', value: 'multipart/form-data' });
done();