diff --git a/packages/luis/src/commands/luis/train/run.ts b/packages/luis/src/commands/luis/train/run.ts new file mode 100644 index 000000000..29a6e38fb --- /dev/null +++ b/packages/luis/src/commands/luis/train/run.ts @@ -0,0 +1,48 @@ +/*! + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +import {CLIError, Command, flags} from '@microsoft/bf-cli-command' + +const utils = require('../../../utils/index') + +export default class LuisTrainRun extends Command { + static description = 'Issues asynchronous training request for LUIS application' + + static examples = [` + $ bf luis:train:run --appId {APPLICATION_ID} --versionId {VERSION_ID} --endpoint {ENDPOINT} --subscriptionKey {SUBSCRIPTION_KEY} + `] + + static flags: any = { + help: flags.help({char: 'h'}), + endpoint: flags.string({description: 'LUIS endpoint hostname'}), + subscriptionKey: flags.string({description: 'LUIS cognitive services subscription key (mandatory, default: config:LUIS:subscriptionKey)'}), + appId: flags.string({description: 'LUIS application Id (mandatory, defaults to config:LUIS:appId)'}), + versionId: flags.string({description: 'Version to show training status (mandatory, defaults to config:LUIS:versionId)'}), + } + + async run() { + const {flags} = this.parse(LuisTrainRun) + const flagLabels = Object.keys(LuisTrainRun.flags) + const configDir = this.config.configDir + + let {endpoint, subscriptionKey, appId, versionId} = await utils.processInputs(flags, flagLabels, configDir) + + const requiredProps = {endpoint, subscriptionKey, appId, versionId} + utils.validateRequiredProps(requiredProps) + + const client = utils.getLUISClient(subscriptionKey, endpoint) + + try { + const trainingRequestStatus = await client.train.trainVersion(appId, versionId) + if (trainingRequestStatus) { + await utils.writeToConsole(trainingRequestStatus) + this.log('\nTraining request successfully issued') + } + } catch (err) { + throw new CLIError(`Failed to issue training request: ${err}`) + } + } + +} diff --git a/packages/luis/test/commands/luis/train/run.test.ts b/packages/luis/test/commands/luis/train/run.test.ts new file mode 100644 index 000000000..1b351e15d --- /dev/null +++ b/packages/luis/test/commands/luis/train/run.test.ts @@ -0,0 +1,46 @@ +import {expect, test} from '@oclif/test' +const sinon = require('sinon') +const uuidv1 = require('uuid/v1') +const utils = require('../../../../src/utils/index') +const fs = require('fs-extra') +import * as rimraf from 'rimraf' + +describe('luis:train:run', () => { + + beforeEach(() => { + sinon.stub(utils, 'processInputs').returnsArg(0) + }) + + afterEach(() => { + sinon.restore(); + }); + + test + .stdout() + .command(['luis:train:run', '--help']) + .it('should print the help contents when --help is passed as an argument', ctx => { + expect(ctx.stdout).to.contain('Issues asynchronous training request for LUIS application') + }) + + test + .stdout() + .stderr() + .command(['luis:train:run', '--appId', uuidv1(), '--endpoint', 'https://westus.api.cognitive.microsoft.com', '--versionId', '0.1']) + .it('displays an error if any required input parameters are missing', ctx => { + expect(ctx.stderr).to.contain(`Required input property 'subscriptionKey' missing.`) + }) + + test + .nock('https://westus.api.cognitive.microsoft.com', api => api + .post(uri => uri.includes('train')) + .reply(202, {"statusId": 2,"status": "UpToDate"}) + ) + .stdout() + .command(['luis:train:run', '--appId', uuidv1(), '--versionId', '0.1', '--subscriptionKey', uuidv1(), '--endpoint', 'https://westus.api.cognitive.microsoft.com']) + .it('issues an asynchronous training request', ctx => { + expect(ctx.stdout).to.contain('Training request successfully issued') + expect(ctx.stdout).to.contain('statusId') + expect(ctx.stdout).to.contain('status') + }) + +}) \ No newline at end of file