2020-01-17 00:59:52 +00:00
|
|
|
import pytest
|
|
|
|
|
from asyncio import Future
|
|
|
|
|
from unittest import mock
|
|
|
|
|
|
|
|
|
|
import tornado.testing
|
|
|
|
|
import tornado.web
|
|
|
|
|
from tornado.httpclient import HTTPResponse
|
|
|
|
|
from tornado.escape import json_decode
|
|
|
|
|
|
|
|
|
|
from mopidy_iris import handlers
|
|
|
|
|
from mopidy_iris import core
|
|
|
|
|
from mopidy_iris.mem import iris
|
|
|
|
|
|
2020-02-06 10:12:28 +13:00
|
|
|
|
2020-01-17 00:59:52 +00:00
|
|
|
def async_return_helper(result):
|
|
|
|
|
f = Future()
|
|
|
|
|
f.set_result(result)
|
|
|
|
|
return f
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class HttpHandlerTest(tornado.testing.AsyncHTTPTestCase):
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
|
|
|
def inject_fixtures(self, caplog):
|
|
|
|
|
self._caplog = caplog
|
2020-02-06 10:12:28 +13:00
|
|
|
|
2020-01-17 00:59:52 +00:00
|
|
|
def get_app(self):
|
|
|
|
|
http_handler = handlers.HttpHandler
|
|
|
|
|
# http_handler.handle_result = mock.Mock()
|
|
|
|
|
# self.handler_mock = http_handler.handle_result
|
|
|
|
|
return tornado.web.Application(
|
2020-11-30 21:20:51 +13:00
|
|
|
[
|
|
|
|
|
(
|
|
|
|
|
r"/(.*)",
|
|
|
|
|
http_handler,
|
|
|
|
|
{
|
|
|
|
|
"core": None,
|
|
|
|
|
"config": {},
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
]
|
2020-01-17 00:59:52 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_get_method(self):
|
|
|
|
|
with mock.patch("time.time", return_value=100):
|
|
|
|
|
response = self.fetch("/test", method="GET")
|
|
|
|
|
|
|
|
|
|
assert 200 == response.code
|
|
|
|
|
result = json_decode(response.body)
|
|
|
|
|
assert "2.0" == result["jsonrpc"]
|
|
|
|
|
assert "test" == result["method"]
|
|
|
|
|
assert 100 == result["id"]
|
|
|
|
|
assert "Running test... please wait" == result["result"]["message"]
|
|
|
|
|
|
|
|
|
|
def test_get_method_headers(self):
|
|
|
|
|
response = self.fetch("/test", method="GET")
|
|
|
|
|
|
|
|
|
|
assert response.headers["Access-Control-Allow-Origin"] == "*"
|
|
|
|
|
assert "Origin" in response.headers["Access-Control-Allow-Headers"]
|
|
|
|
|
|
|
|
|
|
def test_get_unknown_method_is_error(self):
|
|
|
|
|
response = self.fetch("/baz", method="GET")
|
|
|
|
|
|
|
|
|
|
assert 400 == response.code
|
|
|
|
|
error = json_decode(response.body)["error"]
|
|
|
|
|
assert "Method baz does not exist" == error["message"]
|
|
|
|
|
|
|
|
|
|
@mock.patch.object(handlers, "iris")
|
|
|
|
|
def test_get_method_called(self, iris_mock):
|
|
|
|
|
iris_mock.foo = mock.Mock()
|
|
|
|
|
|
|
|
|
|
response = self.fetch("/foo", method="GET")
|
2020-02-06 10:12:28 +13:00
|
|
|
|
2020-01-17 00:59:52 +00:00
|
|
|
iris_mock.foo.assert_called_once()
|
|
|
|
|
assert 200 == response.code
|
|
|
|
|
|
|
|
|
|
@mock.patch.object(handlers, "iris")
|
|
|
|
|
def test_get_method_any_exception_handled(self, iris_mock):
|
|
|
|
|
iris_mock.foo = mock.Mock(side_effect=Exception("bar"))
|
|
|
|
|
|
|
|
|
|
response = self.fetch("/foo", method="GET")
|
2020-02-06 10:12:28 +13:00
|
|
|
|
2020-01-17 00:59:52 +00:00
|
|
|
iris_mock.foo.assert_called_once()
|
|
|
|
|
assert 200 == response.code
|
|
|
|
|
assert "bar" in self._caplog.text
|
|
|
|
|
|
|
|
|
|
@mock.patch.object(handlers.iris, "do_fetch")
|
|
|
|
|
def test_get_method_with_fetch(self, fetch_mock):
|
2020-02-06 10:12:28 +13:00
|
|
|
iris.config = {"spotify": {"client_id": 123, "client_secret": 456}}
|
2020-01-17 00:59:52 +00:00
|
|
|
result = mock.Mock(spec=HTTPResponse, body='{"expires_in":88}')
|
|
|
|
|
fetch_mock.return_value = async_return_helper(result)
|
|
|
|
|
|
|
|
|
|
response = self.fetch("/refresh_spotify_token", method="GET")
|
|
|
|
|
|
|
|
|
|
assert 200 == response.code
|
|
|
|
|
assert len(response.body) > 0
|
|
|
|
|
result = json_decode(response.body)
|
|
|
|
|
assert "refresh_spotify_token" == result["method"]
|
|
|
|
|
assert 88 == result["result"]["spotify_token"]["expires_in"]
|