async def test_handle_disallowed_admin_call():
    # Given
    message = "Command '/eternal-guess admin info' can only be used by admin users."

    command_authorizer = FakeCommandAuthorizer(admin=False)

    message_provider = MagicMock(MessageProvider)
    message_provider.disallowed_admin_call.return_value = message

    route_handler = _route_handler(
        command_authorizer=command_authorizer,
        message_provider=message_provider,
    )

    event = DiscordEvent()
    route_definition = RouteDefinition(
        route=AsyncMock(Route),
        command="admin",
        subcommand="info",
        permission=PermissionSet.ADMIN,
    )

    # When
    response = await route_handler.handle(event, route_definition)

    # Then
    assert response.response_type == ResponseType.CHANNEL_MESSAGE
    assert response.is_ephemeral
    assert response.content == message
Exemple #2
0
async def test_admin_management_call():
    # Given
    guild_id = 1000
    management_role = 2000
    other_role = 2001
    management_channel = 3000
    other_channel = 3001

    configs_repository = FakeConfigsRepository(
        guild_id=guild_id,
        management_channels=[management_channel],
        management_roles=[management_role])

    command_authorizer = CommandAuthorizerImpl(
        configs_repository=configs_repository)

    event = DiscordEvent(
        guild_id=guild_id,
        channel_id=other_channel,
        member=DiscordMember(roles=[other_role], is_admin=True),
    )

    # When
    allowed = await command_authorizer.authorize_management_call(event=event)

    # Then
    assert allowed
async def test_handle_disallowed_management_call():
    # Given
    message = "Command 'create' can only be used by management users."

    command_authorizer = FakeCommandAuthorizer(management=False)

    message_provider = MagicMock(MessageProvider)
    message_provider.disallowed_management_call.return_value = message

    route_handler = _route_handler(
        command_authorizer=command_authorizer,
        message_provider=message_provider,
    )

    event = DiscordEvent()
    route_definition = RouteDefinition(
        route=AsyncMock(Route),
        command="create",
        permission=PermissionSet.MANAGEMENT,
    )

    # When
    response = await route_handler.handle(event, route_definition)

    # Then
    assert response.response_type == ResponseType.CHANNEL_MESSAGE
    assert response.is_ephemeral
    assert response.content == message
async def test_handle_raised_forbidden():
    # Given
    clientside_error_message = "The bot has insufficient permissions to do this."

    message_provider = MagicMock(MessageProvider)
    message_provider.bot_missing_access.return_value = clientside_error_message

    route_handler = _route_handler(message_provider=message_provider)

    event = DiscordEvent(command=DiscordCommand(command_name="ping", ))

    mock_route = AsyncMock(Route)
    mock_route.call.side_effect = discord.Forbidden(
        MagicMock(aiohttp.ClientResponse), "Missing Access.")

    route_definition = RouteDefinition(
        route=mock_route,
        command="ping",
    )

    # When
    response = await route_handler.handle(event, route_definition)

    # Then
    assert response.is_ephemeral
    assert response.content == clientside_error_message
Exemple #5
0
async def test_handle():
    # Given
    command_name = "admin"
    subcommand_name = "info"

    event = DiscordEvent(command=DiscordCommand(
        command_name=command_name,
        subcommand_name=subcommand_name,
    ),
                         member=DiscordMember())

    mock_response = DiscordResponse.ephemeral_channel_message(
        "Well handled brother!")

    mock_route_handler = AsyncMock(RouteHandler)
    mock_route_handler.handle.return_value = mock_response

    router = _router(route_handler=mock_route_handler, )

    # When
    response = await router.route(event)

    # Then
    mock_route_handler.handle.assert_called()
    arguments = mock_route_handler.handle.call_args[0]
    assert arguments[0] == event
    assert arguments[1].command == command_name
    if subcommand_name:
        assert arguments[1].subcommand == subcommand_name

    assert response.status_code == 200
    assert json.loads(response.body) == mock_response.json()
Exemple #6
0
def test_discord_event(mock_from_event):
    # Given
    test_authorizer = _TestAuthorizer(AuthorizationResult.PASS, None)

    test_router = _TestRouter(LambdaResponse.success({'response': 'mocked'}))

    event_body = {'type': 1}

    discord_event = DiscordEvent(CommandType.COMMAND)
    mock_from_event.return_value = discord_event

    event = {
        'body': json.dumps(event_body),
        'headers': {
            'x-signature-ed25519': '',
            'x-signature-timestamp': '',
        }
    }

    # When
    discord_event_handler = DiscordEventHandler(router=test_router,
                                                api_authorizer=test_authorizer)
    response = discord_event_handler.handle(event)

    # Then
    assert response['statusCode'] == 200
    assert json.loads(response['body']) == {'response': 'mocked'}
async def test_ping():
    # Given
    ping_route = PingRoute()

    # When
    response = await ping_route.call(DiscordEvent())

    # Then
    assert response.json() == {'type': InteractionType.PING}
Exemple #8
0
def _make_event(guild_id: int = -1,
                options: typing.Dict = None) -> DiscordEvent:
    if options is None:
        options = {}

    return DiscordEvent(command=DiscordCommand(
        command_name="admin",
        subcommand_name="remove-management-role",
        options=options),
                        guild_id=guild_id,
                        member=DiscordMember())
Exemple #9
0
def _make_event(guild_id: int = -1,
                options: typing.Dict = None) -> DiscordEvent:
    if options is None:
        options = {}

    return DiscordEvent(command=DiscordCommand(
        command_id=-1,
        command_name="admin",
        subcommand_name="does-not-matter",
        options=options),
                        guild_id=guild_id,
                        member=DiscordMember())
Exemple #10
0
async def test_authorized_admin_call():
    # Given
    guild_id = 1000

    command_authorizer = CommandAuthorizerImpl(
        configs_repository=FakeConfigsRepository(guild_id))

    event = DiscordEvent(
        guild_id=guild_id,
        member=DiscordMember(is_admin=True),
    )

    # When
    allowed = await command_authorizer.authorize_admin_call(event=event)

    # Then
    assert allowed
Exemple #11
0
def _make_event(guild_id: int = -1, options: typing.Dict = None, discord_member: DiscordMember = None,
                channel_id: int = -1):
    if options is None:
        options = {}

    if discord_member is None:
        discord_member = DiscordMember()

    return DiscordEvent(
        guild_id=guild_id,
        channel_id=channel_id,
        command=DiscordCommand(
            command_name="manage",
            subcommand_name="edit-guess",
            options=options,
        ),
        member=discord_member
    )
async def test_handle():
    # Given
    route_handler = _route_handler()

    event = DiscordEvent(command=DiscordCommand(command_name="ping", ))

    response = DiscordResponse.ephemeral_channel_message(
        "You handled it very well!")

    mock_route = AsyncMock(Route)
    mock_route.call.return_value = response

    route_definition = RouteDefinition(
        route=mock_route,
        command="ping",
    )

    # When
    response = await route_handler.handle(event, route_definition)

    # Then
    assert response == response
Exemple #13
0
def _create_guess_event(guild_id: int,
                        game_id: str,
                        user_id: int = -1,
                        user_nickname: str = 'nickname',
                        guess: str = 'not-relevant',
                        event_channel_id: int = -1,
                        member: DiscordMember = None):
    if member is None:
        member = DiscordMember(user_id=user_id, nickname=user_nickname)

    event = DiscordEvent(
        channel_id=event_channel_id,
        command=DiscordCommand(command_name="guess",
                               options={
                                   'game-id': game_id,
                                   'guess': guess,
                               }),
        member=member,
        guild_id=guild_id,
    )

    return event