def test_messages():
    user, password = "******", "p1"
    resp = {"message_list": [{"a": "b"}, {"c": "d"}]}
    client = LathermailClient(user, password)

    last_request = [None]
    last_url = [None]

    @httmock.all_requests
    def messages_mock(url, request):
        assert url.path == "/api/0/messages/"
        assert request.headers["X-Mail-Password"] == password
        assert request.headers["X-Mail-Inbox"] == user
        last_url[0] = url
        last_request[0] = request
        return json_response(resp, 204 if request.method == "DELETE" else 200)


    with httmock.HTTMock(messages_mock):
        assert client.get_messages() == resp["message_list"]
        assert not last_url[0].query
        client.get_messages(recipients_address="*****@*****.**")
        assert "tst.tt" in last_url[0].query
        assert "recipients.address" in last_url[0].query
        assert last_request[0].method == "GET"

        now = datetime.datetime.now()
        client.get_messages(created_at_lt=now)
        assert now.strftime("%Y-%m-%d") in last_url[0].query

        client.delete_messages(recipients_address="*****@*****.**")
        assert last_request[0].method == "DELETE"
        assert "tst.tt" in last_url[0].query
        assert "recipients.address" in last_url[0].query
def test_inboxes():
    user, password = "******", "p1"
    resp = {"inbox_list": ["a", "b"]}
    client = LathermailClient(user, password)

    @httmock.all_requests
    def inboxes_mock(url, request):
        assert url.path == "/api/0/inboxes"
        assert request.headers["X-Mail-Password"] == password
        assert "X-Mail-Inbox" not in request.headers
        return json_response(resp)


    with httmock.HTTMock(inboxes_mock):
        assert client.get_inboxes() == resp["inbox_list"]
        password = "******"
        assert client.get_inboxes(password) == resp["inbox_list"]
def test_attachment():
    user, password = "******", "p1"
    resp = "data"
    client = LathermailClient(user, password)
    message_id = "aaaa"
    attachment_index = 1

    @httmock.all_requests
    def messages_mock(url, request):
        assert url.path == "/api/0/messages/{0}/attachments/{1}".format(message_id, attachment_index)
        assert request.headers["X-Mail-Password"] == password
        assert request.headers["X-Mail-Inbox"] == user
        return resp

    with httmock.HTTMock(messages_mock):
        assert client.get_attachment(message_id, attachment_index) == resp
        attachment_index = 2
        assert client.get_attachment(message_id, attachment_index) == resp
def test_exceptions():
    user, password = "******", "p1"
    client = LathermailClient(user, password)
    resp = None

    @httmock.all_requests
    def req_mock(url, request):
        return resp

    with httmock.HTTMock(req_mock):
        for code in 400, 403, 500:
            resp = json_response({"a": "b"}, code)
            with pytest.raises(InvalidStatus) as e:
                client.get_inboxes()
            assert e.value.code == code

        content = b"<html>not json here </html>"
        resp = httmock.response(200, content=content)
        with pytest.raises(LathermailError) as e:
            client.get_inboxes()
        assert content.decode("utf8") in repr(e.value)
def test_single_message():
    user, password = "******", "p1"
    resp = {"message_info": {"a": "b"}}
    client = LathermailClient(user, password)
    message_id = "aaaa"
    last_request = [None]

    @httmock.all_requests
    def messages_mock(url, request):
        assert url.path == "/api/0/messages/{0}".format(message_id)
        assert request.headers["X-Mail-Password"] == password
        assert request.headers["X-Mail-Inbox"] == user
        last_request[0] = request
        return json_response(resp)


    with httmock.HTTMock(messages_mock):
        assert client.get_single_message(message_id) == resp["message_info"]
        assert last_request[0].method == "GET"

        message_id = "bbb"
        client.delete_single_message(message_id)
        assert last_request[0].method == "DELETE"