Slack Fixtures
This package contains type-safe fixtures and application wrappers for testing slack applications.
Install
yarn add --dev @slack-wrench/fixtures
# or
npm install --save-dev @slack-wrench/fixtures
Usage
Currently, we only support a subset of Slack's Event's API. We're implementing them as we need them and hope to have others do the same.
Events
import { events } from '@slack-wrench/fixtures';
Messages
events.message(
text: string,
options: Partial<MessageEvent> = {},
)
// : MessageEvent => { text, user, ts, ... }
Creates a message event.
Arguments:
-
text
: Text sent in the message -
options
: Any MessageEvent fields to override from default.
Returns: Object containing a message event
Slash Commands
import { slashCommand } from '@slack-wrench/fixtures';
slashCommand(
command: string,
options?: Partial<SlashCommand>,
)
// : SlashCommand => { command, user_id, team_id, ... }
Creates a slash command event.
Example:
// sending a text field
slashCommand('/command', { text: 'I just used a command!' });
Arguments:
-
command
: command name -
options
: Any SlashCommand fields to override from default.
Returns: Object containing a Slash Command event
Actions
import { actions } from '@slack-wrench/fixtures';
Block Button Action
actions.blockButtonAction(
action?: Partial<ButtonAction>,
options?: Partial<BlockButtonAction>,
)
// : BlockButtonAction => { type: 'block_actions', actions: [ { type: 'button', ...} ], user, ... }
Creates an event from a block button action.
Arguments:
-
action
: Overrides to ButtonAction values (normally a subset of{ action_id, block_id, value }
-
options
: Any fields to override on the default BlockAction event
Returns: Object containing a block action event
View Submit Action
view.viewSubmitAction(
view?: Partial<ViewOutput>,
options?: Partial<BlockButtonAction>,
)
// : ViewSubmitAction => { type: 'view_submission', view: { id: 'editView', state: {}, ...} ], user, ... }
Creates an event from a view submit action.
Arguments:
-
view
: Overrides to ViewOutput values, onViewSubmitAction.view
-
options
: Any fields to override on the default ViewSubmitAction event
Returns: Object containing a view submit action event
Global Fields
import { fields } from '@slack-wrench/fixtures';
The fields returned for all of the fixtures are set and accessible through fields
. This can be really helpful when writing tests. It also enables you to change the fields if you need them to be specific.
Overriding
All of the fields used by fixtures can be overridden globally. This might be helpful if you need something like the team
domain
and id
to be specific for your app.
// Here are a few examples of things you can change. This will affect all fixtures.
// Update the team id
fields.team.id = 'TANOTHERTEAM';
fields.team.domain = 'another-team';
// or as an object
fields.team = {
id: 'TANOTHERTEAM',
domain: 'another-team',
};
// Update the callback_id
fields.callback_id = 'FancyCallbackId';
If you want to reset the fields to their original values, you can call reset
. This is potentially helpful in testing hooks.
beforeEach(() => {
fields.reset();
});
Serverless Tester
import { ServerlessTester } from '@slack-wrench/fixtures';
A helper class for testing root level applications exposing slack endpoints.
import { ServerlessTester } from '@slack-wrench/fixtures';
import { App, ExpressReceiver } from '@slack/bolt';
const receiver = new ExpressReceiver({ signingSecret, endpoints });
const app = new App({ receiver, token });
handler = new ServerlessTester(receiver.app, signingSecret);
Arguments:
-
application
: App to test, supports any framework thatserverless-http
does eg: Express and Koa -
signingSecret
: Secret to sign all requests with, this should be the same string your application uses to verify requests.
Send Slack Events
Use handler.sendSlackEvent
to send Slack fixture events to your application.
const result = await handler.sendSlackEvent(slashCommand(command));
expect(result.statusCode).toEqual(200);
Arguments:
-
event
: Fixture/Slack event to simulate. -
path
: a path toPOST
the event to, defaults to/slack/events
, Bolt's default.
Send HTTP Requests
Use handler.sendHttp
to send any http event to your application.
const result = await handler.sendHttp({
body: 'How are you?',
httpMethod: 'GET',
path: '/',
});
expect(result.statusCode).toEqual(200);
Arguments:
-
event
: Request event to simulate. -
path
: a path toPOST
the event to, defaults to/slack/events
, Bolt's default.