Botkit-Mock - Write tests for Botkit.
npm install --save-dev botkit-mock- Require
botkit-mockin your test:const { BotMock } = require('botkit-mock'); - Require your controller in your test:
const fileBeingTested = require("./indexController") - Follow test case examples seen here
Botkit depends on adapters (Slack, Facebook, MS Teams, etc).
Botkit-Mock is an extension of Botkit that provides an interface for accepting user messages through .usersInput. You can connect any valid Botkit adapters to Botkit-Mock to extend Botkit-Mock, although currently, we have only provided an extension for Slack.
Assuming you have a controller written like below:
module.exports = function(controller) {
// simple answer
controller.hears(['help'], 'direct_message', function (bot, message) {
bot.reply(message, 'help message');
});
}You can write a describe block to test your controller:
const { BotMock, SlackApiMock } = require('botkit-mock');
const {SlackAdapter, SlackMessageTypeMiddleware, SlackEventMiddleware} = require('botbuilder-adapter-slack');
const yourController = require("./yourController");
describe('slack message',()=>{
beforeEach(()=>{
const adapter = new SlackAdapter(SlackApiMock.slackAdapterMockParams);
adapter.use(new SlackEventMiddleware());
adapter.use(new SlackMessageTypeMiddleware());
this.controller = new BotMock({
adapter: adapter,
disable_webserver: true
});
SlackApiMock.bindMockApi(this.controller);
yourController(this.controller);
});
});In your it statement, use the controller.usersInput method to define the conversation.
it('should return `help message` if user types `help`', async () => {
const message = await this.controller.usersInput(
[
{
type: "message",
user: 'someUserId',
channel: 'someChannel',
messages: [
{
text: 'help', isAssertion: true
}
]
}
]
);
return assert.equal(message.text, 'help message');
});
/* example of botkit response
{
type: 'message',
text: 'help message',
attachmentLayout: undefined,
attachments: undefined,
suggestedActions: undefined,
speak: undefined,
inputHint: undefined,
summary: undefined,
textFormat: undefined,
importance: undefined,
deliveryMode: undefined,
expiration: undefined,
value: undefined,
channelData:
{
channelId: 'slack',
serviceUrl: '',
conversation: {
id: 'someChannel',
thread_ts: null
},
from:
{
id: ''
},
recipient: { id: 'someUserId' } },
channelId: 'slack',
serviceUrl: undefined,
conversation: { id: 'someChannel', thread_ts: null },
from: { id: undefined },
recipient: { id: 'someUserId' }
}
*/useruser slackId (required) (string)channelis a channel where user sends messages (required) (string)typespecify botkit message type. iedirect_message,message_received,interactive_message_callback. (defaults todirect_message) (string)messages(array) that includes:isAssertionindicates which conversation response array to return in.then()in multi-user testing. (required) (boolean)deepindicates the index of the conversation response to return in.then(). 0 (default) is the last response, 1 is the second-to-last, etc.. (integer)timeoutset timeout for message in milliseconds (integer)waitBeforealias fortimeout, indicates how many milliseconds to wait before sending the message to the bot (integer)waitAfterindicates how many milliseconds to wait for the bot response, useful for long-running commands (integer)textthe message's text (string)channelindicates the channel the message was sent in. This overrides the channel defined inusersInputfor this current message. (string)- ...any other fields you may be testing for including
attachments,callback_id, etc...
The Slack adapter is located in ./lib/slack. The ApiMock allows you to test Slack's API. It binds the following properties to the Botkit-Mock controller.
controller.axiosMockAdapter- Axios mock helps to mock requests to the Slack API. Examples of this are used in ./examples/general-slack/updateApiResponsesSpec.controller.apiLogByKey- This contains information about results of requests throughbot.api.controller.httpBodyLog- This contains an array of Botkit responses to Slack usually set throughhttpBody().
Botkit-Mock supports all of Botkit's core functionality by default, but we need help creating adapters for platforms other than Slack. To add functionality to Botkit-Mock for your favorite chat platform, please open an issue and we can advise.
-
Botkit Starter Kit - Tests for the Botkit starter kit (Glitch)
-
Slack API - Tests for various Slack API calls. Includes API response overrides.
Built by the team at https://www.gratify.ai.
Like Botkit-Mock? Donate to our team: amplicity.eth