Skip to content

Commit

Permalink
feat: add option to read json from file path (#151)
Browse files Browse the repository at this point in the history
  • Loading branch information
kakhaUrigashvili authored and kakha urigashvili committed Apr 29, 2020
1 parent 30b63ea commit b8e001e
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 8 deletions.
15 changes: 14 additions & 1 deletion lib/commands/smapi/smapi-command-handler.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const { CustomSmapiClientBuilder } = require('ask-smapi-sdk');
const os = require('os');
const path = require('path');
const fs = require('fs-extra');
const R = require('ramda');

const AppConfig = require('@src/model/app-config');
Expand Down Expand Up @@ -32,6 +33,18 @@ const _mapToArgs = (params, paramsObject) => {
return res;
};

const _loadJson = (value) => {
const filePrefix = 'file:';
let json;
if (value.startsWith(filePrefix)) {
const filePath = value.split(filePrefix).pop();
json = fs.readJSONSync(filePath);
} else {
json = JSON.parse(value);
}
return json;
};

const _mapToParams = (optionsValues, flatParamsMap, commanderToApiCustomizationMap) => {
const res = {};
Object.keys(optionsValues).forEach(key => {
Expand All @@ -51,7 +64,7 @@ const _mapToParams = (optionsValues, flatParamsMap, commanderToApiCustomizationM
mergeObject = unflatten(mergeObject, BODY_PATH_DELIMITER);
res[param.rootName] = R.mergeDeepRight(res[param.rootName], mergeObject);
} else if (param.json) {
res[param.name] = JSON.parse(value);
res[param.name] = _loadJson(value);
} else {
res[param.name] = value;
}
Expand Down
4 changes: 3 additions & 1 deletion lib/commands/smapi/smapi-commander.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ const defaultOptions = [{
description: optionModel.debug.description
}];
const requiredTemplate = { true: '[REQUIRED]', false: '[OPTIONAL]' };
const jsonTemplate = { true: '[JSON]\n', false: '' };
const jsonTemplate = { true: '[JSON]: JSON string or a file. Example: "$(cat {filePath})" '
+ 'or "file:{filePath}", either absolute or relative path are supported.\n',
false: '' };

const _makeEnumTemplate = (param) => (param.enum ? `[ENUM]: ${param.enum.join()}.\n` : '');
const _makeArrayTemplate = (param) => (param.isArray ? '[MULTIPLE]: Values can be separated by comma.\n' : '');
Expand Down
28 changes: 22 additions & 6 deletions test/unit/commands/smapi/smapi-command-handler-test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const { expect } = require('chai');
const sinon = require('sinon');
const fs = require('fs-extra');
const { CustomSmapiClientBuilder } = require('ask-smapi-sdk');
const AppConfig = require('@src/model/app-config');
const { ARRAY_SPLIT_DELIMITER } = require('@src/commands/smapi/cli-customization-processor');
Expand Down Expand Up @@ -43,12 +44,7 @@ describe('Smapi test - smapiCommandHandler function', () => {
['sessionMode', { rootName: 'simulationsApiRequest', bodyPath: 'session>>>mode' }]]);

const commanderToApiCustomizationMap = new Map();
const cmdObj = {
opts() {
return { skillId, someNumber, someBoolean, someJson: JSON.stringify(jsonValue), someArray: arrayValueStr };
},
_name: commandName
};
let cmdObj;

const clientStub = { apiConfiguration: { apiEndpoint: null } };

Expand All @@ -58,6 +54,12 @@ describe('Smapi test - smapiCommandHandler function', () => {
};

beforeEach(() => {
cmdObj = {
opts() {
return { skillId, someNumber, someBoolean, someJson: JSON.stringify(jsonValue), someArray: arrayValueStr };
},
_name: commandName
};
sinon.stub(AuthorizationController.prototype, '_getAuthClientInstance').returns(
{ config: {} }
);
Expand Down Expand Up @@ -86,6 +88,20 @@ describe('Smapi test - smapiCommandHandler function', () => {
expect(calledParams).eql(expectedParams);
});

it('| should read parameter from json file amd send smapi command', async () => {
const jsonFilePath = 'file:some-file.json';
sinon.stub(fs, 'readJSONSync').returns(jsonValue);
cmdObj.opts = () => ({ skillId, someNumber, someBoolean, someJson: jsonFilePath, someArray: arrayValueStr });

await smapiCommandHandler(apiOperationName, flatParamsMap, commanderToApiCustomizationMap, cmdObj, modelInterceptor);

const expectedParams = [jsonValue, skillId, null, arrayValue,
{ input: { someNumber: Number(someNumber), someBoolean: Boolean(someBoolean) } }];
const calledParams = clientStub[sdkFunctionName].args[0];

expect(calledParams).eql(expectedParams);
});

it('| should display debug message when debug flag is passed', async () => {
const cmdObjDebug = {
opts() {
Expand Down

0 comments on commit b8e001e

Please sign in to comment.