from __future__ import print_function, unicode_literals

import wee_slack
from wee_slack import parse_topic_command, topic_command_cb
from mock import patch


def test_parse_topic_without_arguments():
    channel_name, topic = parse_topic_command("/topic")

    assert channel_name is None
    assert topic is None


def test_parse_topic_with_text():
    channel_name, topic = parse_topic_command("/topic some topic text")

    assert channel_name is None
    assert topic == "some topic text"


def test_parse_topic_with_text_with_newline():
    channel_name, topic = parse_topic_command("/topic some topic text\nsecond line")

    assert channel_name is None
    assert topic == "some topic text\nsecond line"


def test_parse_topic_with_delete():
    channel_name, topic = parse_topic_command("/topic -delete")

    assert channel_name is None
    assert topic == ""


def test_parse_topic_with_channel():
    channel_name, topic = parse_topic_command("/topic #general")

    assert channel_name == "#general"
    assert topic is None


def test_parse_topic_with_channel_and_text():
    channel_name, topic = parse_topic_command("/topic #general some topic text")

    assert channel_name == "#general"
    assert topic == "some topic text"


def test_parse_topic_with_channel_and_delete():
    channel_name, topic = parse_topic_command("/topic #general -delete")

    assert channel_name == "#general"
    assert topic == ""


def test_call_topic_without_arguments(realish_eventrouter, channel_general):
    current_buffer = channel_general.channel_buffer
    wee_slack.EVENTROUTER = realish_eventrouter

    command = "/topic"

    with patch("wee_slack.w.prnt") as fake_prnt:
        result = topic_command_cb(None, current_buffer, command)
        fake_prnt.assert_called_with(
            channel_general.channel_buffer,
            'Topic for {} is "{}"'.format(
                channel_general.name, channel_general.topic["value"]
            ),
        )
        assert result == wee_slack.w.WEECHAT_RC_OK_EAT


def test_call_topic_with_unknown_channel(realish_eventrouter, team, channel_general):
    current_buffer = channel_general.channel_buffer
    wee_slack.EVENTROUTER = realish_eventrouter

    command = "/topic #nonexisting"

    with patch("wee_slack.w.prnt") as fake_prnt:
        result = topic_command_cb(None, current_buffer, command)
        fake_prnt.assert_called_with(
            team.channel_buffer,
            "#nonexisting: No such channel",
        )
        assert result == wee_slack.w.WEECHAT_RC_OK_EAT


def test_call_topic_with_channel_and_string(realish_eventrouter, channel_general):
    current_buffer = channel_general.channel_buffer
    wee_slack.EVENTROUTER = realish_eventrouter

    command = "/topic #general new topic"

    result = topic_command_cb(None, current_buffer, command)
    request = realish_eventrouter.queue[-1]
    assert request.request == "conversations.setTopic"
    assert request.post_data == {
        "channel": "C407ABS94",
        "topic": "new topic",
    }
    assert result == wee_slack.w.WEECHAT_RC_OK_EAT
