Botkit-Mock - Write tests for Botkit.
Setup
npm install --save botkit-mock
- Require
botkit-mock
in your test: const { BotMock } = require('botkit-mock');
- Require your controller in your test:
const fileBeingTested = require("./indexController")
- Follow test case examples seen here
General Information
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.
Basic Usage
Testing Controllers
Assuming you have a controller written like below:
module.exports = function(controller) {
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');
});
.usersInput options
user
user slackId (required) (string)channel
is a channel where user sends messages (required) (string)type
specify botkit message type. ie direct_message
, message_received
, interactive_message_callback
. (defaults to direct_message
) (string)messages
(array) that includes:
isAssertion
indicates which conversation response array to return in .then()
in multi-user testing. (required) (boolean)deep
indicates the index of the conversation response to return in .then()
. 0 (default) is the last response, 1 is the second-to-last, etc.. (integer)timeout
set timeout for message in milliseconds (integer)waitBefore
alias for timeout
, indicates how many milliseconds to wait before sending the message to the bot (integer)waitAfter
indicates how many milliseconds to wait for the bot response, useful for long-running commands (integer)text
the message's text (string)channel
indicates the channel the message was sent in. This overrides the channel defined in usersInput
for this current message. (string)- ...any other fields you may be testing for including
attachments
, callback_id
, etc...
Slack Adapter Information
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 through bot.api
.controller.httpBodyLog
- This contains an array of Botkit responses to Slack usually set through httpBody()
.
Contributing
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.
Examples
Built by the team at https://www.gratify.ai.
Like Botkit-Mock? Donate BTC to our team: 1KwpqzTvpLWiUST2V5wmPiT3twwc1pZ9tP