lib/commands/generate-api-scenario/static.ts (114 lines of code) (raw):

// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. /* eslint-disable id-blacklist */ import { resolve as pathResolve, dirname, join as pathJoin } from "path"; import * as yargs from "yargs"; import { StaticApiScenarioGenerator } from "../../apiScenario/gen/staticApiScenarioGenerator"; import { RestlerApiScenarioGenerator } from "../../apiScenario/gen/restlerApiScenarioGenerator"; import { cliSuppressExceptions } from "../../cliSuppressExceptions"; import { getInputFiles } from "../../util/utils"; import { generateApiTestBasedOnRules } from "../../apiScenario/gen/ApiTestRuleBasedGenerator"; export const command = "static"; export const describe = "Generate api-scenario from specs."; export const builder: yargs.CommandBuilder = { o: { alias: "outputDir", describe: "Output directory where the api scenario will be stored.", string: true, default: "./", }, dependency: { describe: "The file path of the RESTler dependency.", string: true, }, tag: { describe: "the readme tag name.", string: true, }, readme: { describe: "path to readme.md file", string: true, }, specs: { describe: "one or more spec file paths. type: array", type: "array", }, rules: { describe: "generate api scenarios file rules split by comma. supported: operations-list.", string: true, default: "operations-list", }, useExample: { describe: "use example in the spec file.", boolean: true, default: false, }, scope: { describe: "path of a scenario file to be scope of generated scenario file", string: true, }, armRule: { describe: "generate arm rule based api test", boolean: true, default: false, }, basicScenario: { describe: "generate arm rule based api test", string: false, }, }; export async function handler(argv: yargs.Arguments): Promise<void> { await cliSuppressExceptions(async () => { const swaggerFilePaths: string[] = (argv.specs || []).map((it: string) => pathResolve(it)); let tag = "default"; let fileRoot = process.cwd(); if (argv.readme !== undefined) { const readmeMd: string = pathResolve(argv.readme); fileRoot = dirname(readmeMd); const inputSwaggerFile = (await getInputFiles(readmeMd, argv.tag)).map((it: string) => pathJoin(fileRoot, it) ); console.log(`input swagger files: ${inputSwaggerFile}`); for (const it of inputSwaggerFile) { if (swaggerFilePaths.indexOf(it) === -1) { swaggerFilePaths.push(it); } } } console.log(`fileRoot: ${fileRoot}`); console.log("input-file:"); console.log(swaggerFilePaths); if (argv.dependency && !argv.armRule) { const generator = RestlerApiScenarioGenerator.create({ fileRoot: fileRoot, checkUnderFileRoot: false, swaggerFilePaths: swaggerFilePaths, outputDir: pathResolve(argv.outputDir), dependencyPath: pathResolve(argv.dependency), useExample: argv.useExample, scope: argv.scope, }); await generator.initialize(); const def = await generator.generate(); await generator.writeFile(def); } else if (argv.armRule) { if (!argv.dependency) { console.log("Missing dependency file"); return 1; } generateApiTestBasedOnRules( swaggerFilePaths, argv.dependency, argv.outputDir, argv.basicScenario ); } else { const generator = StaticApiScenarioGenerator.create({ swaggerFilePaths: swaggerFilePaths, tag: tag, rules: argv.rules.split(","), }); await generator.initialize(); await generator.generateTestDefFiles(); await generator.writeGeneratedFiles(); } return 0; }); }