summaryrefslogtreecommitdiffstats
path: root/deluge/tests/test_json_api.py
diff options
context:
space:
mode:
Diffstat (limited to 'deluge/tests/test_json_api.py')
-rw-r--r--deluge/tests/test_json_api.py179
1 files changed, 78 insertions, 101 deletions
diff --git a/deluge/tests/test_json_api.py b/deluge/tests/test_json_api.py
index 1da64bf97..41efb0206 100644
--- a/deluge/tests/test_json_api.py
+++ b/deluge/tests/test_json_api.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
#
# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
#
@@ -7,64 +6,35 @@
# See LICENSE for more details.
#
-from __future__ import unicode_literals
-
import json as json_lib
+from unittest.mock import MagicMock
-from mock import MagicMock
-from twisted.internet import defer
+import pytest
+import pytest_twisted
from twisted.web import server
from twisted.web.http import Request
import deluge.common
-import deluge.component as component
import deluge.ui.web.auth
import deluge.ui.web.json_api
from deluge.error import DelugeError
-from deluge.ui.client import client
from deluge.ui.web.auth import Auth
from deluge.ui.web.json_api import JSON, JSONException
from . import common
-from .basetest import BaseTestCase
from .common_web import WebServerMockBase
-from .daemon_base import DaemonBase
common.disable_new_release_check()
-class JSONBase(BaseTestCase, DaemonBase):
- def connect_client(self, *args, **kwargs):
- return client.connect(
- 'localhost',
- self.listen_port,
- username=kwargs.get('user', ''),
- password=kwargs.get('password', ''),
- )
-
- def disconnect_client(self, *args):
- return client.disconnect()
-
- def tear_down(self):
- d = component.shutdown()
- d.addCallback(self.disconnect_client)
- d.addCallback(self.terminate_core)
- return d
-
-
-class JSONTestCase(JSONBase):
- def set_up(self):
- d = self.common_set_up()
- d.addCallback(self.start_core)
- d.addCallbacks(self.connect_client, self.terminate_core)
- return d
-
- @defer.inlineCallbacks
- def test_get_remote_methods(self):
+@pytest.mark.usefixtures('daemon', 'client', 'component')
+class TestJSON:
+ @pytest_twisted.ensureDeferred
+ async def test_get_remote_methods(self):
json = JSON()
- methods = yield json.get_remote_methods()
- self.assertEqual(type(methods), tuple)
- self.assertTrue(len(methods) > 0)
+ methods = await json.get_remote_methods()
+ assert type(methods) == tuple
+ assert len(methods) > 0
def test_render_fail_disconnected(self):
json = JSON()
@@ -72,7 +42,7 @@ class JSONTestCase(JSONBase):
request.method = b'POST'
request._disconnected = True
# When disconnected, returns empty string
- self.assertEqual(json.render(request), '')
+ assert json.render(request) == ''
def test_render_fail(self):
json = JSON()
@@ -82,19 +52,17 @@ class JSONTestCase(JSONBase):
def write(response_str):
request.write_was_called = True
response = json_lib.loads(response_str.decode())
- self.assertEqual(response['result'], None)
- self.assertEqual(response['id'], None)
- self.assertEqual(
- response['error']['message'], 'JSONException: JSON not decodable'
- )
- self.assertEqual(response['error']['code'], 5)
+ assert response['result'] is None
+ assert response['id'] is None
+ assert response['error']['message'] == 'JSONException: JSON not decodable'
+ assert response['error']['code'] == 5
request.write = write
request.write_was_called = False
request._disconnected = False
request.getHeader.return_value = b'application/json'
- self.assertEqual(json.render(request), server.NOT_DONE_YET)
- self.assertTrue(request.write_was_called)
+ assert json.render(request) == server.NOT_DONE_YET
+ assert request.write_was_called
def test_handle_request_invalid_method(self):
json = JSON()
@@ -102,20 +70,23 @@ class JSONTestCase(JSONBase):
json_data = {'method': 'no-existing-module.test', 'id': 0, 'params': []}
request.json = json_lib.dumps(json_data).encode()
request_id, result, error = json._handle_request(request)
- self.assertEqual(error, {'message': 'Unknown method', 'code': 2})
+ assert error == {'message': 'Unknown method', 'code': 2}
def test_handle_request_invalid_json_request(self):
json = JSON()
request = MagicMock()
json_data = {'id': 0, 'params': []}
request.json = json_lib.dumps(json_data).encode()
- self.assertRaises(JSONException, json._handle_request, request)
+ with pytest.raises(JSONException):
+ json._handle_request(request)
json_data = {'method': 'some.method', 'params': []}
request.json = json_lib.dumps(json_data).encode()
- self.assertRaises(JSONException, json._handle_request, request)
+ with pytest.raises(JSONException):
+ json._handle_request(request)
json_data = {'method': 'some.method', 'id': 0}
request.json = json_lib.dumps(json_data).encode()
- self.assertRaises(JSONException, json._handle_request, request)
+ with pytest.raises(JSONException):
+ json._handle_request(request)
def test_on_json_request_invalid_content_type(self):
"""Test for exception with content type not application/json"""
@@ -124,18 +95,32 @@ class JSONTestCase(JSONBase):
request.getHeader.return_value = b'text/plain'
json_data = {'method': 'some.method', 'id': 0, 'params': []}
request.json = json_lib.dumps(json_data).encode()
- self.assertRaises(JSONException, json._on_json_request, request)
+ with pytest.raises(JSONException):
+ json._on_json_request(request)
+ def test_on_json_request_valid_content_type(self):
+ """Ensure content-type application/json is accepted"""
+ json = JSON()
+ request = MagicMock()
+ request.getHeader.return_value = b'application/json'
+ json_data = {'method': 'some.method', 'id': 0, 'params': []}
+ request.json = json_lib.dumps(json_data).encode()
+ json._on_json_request(request)
-class JSONCustomUserTestCase(JSONBase):
- def set_up(self):
- d = self.common_set_up()
- d.addCallback(self.start_core)
- return d
+ def test_on_json_request_valid_content_type_with_charset(self):
+ """Ensure content-type parameters such as charset are ignored"""
+ json = JSON()
+ request = MagicMock()
+ request.getHeader.return_value = b'application/json;charset=utf-8'
+ json_data = {'method': 'some.method', 'id': 0, 'params': []}
+ request.json = json_lib.dumps(json_data).encode()
+ json._on_json_request(request)
- @defer.inlineCallbacks
+
+@pytest.mark.usefixtures('daemon', 'client', 'component')
+class TestJSONCustomUserTestCase:
+ @pytest_twisted.inlineCallbacks
def test_handle_request_auth_error(self):
- yield self.connect_client()
json = JSON()
auth_conf = {'session_timeout': 10, 'sessions': {}}
Auth(auth_conf) # Must create the component
@@ -148,13 +133,12 @@ class JSONCustomUserTestCase(JSONBase):
json_data = {'method': 'core.get_libtorrent_version', 'id': 0, 'params': []}
request.json = json_lib.dumps(json_data).encode()
request_id, result, error = json._handle_request(request)
- self.assertEqual(error, {'message': 'Not authenticated', 'code': 1})
+ assert error == {'message': 'Not authenticated', 'code': 1}
-class RPCRaiseDelugeErrorJSONTestCase(JSONBase):
- def set_up(self):
- d = self.common_set_up()
- custom_script = """
+@pytest.mark.usefixtures('daemon', 'client', 'component')
+class TestRPCRaiseDelugeErrorJSON:
+ daemon_custom_script = """
from deluge.error import DelugeError
from deluge.core.rpcserver import export
class TestClass(object):
@@ -165,12 +149,9 @@ class RPCRaiseDelugeErrorJSONTestCase(JSONBase):
test = TestClass()
daemon.rpcserver.register_object(test)
"""
- d.addCallback(self.start_core, custom_script=custom_script)
- d.addCallbacks(self.connect_client, self.terminate_core)
- return d
- @defer.inlineCallbacks
- def test_handle_request_method_raise_delugeerror(self):
+ @pytest_twisted.ensureDeferred
+ async def test_handle_request_method_raise_delugeerror(self):
json = JSON()
def get_session_id(s_id):
@@ -182,9 +163,9 @@ class RPCRaiseDelugeErrorJSONTestCase(JSONBase):
request = Request(MagicMock(), False)
request.base = b''
auth._create_session(request)
- methods = yield json.get_remote_methods()
+ methods = await json.get_remote_methods()
# Verify the function has been registered
- self.assertTrue('testclass.test' in methods)
+ assert 'testclass.test' in methods
request = MagicMock()
session_id = list(auth.config['sessions'])[0]
@@ -192,18 +173,13 @@ class RPCRaiseDelugeErrorJSONTestCase(JSONBase):
json_data = {'method': 'testclass.test', 'id': 0, 'params': []}
request.json = json_lib.dumps(json_data).encode()
request_id, result, error = json._handle_request(request)
- result.addCallback(self.fail)
-
- def on_error(error):
- self.assertEqual(error.type, DelugeError)
-
- result.addErrback(on_error)
- yield result
+ with pytest.raises(DelugeError):
+ await result
-class JSONRequestFailedTestCase(JSONBase, WebServerMockBase):
- def set_up(self):
- d = self.common_set_up()
+class TestJSONRequestFailed(WebServerMockBase):
+ @pytest_twisted.async_yield_fixture(autouse=True)
+ async def set_up(self, config_dir):
custom_script = """
from deluge.error import DelugeError
from deluge.core.rpcserver import export
@@ -234,28 +210,29 @@ class JSONRequestFailedTestCase(JSONBase, WebServerMockBase):
}
def on_test_raise(*args):
- self.assertTrue('Unhandled error in Deferred:' in self.core.stderr_out)
- self.assertTrue('in test_raise_error' in self.core.stderr_out)
+ assert 'Unhandled error in Deferred:' in self.core.stderr_out
+ assert 'in test_raise_error' in self.core.stderr_out
extra_callback['deferred'].addCallback(on_test_raise)
- d.addCallback(
- self.start_core,
+ d, daemon = common.start_core(
custom_script=custom_script,
print_stdout=False,
print_stderr=False,
timeout=5,
extra_callbacks=[extra_callback],
+ config_directory=config_dir,
)
- d.addCallbacks(self.connect_client, self.terminate_core)
- return d
+ await d
+ yield
+ await daemon.kill()
- @defer.inlineCallbacks
- def test_render_on_rpc_request_failed(self):
+ @pytest_twisted.inlineCallbacks
+ def test_render_on_rpc_request_failed(self, component, client):
json = JSON()
methods = yield json.get_remote_methods()
# Verify the function has been registered
- self.assertTrue('testclass.test' in methods)
+ assert 'testclass.test' in methods
request = MagicMock()
@@ -266,14 +243,14 @@ class JSONRequestFailedTestCase(JSONBase, WebServerMockBase):
def write(response_str):
request.write_was_called = True
response = json_lib.loads(response_str.decode())
- self.assertEqual(response['result'], None, 'BAD RESULT')
- self.assertEqual(response['id'], 0)
- self.assertEqual(
- response['error']['message'],
- 'Failure: [Failure instance: Traceback (failure with no frames):'
- " <class 'deluge.error.DelugeError'>: DelugeERROR\n]",
+ assert response['result'] is None, 'BAD RESULT'
+ assert response['id'] == 0
+ assert (
+ response['error']['message']
+ == 'Failure: [Failure instance: Traceback (failure with no frames):'
+ " <class 'deluge.error.DelugeError'>: DelugeERROR\n]"
)
- self.assertEqual(response['error']['code'], 4)
+ assert response['error']['code'] == 4
request.write = write
request.write_was_called = False
@@ -284,8 +261,8 @@ class JSONRequestFailedTestCase(JSONBase, WebServerMockBase):
d = json._on_json_request(request)
def on_success(arg):
- self.assertEqual(arg, server.NOT_DONE_YET)
+ assert arg == server.NOT_DONE_YET
return True
- d.addCallbacks(on_success, self.fail)
+ d.addCallbacks(on_success, pytest.fail)
yield d