UNPKG

3.75 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const Promise = require("bluebird");
4const config_1 = require("./config");
5const OutgoingMessageComparator_1 = require("./OutgoingMessageComparator");
6function expectedResponsesAreEmpty(expectedResponses) {
7 return !expectedResponses || !expectedResponses.length || !expectedResponses[0].length;
8}
9/**
10 * Handles sending messages to bot, intercepts the responses, and compares the response to the expected responses for the particular test
11 * step
12 */
13class MessageService {
14 constructor(bot, config) {
15 this.bot = bot;
16 this.applyOutgoingMessageListener();
17 // in case messages aren't checked in the frist step(s)
18 //tslint:disable
19 this.botToUserMessageChecker = (msg) => { };
20 //tslint:enable
21 this.config = config;
22 }
23 /**
24 * Sends message to bot and sets the expectations for the responses.
25 *
26 * @param message message to send to bot
27 * @param expectedResponses expected responses
28 */
29 sendMessageToBot(message, expectedResponses, ignoreOrder = false) {
30 const outgoingMessageComparator = new OutgoingMessageComparator_1.OutgoingMessageComparator(expectedResponses, ignoreOrder);
31 const responsesFullyProcessedPromise = this.setBotToUserMessageChecker(expectedResponses, outgoingMessageComparator);
32 const receiveMessagePromise = new Promise((res, rej) => {
33 this.bot.receive(message, (e) => e ? rej(e) : res());
34 });
35 let promiseToReturn = expectedResponses && expectedResponses.length ? responsesFullyProcessedPromise : receiveMessagePromise;
36 if (this.config.timeout !== config_1.NO_TIMEOUT) {
37 promiseToReturn = promiseToReturn.timeout(this.config.timeout);
38 }
39 return promiseToReturn
40 .catch(Promise.TimeoutError, (e) => {
41 return Promise.reject(outgoingMessageComparator.getTimeoutErrorMessage());
42 });
43 }
44 /**
45 * Sets the current response expectation function for the message service. This allows the botToUserMessageChecker property to be
46 * updated within a closure with the proper expectedResponses. The promise that is returned will only resolve when all responses have
47 * been seen. Many tests will hang here and fail if an expected response is never received
48 *
49 * @param expectedResponses collection of expected responses for a particular step
50 */
51 setBotToUserMessageChecker(expectedResponses, outgoingMessageComparator) {
52 return new Promise((res, rej) => {
53 if (!outgoingMessageComparator.expectsAdditionalMessages()) {
54 return res();
55 }
56 this.botToUserMessageChecker = (messages) => {
57 if (!(messages instanceof Array)) {
58 messages = [messages];
59 }
60 messages.forEach((msg) => {
61 try {
62 outgoingMessageComparator.compareOutgoingMessageToExpectedResponses(msg);
63 }
64 catch (e) {
65 return rej(e);
66 }
67 });
68 if (!outgoingMessageComparator.expectsAdditionalMessages()) {
69 return res();
70 }
71 };
72 });
73 }
74 /**
75 * Inject middleware to intercept outgoing messages to check their content
76 */
77 applyOutgoingMessageListener() {
78 this.bot.on('outgoing', (e) => {
79 if (!(e instanceof Array)) {
80 e = [e];
81 }
82 this.botToUserMessageChecker(e);
83 });
84 }
85}
86exports.MessageService = MessageService;
87//# sourceMappingURL=MessageService.js.map
\No newline at end of file