slack.tests.plugin - Pytest fixtures

Slack-sansio provide a pytest plugin with some fixtures to facilitate testing of the slack API.

Installation

To load the plugin add the snippet below to your conftest.py.

pytest_plugins = "slack.tests.plugin",

Available fixtures

slack.tests.plugin.slack_event()

Fixture returning data sent by the slack event API.

This fixture can be parametrized to return one or more available event from slack.tests.data.Events and slack.tests.data.Messages.

@pytest.mark.parametrize("slack_event", ("channel_deleted", "simple"), indirect=True)
def test_events(slack_event):
    assert slack_event["event"]["type"] in ("channel_deleted", "message")


To only get slack.tests.data.Messages members you can parametrize the test that way:

@pytest.mark.parametrize(
    "slack_event", {**slack.tests.data.Messages.__members__}, indirect=True
)
def test_messages(slack_event):
    assert slack_event["event"]["type"] == "message"


slack.tests.plugin.slack_action()

Fixture returning data sent by the slack API when using an interactive message or dialog.

This fixture can be parametrized to return one or more available action from slack.tests.data.InteractiveMessage or slack.tests.data.DialogSubmission.

@pytest.mark.parametrize("slack_action", ("button_ok", "button_cancel"), indirect=True)
def test_actions(slack_action):
    action = slack.actions.Action.from_http(slack_action)
    assert action["type"] == "interactive_message"


slack.tests.plugin.slack_command()

Fixture returning data sent by the slack API when using a slash command.

This fixture can be parametrized to return one or more available command from slack.tests.data.Commands.

@pytest.mark.parametrize("slack_command", ("text", "no_text"), indirect=True)
def test_commands(slack_command):
    command = slack.commands.Command(slack_command)
    assert command["command"] == "/test"


slack.tests.plugin.slack_client()

Fixture returning a fake slack client.

By default the client return to any request:
  • status: 200
  • body: {'ok': True}
  • headers: {'content-type': 'application/json; charset=utf-8'}

Parametrize a reponse:

@pytest.mark.asyncio
@pytest.mark.parametrize(
    "slack_client", ({"body": {"ok": True, "hello": "world"}},), indirect=True
)
async def test_client_custom_body(slack_client):
    data = await slack_client.query(slack.methods.AUTH_TEST)
    assert data == {"ok": True, "hello": "world"}


The body parameter of a request can be a string corresponding to one of the methods available in slack.tests.data.Methods.

@pytest.mark.asyncio
@pytest.mark.parametrize("slack_client", ({"body": "auth_test"},), indirect=True)
async def test_client_body(slack_client):
    data = await slack_client.query(slack.methods.AUTH_TEST)
    assert data["team"] == "TestTeam Workspace"


Parametrize multiple responses:

@pytest.mark.asyncio
@pytest.mark.parametrize("slack_client", ({"status": [200, 500]},), indirect=True)
async def test_client_status(slack_client):

    await slack_client.query(slack.methods.AUTH_TEST)

    with pytest.raises(slack.exceptions.HTTPException):
        await slack_client.query(slack.methods.AUTH_TEST)


@pytest.mark.asyncio
@pytest.mark.parametrize(
    "slack_client", ({"body": ["channels_iter", "channels"]},), indirect=True
)
async def test_client_iter(slack_client):
    async for channel in slack_client.iter(slack.methods.CHANNELS_LIST):
        print(channel)


Parametrize multiple run:

@pytest.mark.asyncio
@pytest.mark.parametrize(
    "slack_client,ok",
    (({"status": 200}, True), ({"status": 500}, False)),
    indirect=["slack_client"],
)
async def test_client_multiple_run(slack_client, ok):

    if ok:
        await slack_client.query(slack.methods.AUTH_TEST)
    else:
        with pytest.raises(slack.exceptions.HTTPException):
            await slack_client.query(slack.methods.AUTH_TEST)


Available data

class slack.tests.data.Events[source]

List of available event for testing

  • channel_deleted
  • pin_added
  • reaction_added
class slack.tests.data.Messages[source]

List of available message for testing

  • simple
  • snippet
  • shared
  • threaded
  • bot
  • bot_edit
  • attachment
  • edit
  • edit_threaded
  • mention
  • none_text
  • channel_topic
class slack.tests.data.Commands[source]

List of available command for testing

  • text
  • no_text
class slack.tests.data.InteractiveMessage[source]

List of available interactive message action for testing

  • button_ok
  • button_cancel
class slack.tests.data.DialogSubmission[source]

List of available dialog submission action for testing

  • dialog_submission
class slack.tests.data.Methods[source]

List of available methods for testing

  • channels
  • channels_iter (channels with a cursor)
  • users
  • users_iter (users with a cursor)
  • users_info
  • auth_test
  • rtm_connect