[Web][Tests] Refactor web tests
This commit is contained in:
parent
d505ebe926
commit
cfdddc4469
|
@ -1,3 +1,12 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
|
||||||
|
#
|
||||||
|
# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
|
||||||
|
# the additional special exception to link portions of this program with the OpenSSL library.
|
||||||
|
# See LICENSE for more details.
|
||||||
|
#
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
|
@ -32,6 +41,10 @@ def setup_test_logger(level="info", prefix="deluge"):
|
||||||
deluge.log.setup_logger(level, filename="%s.log" % prefix, twisted_observer=False)
|
deluge.log.setup_logger(level, filename="%s.log" % prefix, twisted_observer=False)
|
||||||
|
|
||||||
|
|
||||||
|
def get_test_data_file(filename):
|
||||||
|
return os.path.join(os.path.join(os.path.dirname(__file__), "data"), filename)
|
||||||
|
|
||||||
|
|
||||||
def todo_test(caller):
|
def todo_test(caller):
|
||||||
# If we are using the delugereporter we can set todo mark on the test
|
# If we are using the delugereporter we can set todo mark on the test
|
||||||
# Without the delugereporter the todo would print a stack trace, so in
|
# Without the delugereporter the todo would print a stack trace, so in
|
||||||
|
|
|
@ -0,0 +1,96 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
|
||||||
|
#
|
||||||
|
# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
|
||||||
|
# the additional special exception to link portions of this program with the OpenSSL library.
|
||||||
|
# See LICENSE for more details.
|
||||||
|
#
|
||||||
|
|
||||||
|
from twisted.internet import reactor
|
||||||
|
|
||||||
|
import deluge.common
|
||||||
|
import deluge.component as component
|
||||||
|
import deluge.ui.web.auth
|
||||||
|
import deluge.ui.web.server
|
||||||
|
from deluge import configmanager
|
||||||
|
from deluge.ui.web.server import DelugeWeb
|
||||||
|
|
||||||
|
from .basetest import BaseTestCase
|
||||||
|
from .daemon_base import DaemonBase
|
||||||
|
|
||||||
|
|
||||||
|
class ReactorOverride(object):
|
||||||
|
"""
|
||||||
|
Class used to to mock the reactor
|
||||||
|
|
||||||
|
During unit tests, the reactor must not be touched, so for code that
|
||||||
|
explicitly calls the reactor, we use a mock.
|
||||||
|
|
||||||
|
"""
|
||||||
|
def __getattr__(self, attr):
|
||||||
|
if attr == "run":
|
||||||
|
return self._run
|
||||||
|
if attr == "stop":
|
||||||
|
return self._stop
|
||||||
|
return getattr(reactor, attr)
|
||||||
|
|
||||||
|
def _run(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def _stop(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class WebServerTestBase(BaseTestCase, DaemonBase):
|
||||||
|
"""
|
||||||
|
Base class for tests that need a running webapi
|
||||||
|
|
||||||
|
"""
|
||||||
|
def set_up(self):
|
||||||
|
self.host_id = None
|
||||||
|
deluge.ui.web.server.reactor = ReactorOverride()
|
||||||
|
d = self.common_set_up()
|
||||||
|
d.addCallback(self.start_core)
|
||||||
|
d.addCallback(self.start_webapi)
|
||||||
|
return d
|
||||||
|
|
||||||
|
def start_webapi(self, arg):
|
||||||
|
self.webserver_listen_port = 8999
|
||||||
|
|
||||||
|
config_defaults = deluge.ui.web.server.CONFIG_DEFAULTS.copy()
|
||||||
|
config_defaults["port"] = self.webserver_listen_port
|
||||||
|
self.config = configmanager.ConfigManager("web.conf", config_defaults)
|
||||||
|
|
||||||
|
self.deluge_web = DelugeWeb(daemon=False)
|
||||||
|
|
||||||
|
host = list(self.deluge_web.web_api.host_list["hosts"][0])
|
||||||
|
host[2] = self.listen_port
|
||||||
|
self.deluge_web.web_api.host_list["hosts"][0] = tuple(host)
|
||||||
|
self.host_id = host[0]
|
||||||
|
self.deluge_web.start()
|
||||||
|
|
||||||
|
def tear_down(self):
|
||||||
|
d = component.shutdown()
|
||||||
|
d.addCallback(self.terminate_core)
|
||||||
|
return d
|
||||||
|
|
||||||
|
|
||||||
|
class WebServerMockBase(object):
|
||||||
|
"""
|
||||||
|
Class with utility functions for mocking with tests using the webserver
|
||||||
|
|
||||||
|
"""
|
||||||
|
def mock_authentication_ignore(self, auth):
|
||||||
|
|
||||||
|
def check_request(request, method=None, level=None):
|
||||||
|
pass
|
||||||
|
|
||||||
|
self.patch(auth, "check_request", check_request)
|
||||||
|
|
||||||
|
def mock_compress_body(self):
|
||||||
|
|
||||||
|
def compress(contents, request):
|
||||||
|
return contents
|
||||||
|
# Patch compress to avoid having to decompress output with zlib
|
||||||
|
self.patch(deluge.ui.web.json_api, "compress", compress)
|
|
@ -25,6 +25,7 @@ from deluge.ui.web.json_api import JSON, JSONException
|
||||||
|
|
||||||
from . import common
|
from . import common
|
||||||
from .basetest import BaseTestCase
|
from .basetest import BaseTestCase
|
||||||
|
from .common_web import WebServerMockBase
|
||||||
from .daemon_base import DaemonBase
|
from .daemon_base import DaemonBase
|
||||||
|
|
||||||
common.disable_new_release_check()
|
common.disable_new_release_check()
|
||||||
|
@ -186,7 +187,7 @@ class RPCRaiseDelugeErrorJSONTestCase(JSONBase):
|
||||||
yield result
|
yield result
|
||||||
|
|
||||||
|
|
||||||
class JSONRequestFailedTestCase(JSONBase):
|
class JSONRequestFailedTestCase(JSONBase, WebServerMockBase):
|
||||||
|
|
||||||
def set_up(self):
|
def set_up(self):
|
||||||
d = self.common_set_up()
|
d = self.common_set_up()
|
||||||
|
@ -225,25 +226,16 @@ class JSONRequestFailedTestCase(JSONBase):
|
||||||
def test_render_on_rpc_request_failed(self):
|
def test_render_on_rpc_request_failed(self):
|
||||||
json = JSON()
|
json = JSON()
|
||||||
|
|
||||||
def get_session_id(s_id):
|
|
||||||
return s_id
|
|
||||||
self.patch(deluge.ui.web.auth, "get_session_id", get_session_id)
|
|
||||||
auth_conf = {"session_timeout": 10, "sessions": []}
|
|
||||||
auth = Auth(auth_conf)
|
|
||||||
request = Request(MagicMock(), False)
|
|
||||||
request.base = ""
|
|
||||||
auth._create_session(request)
|
|
||||||
methods = yield json.get_remote_methods()
|
methods = yield json.get_remote_methods()
|
||||||
# Verify the function has been registered
|
# Verify the function has been registered
|
||||||
self.assertTrue("testclass.test" in methods)
|
self.assertTrue("testclass.test" in methods)
|
||||||
|
|
||||||
request = MagicMock()
|
request = MagicMock()
|
||||||
request.getCookie = MagicMock(return_value=auth.config["sessions"].keys()[0])
|
|
||||||
|
|
||||||
def compress(contents, request):
|
# Circumvent authentication
|
||||||
return contents
|
auth = Auth({})
|
||||||
# Patch compress to avoid having to decompress output
|
self.mock_authentication_ignore(auth)
|
||||||
self.patch(deluge.ui.web.json_api, "compress", compress)
|
self.mock_compress_body()
|
||||||
|
|
||||||
def write(response_str):
|
def write(response_str):
|
||||||
request.write_was_called = True
|
request.write_was_called = True
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
|
||||||
|
#
|
||||||
|
# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
|
||||||
|
# the additional special exception to link portions of this program with the OpenSSL library.
|
||||||
|
# See LICENSE for more details.
|
||||||
|
#
|
||||||
from twisted.trial import unittest
|
from twisted.trial import unittest
|
||||||
|
|
||||||
from deluge.ui.common import TorrentInfo
|
from deluge.ui.common import TorrentInfo
|
||||||
|
@ -8,6 +14,7 @@ from . import common
|
||||||
|
|
||||||
|
|
||||||
class UICommonTestCase(unittest.TestCase):
|
class UICommonTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self): # NOQA
|
def setUp(self): # NOQA
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -15,50 +15,16 @@ from twisted.web.client import Agent, FileBodyProducer
|
||||||
from twisted.web.http_headers import Headers
|
from twisted.web.http_headers import Headers
|
||||||
from twisted.web.static import File
|
from twisted.web.static import File
|
||||||
|
|
||||||
import deluge.common
|
|
||||||
import deluge.component as component
|
import deluge.component as component
|
||||||
import deluge.ui.web.auth
|
|
||||||
import deluge.ui.web.server
|
|
||||||
from deluge import configmanager
|
|
||||||
from deluge.ui.client import client
|
from deluge.ui.client import client
|
||||||
from deluge.ui.web.server import DelugeWeb
|
|
||||||
|
|
||||||
from . import common
|
from . import common
|
||||||
from .basetest import BaseTestCase
|
from .common_web import WebServerTestBase
|
||||||
from .daemon_base import DaemonBase
|
|
||||||
|
|
||||||
common.disable_new_release_check()
|
common.disable_new_release_check()
|
||||||
|
|
||||||
|
|
||||||
class WebAPITestCase(BaseTestCase, DaemonBase):
|
class WebAPITestCase(WebServerTestBase):
|
||||||
|
|
||||||
def set_up(self):
|
|
||||||
self.host_id = None
|
|
||||||
deluge.ui.web.server.reactor = common.ReactorOverride()
|
|
||||||
d = self.common_set_up()
|
|
||||||
d.addCallback(self.start_core)
|
|
||||||
d.addCallback(self.start_webapi)
|
|
||||||
return d
|
|
||||||
|
|
||||||
def start_webapi(self, arg):
|
|
||||||
self.webserver_listen_port = 8999
|
|
||||||
|
|
||||||
config_defaults = deluge.ui.web.server.CONFIG_DEFAULTS.copy()
|
|
||||||
config_defaults["port"] = self.webserver_listen_port
|
|
||||||
self.config = configmanager.ConfigManager("web.conf", config_defaults)
|
|
||||||
|
|
||||||
self.deluge_web = DelugeWeb(daemon=False)
|
|
||||||
|
|
||||||
host = list(self.deluge_web.web_api.host_list["hosts"][0])
|
|
||||||
host[2] = self.listen_port
|
|
||||||
self.deluge_web.web_api.host_list["hosts"][0] = tuple(host)
|
|
||||||
self.host_id = host[0]
|
|
||||||
self.deluge_web.start()
|
|
||||||
|
|
||||||
def tear_down(self):
|
|
||||||
d = component.shutdown()
|
|
||||||
d.addCallback(self.terminate_core)
|
|
||||||
return d
|
|
||||||
|
|
||||||
def test_connect_invalid_host(self):
|
def test_connect_invalid_host(self):
|
||||||
d = self.deluge_web.web_api.connect("id")
|
d = self.deluge_web.web_api.connect("id")
|
||||||
|
|
Loading…
Reference in New Issue