diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2023-02-19 15:05:52 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2023-02-19 16:15:47 +0000 |
commit | b686174b07bd56af4e5ffaa23c24f27f417fc305 (patch) | |
tree | 1ce335620d99341d94e88c159c0b9b0f6f0de5a0 /deluge/tests/test_json_api.py | |
parent | Adding debian version 2.0.3-4. (diff) | |
download | deluge-b686174b07bd56af4e5ffaa23c24f27f417fc305.tar.xz deluge-b686174b07bd56af4e5ffaa23c24f27f417fc305.zip |
Merging upstream version 2.1.1 (Closes: #1026291).
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'deluge/tests/test_json_api.py')
-rw-r--r-- | deluge/tests/test_json_api.py | 179 |
1 files changed, 78 insertions, 101 deletions
diff --git a/deluge/tests/test_json_api.py b/deluge/tests/test_json_api.py index 1da64bf..41efb02 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 |