diff --git a/lib/engines/luis/luis.ts b/lib/engines/luis/luis.ts index fa8a236..8aa7fdc 100644 --- a/lib/engines/luis/luis.ts +++ b/lib/engines/luis/luis.ts @@ -29,8 +29,8 @@ export class LuisRecognizer extends EngineRecognizer { qs: queryString, uri: `${this.baseUri}`, }; - try { - request(options, (error, response, body) => { + request(options, (error, response, body) => { + try { if (error) { reject(error); } else { @@ -53,10 +53,10 @@ export class LuisRecognizer extends EngineRecognizer { reject(new Error( JSON.stringify({ response, body }))); } } + } catch (error) { + reject(error); + } }); - } catch (error) { - reject(error); - } }) ; } diff --git a/lib/engines/luis/test/luis.constants.spec.ts b/lib/engines/luis/test/luis.constants.spec.ts index f54e83c..47c2a0a 100644 --- a/lib/engines/luis/test/luis.constants.spec.ts +++ b/lib/engines/luis/test/luis.constants.spec.ts @@ -25,16 +25,20 @@ export const CODE_504: string = '504'; export const APP_ID_CODE_200: string = 'APP_ID_200'; +export const APP_ID_CODE_200_BAD: string = 'APP_ID_200_BAD'; export const APP_ID_CODE_204: string = 'APP_ID_204'; export const APP_ID_CODE_400: string = 'APP_ID_400'; export const APP_ID_CODE_403: string = 'APP_ID_403'; export const APP_ID_CODE_404: string = 'APP_ID_404'; export const APP_ID_CODE_500: string = 'APP_ID_500'; export const APP_ID_CODE_504: string = 'APP_ID_504'; +export const APP_ID_CODE_ERROR: string = 'APP_ID_ERROR'; export const QUERY_200: string = 'QUERY_200'; +export const QUERY_200_BAD: string = 'QUERY_200_BAD'; export const QUERY_204: string = 'QUERY_204'; export const QUERY_500: string = 'QUERY_500'; +export const QUERY_ERROR: string = 'QUERY_ERROR'; export const INTENT_200 = { intent: 'INTENT.200', @@ -86,6 +90,10 @@ export const LUIS_URI_PARTS_200: LuisUriParts = { host: BASE_PATH, appId: APP_ID_CODE_200, } +export const LUIS_URI_PARTS_200_BAD: LuisUriParts = { + host: BASE_PATH, + appId: APP_ID_CODE_200_BAD, +} export const LUIS_URI_PARTS_204: LuisUriParts = { host: BASE_PATH, @@ -95,6 +103,10 @@ export const LUIS_URI_PARTS_500: LuisUriParts = { host: BASE_PATH, appId: APP_ID_CODE_500, } +export const LUIS_URI_PARTS_ERROR: LuisUriParts = { + host: BASE_PATH, + appId: APP_ID_CODE_ERROR, +} export const LUIS_QUERY_PARAMS_200: LuisQueryParams = { q: QUERY_200, @@ -102,6 +114,18 @@ export const LUIS_QUERY_PARAMS_200: LuisQueryParams = { timezoneOffset: 0, verbose: true, } +export const LUIS_QUERY_PARAMS_200_BAD: LuisQueryParams = { + q: QUERY_200_BAD, + 'subscription-key': SUBSCRIPTION_KEY, + timezoneOffset: 0, + verbose: true, +} +export const LUIS_QUERY_PARAMS_ERROR: LuisQueryParams = { + q: QUERY_ERROR, + 'subscription-key': SUBSCRIPTION_KEY, + timezoneOffset: 0, + verbose: true, +} export const LUIS_QUERY_PARAMS_204: LuisQueryParams = { q: QUERY_200, 'subscription-key': SUBSCRIPTION_KEY, @@ -121,6 +145,7 @@ export const LUIS_RESPONSE_200 = { entities: [], sentimentAnalysis: SENTIMENT } +export const LUIS_RESPONSE_ERROR = 'some error in request' export const LUIS_RESPONSE_204 = { query: QUERY_200, topScoringIntent: INTENT_204, diff --git a/lib/engines/luis/test/luis.mock.ts b/lib/engines/luis/test/luis.mock.ts index 0c1260e..0cf4dfa 100644 --- a/lib/engines/luis/test/luis.mock.ts +++ b/lib/engines/luis/test/luis.mock.ts @@ -2,32 +2,37 @@ import nock = require('nock'); import * as Constants from './luis.constants.spec'; -import { LuisUriParts } from './luis.constants.spec'; +import { LuisUriParts, LUIS_URI_PARTS_ERROR } from './luis.constants.spec'; interface NockGetReplyParams { uri: string; queryParams: any; - code: number; + code?: number; body?: any; headers?: nock.RequestHeaderMatcher; + replyWithError?: string; } function AddGetReplyToNock(nock: nock.Scope, nockGetParams: NockGetReplyParams) { - if (nockGetParams.queryParams !== undefined) { - return nock.get(nockGetParams.uri) - .query(true) + if (nockGetParams.replyWithError){ + return nock.get(nockGetParams.uri) + .query(true) + .replyWithError(nockGetParams.replyWithError); + } else { + if (nockGetParams.queryParams !== undefined) { + return nock.get(nockGetParams.uri) + .query(true) + .reply(nockGetParams.code, + nockGetParams.body); + } else { + return nock.get(nockGetParams.uri) + .reply(nockGetParams.code, + nockGetParams.body); -// .query(nockGetParams.queryParams) - .reply(nockGetParams.code, - nockGetParams.body); - } else { - return nock.get(nockGetParams.uri) - .reply(nockGetParams.code, - nockGetParams.body); - - } + } } +} function luisQueryUrl(params: LuisUriParts): string { return `/luis/v2.0/apps/${params.appId}`; @@ -41,6 +46,19 @@ var luisCases: NockGetReplyParams[] = [ body: Constants.LUIS_RESPONSE_200, headers: undefined }, + { + uri: luisQueryUrl(Constants.LUIS_URI_PARTS_200_BAD), + queryParams: Constants.LUIS_QUERY_PARAMS_200_BAD, + code: 200, + body: {}, + headers: undefined + }, + { + uri: luisQueryUrl(Constants.LUIS_URI_PARTS_ERROR), + queryParams: Constants.LUIS_QUERY_PARAMS_ERROR, + replyWithError: Constants.LUIS_RESPONSE_ERROR, + headers: undefined + }, { uri: luisQueryUrl(Constants.LUIS_URI_PARTS_204), queryParams: Constants.LUIS_QUERY_PARAMS_204, @@ -61,11 +79,8 @@ const luisMock = function(basePath: string) { var cases: NockGetReplyParams[] = luisCases; - cases.reduce((scope, current) => AddGetReplyToNock(scope, current), nock(basePath)); - - /*for (let mockUrl of nock.pendingMocks()) { - console.error('url: %j', mockUrl); - }*/ + const luisMockOut = cases.reduce((scope, current) => AddGetReplyToNock(scope, current), nock(basePath)); + return luisMockOut; }; diff --git a/lib/engines/luis/test/luis.spec.ts b/lib/engines/luis/test/luis.spec.ts index 55fb4cf..d5a10d1 100644 --- a/lib/engines/luis/test/luis.spec.ts +++ b/lib/engines/luis/test/luis.spec.ts @@ -22,6 +22,27 @@ describe('LuisApp', () => { expect(sut).to.be.a.instanceOf(LuisRecognizer); }); + it('request LUIS with utterace with result in request error', async () => { + + const app: IRecognizerParams = { + id: 'ID', + type: 'luis', + params: { + key: Constants.SUBSCRIPTION_KEY, + appHost: Constants.BASE_PATH, + appId: Constants.APP_ID_CODE_ERROR + } + } + + const sut: LuisRecognizer = new LuisRecognizer(app); + const result = await sut.recognice(Constants.QUERY_ERROR).catch((error:Error) => { + expect(error).to.be.instanceOf(Error); + expect(error.message).to.be.equal('some error in request'); + } + ); + expect(result).to.be.undefined; + }); + it('request LUIS with utterace with result code 200', async function() { const app: IRecognizerParams = { @@ -45,6 +66,27 @@ describe('LuisApp', () => { }); + it('request LUIS with utterace with bad result code 200', async function() { + + const app: IRecognizerParams = { + id: 'ID', + type: 'luis', + params: { + key: Constants.SUBSCRIPTION_KEY, + appHost: Constants.BASE_PATH, + appId: Constants.APP_ID_CODE_200_BAD + } + } + + const sut: LuisRecognizer = new LuisRecognizer(app); + const result = await sut.recognice(Constants.QUERY_200_BAD).catch((error: Error) => { + expect(error).to.be.instanceof(Error); + expect(error.message).to.be.equal('Cannot read property \'intent\' of undefined'); + }); + expect(result).to.be.undefined; + + }); + it('request LUIS with utterace with result code 204', async function() { const app: IRecognizerParams = { @@ -86,11 +128,6 @@ describe('LuisApp', () => { expect(error).is.instanceOf(Error); expect(error.message).to.be.equal('{"response":{"statusCode":500,"body":"{}","headers":{"content-type":"application/json"},"request":{"uri":{"protocol":"http:","slashes":true,"auth":null,"host":"westus.api.cognitive.microsoft.com","port":null,"hostname":"westus.api.cognitive.microsoft.com","hash":null,"search":"?q=QUERY_500&subscription-key=SUBS_KEY&timezoneOffset=0&verbose=true","query":"q=QUERY_500&subscription-key=SUBS_KEY&timezoneOffset=0&verbose=true","pathname":"/luis/v2.0/apps/APP_ID_500","path":"/luis/v2.0/apps/APP_ID_500?q=QUERY_500&subscription-key=SUBS_KEY&timezoneOffset=0&verbose=true","href":"http://westus.api.cognitive.microsoft.com/luis/v2.0/apps/APP_ID_500?q=QUERY_500&subscription-key=SUBS_KEY&timezoneOffset=0&verbose=true"},"method":"GET","headers":{}}},"body":"{}"}'); } - // expect(result.intent).is.deep.equal({ - // name: "INTENT.204", - // score: 0.2 - // }); - // expect(result.entities.length).is.equal(0); });