summaryrefslogtreecommitdiffstats
path: root/deluge/tests/test_ui_entry.py
diff options
context:
space:
mode:
Diffstat (limited to 'deluge/tests/test_ui_entry.py')
-rw-r--r--deluge/tests/test_ui_entry.py324
1 files changed, 120 insertions, 204 deletions
diff --git a/deluge/tests/test_ui_entry.py b/deluge/tests/test_ui_entry.py
index f85bc7d7d..0546ad7b8 100644
--- a/deluge/tests/test_ui_entry.py
+++ b/deluge/tests/test_ui_entry.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
#
# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
#
@@ -7,14 +6,13 @@
# See LICENSE for more details.
#
-from __future__ import print_function, unicode_literals
-
import argparse
import sys
from io import StringIO
+from unittest import mock
-import mock
import pytest
+import pytest_twisted
from twisted.internet import defer
import deluge
@@ -23,12 +21,12 @@ import deluge.ui.console
import deluge.ui.console.cmdline.commands.quit
import deluge.ui.console.main
import deluge.ui.web.server
-from deluge.common import PY2, get_localhost_auth, windows_check
+from deluge.common import get_localhost_auth, windows_check
+from deluge.conftest import BaseTestCase
from deluge.ui import ui_entry
from deluge.ui.web.server import DelugeWeb
from . import common
-from .basetest import BaseTestCase
from .daemon_base import DaemonBase
DEBUG_COMMAND = False
@@ -41,7 +39,7 @@ sys_stdout = sys.stdout
# To print to terminal from the tests, use: print('Message...', file=sys_stdout)
-class StringFileDescriptor(object):
+class StringFileDescriptor:
"""File descriptor that writes to string buffer"""
def __init__(self, fd):
@@ -51,22 +49,15 @@ class StringFileDescriptor(object):
setattr(self, a, getattr(sys_stdout, a))
def write(self, *data, **kwargs):
- # io.StringIO requires unicode strings.
data_string = str(*data)
- if PY2:
- data_string = data_string.decode()
print(data_string, file=self.out, end='')
def flush(self):
self.out.flush()
-class UIBaseTestCase(object):
- def __init__(self):
- self.var = {}
-
+class UIBaseTestCase:
def set_up(self):
- common.set_tmp_config_dir()
common.setup_test_logger(level='info', prefix=self.id())
return component.start()
@@ -82,28 +73,14 @@ class UIBaseTestCase(object):
class UIWithDaemonBaseTestCase(UIBaseTestCase, DaemonBase):
"""Subclass for test that require a deluged daemon"""
- def __init__(self):
- UIBaseTestCase.__init__(self)
-
def set_up(self):
d = self.common_set_up()
common.setup_test_logger(level='info', prefix=self.id())
- d.addCallback(self.start_core)
- return d
-
- def tear_down(self):
- d = UIBaseTestCase.tear_down(self)
- d.addCallback(self.terminate_core)
return d
-class DelugeEntryTestCase(BaseTestCase):
-
- if windows_check():
- skip = 'Console ui test on Windows broken due to sys args issue'
-
+class TestDelugeEntry(BaseTestCase):
def set_up(self):
- common.set_tmp_config_dir()
return component.start()
def tear_down(self):
@@ -119,10 +96,11 @@ class DelugeEntryTestCase(BaseTestCase):
self.patch(argparse._sys, 'stdout', fd)
with mock.patch('deluge.ui.console.main.ConsoleUI'):
- self.assertRaises(SystemExit, ui_entry.start_ui)
- self.assertTrue('usage: deluge' in fd.out.getvalue())
- self.assertTrue('UI Options:' in fd.out.getvalue())
- self.assertTrue('* console' in fd.out.getvalue())
+ with pytest.raises(SystemExit):
+ ui_entry.start_ui()
+ assert 'usage: deluge' in fd.out.getvalue()
+ assert 'UI Options:' in fd.out.getvalue()
+ assert '* console' in fd.out.getvalue()
def test_start_default(self):
self.patch(sys, 'argv', ['./deluge'])
@@ -157,7 +135,7 @@ class DelugeEntryTestCase(BaseTestCase):
# Just test that no exception is raised
ui_entry.start_ui()
- self.assertEqual(_level[0], 'info')
+ assert _level[0] == 'info'
class GtkUIBaseTestCase(UIBaseTestCase):
@@ -173,38 +151,27 @@ class GtkUIBaseTestCase(UIBaseTestCase):
@pytest.mark.gtkui
-class GtkUIDelugeScriptEntryTestCase(BaseTestCase, GtkUIBaseTestCase):
- def __init__(self, testname):
- super(GtkUIDelugeScriptEntryTestCase, self).__init__(testname)
- GtkUIBaseTestCase.__init__(self)
-
- self.var['cmd_name'] = 'deluge gtk'
- self.var['start_cmd'] = ui_entry.start_ui
- self.var['sys_arg_cmd'] = ['./deluge', 'gtk']
-
- def set_up(self):
- return GtkUIBaseTestCase.set_up(self)
-
- def tear_down(self):
- return GtkUIBaseTestCase.tear_down(self)
+class TestGtkUIDelugeScriptEntry(BaseTestCase, GtkUIBaseTestCase):
+ @pytest.fixture(autouse=True)
+ def set_var(self, request):
+ request.cls.var = {
+ 'cmd_name': 'deluge gtk',
+ 'start_cmd': ui_entry.start_ui,
+ 'sys_arg_cmd': ['./deluge', 'gtk'],
+ }
@pytest.mark.gtkui
-class GtkUIScriptEntryTestCase(BaseTestCase, GtkUIBaseTestCase):
- def __init__(self, testname):
- super(GtkUIScriptEntryTestCase, self).__init__(testname)
- GtkUIBaseTestCase.__init__(self)
+class TestGtkUIScriptEntry(BaseTestCase, GtkUIBaseTestCase):
+ @pytest.fixture(autouse=True)
+ def set_var(self, request):
from deluge.ui import gtk3
- self.var['cmd_name'] = 'deluge-gtk'
- self.var['start_cmd'] = gtk3.start
- self.var['sys_arg_cmd'] = ['./deluge-gtk']
-
- def set_up(self):
- return GtkUIBaseTestCase.set_up(self)
-
- def tear_down(self):
- return GtkUIBaseTestCase.tear_down(self)
+ request.cls.var = {
+ 'cmd_name': 'deluge-gtk',
+ 'start_cmd': gtk3.start,
+ 'sys_arg_cmd': ['./deluge-gtk'],
+ }
class DelugeWebMock(DelugeWeb):
@@ -242,45 +209,31 @@ class WebUIBaseTestCase(UIBaseTestCase):
self.patch(deluge.ui.web.server, 'DelugeWeb', DelugeWebMock)
self.exec_command()
- self.assertEqual(_level[0], 'info')
-
-
-class WebUIScriptEntryTestCase(BaseTestCase, WebUIBaseTestCase):
-
- if windows_check():
- skip = 'Console ui test on Windows broken due to sys args issue'
-
- def __init__(self, testname):
- super(WebUIScriptEntryTestCase, self).__init__(testname)
- WebUIBaseTestCase.__init__(self)
- self.var['cmd_name'] = 'deluge-web'
- self.var['start_cmd'] = deluge.ui.web.start
- self.var['sys_arg_cmd'] = ['./deluge-web', '--do-not-daemonize']
-
- def set_up(self):
- return WebUIBaseTestCase.set_up(self)
-
- def tear_down(self):
- return WebUIBaseTestCase.tear_down(self)
-
+ assert _level[0] == 'info'
-class WebUIDelugeScriptEntryTestCase(BaseTestCase, WebUIBaseTestCase):
- if windows_check():
- skip = 'Console ui test on Windows broken due to sys args issue'
+class TestWebUIScriptEntry(BaseTestCase, WebUIBaseTestCase):
+ @pytest.fixture(autouse=True)
+ def set_var(self, request):
+ request.cls.var = {
+ 'cmd_name': 'deluge-web',
+ 'start_cmd': deluge.ui.web.start,
+ 'sys_arg_cmd': ['./deluge-web'],
+ }
+ if not windows_check():
+ request.cls.var['sys_arg_cmd'].append('--do-not-daemonize')
- def __init__(self, testname):
- super(WebUIDelugeScriptEntryTestCase, self).__init__(testname)
- WebUIBaseTestCase.__init__(self)
- self.var['cmd_name'] = 'deluge web'
- self.var['start_cmd'] = ui_entry.start_ui
- self.var['sys_arg_cmd'] = ['./deluge', 'web', '--do-not-daemonize']
-
- def set_up(self):
- return WebUIBaseTestCase.set_up(self)
- def tear_down(self):
- return WebUIBaseTestCase.tear_down(self)
+class TestWebUIDelugeScriptEntry(BaseTestCase, WebUIBaseTestCase):
+ @pytest.fixture(autouse=True)
+ def set_var(self, request):
+ request.cls.var = {
+ 'cmd_name': 'deluge web',
+ 'start_cmd': ui_entry.start_ui,
+ 'sys_arg_cmd': ['./deluge', 'web'],
+ }
+ if not windows_check():
+ request.cls.var['sys_arg_cmd'].append('--do-not-daemonize')
class ConsoleUIBaseTestCase(UIBaseTestCase):
@@ -291,7 +244,7 @@ class ConsoleUIBaseTestCase(UIBaseTestCase):
with mock.patch('deluge.ui.console.main.ConsoleUI'):
self.exec_command()
- def test_start_console_with_log_level(self):
+ def test_start_console_with_log_level(self, request):
_level = []
def setup_logger(
@@ -314,7 +267,7 @@ class ConsoleUIBaseTestCase(UIBaseTestCase):
# Just test that no exception is raised
self.exec_command()
- self.assertEqual(_level[0], 'info')
+ assert _level[0] == 'info'
def test_console_help(self):
self.patch(sys, 'argv', self.var['sys_arg_cmd'] + ['-h'])
@@ -322,18 +275,19 @@ class ConsoleUIBaseTestCase(UIBaseTestCase):
self.patch(argparse._sys, 'stdout', fd)
with mock.patch('deluge.ui.console.main.ConsoleUI'):
- self.assertRaises(SystemExit, self.exec_command)
+ with pytest.raises(SystemExit):
+ self.exec_command()
std_output = fd.out.getvalue()
- self.assertTrue(
- ('usage: %s' % self.var['cmd_name']) in std_output
- ) # Check command name
- self.assertTrue('Common Options:' in std_output)
- self.assertTrue('Console Options:' in std_output)
- self.assertIn(
- 'Console Commands:\n The following console commands are available:',
- std_output,
+ assert (
+ 'usage: %s' % self.var['cmd_name']
+ ) in std_output # Check command name
+ assert 'Common Options:' in std_output
+ assert 'Console Options:' in std_output
+ assert (
+ 'Console Commands:\n The following console commands are available:'
+ in std_output
)
- self.assertIn('The following console commands are available:', std_output)
+ assert 'The following console commands are available:' in std_output
def test_console_command_info(self):
self.patch(sys, 'argv', self.var['sys_arg_cmd'] + ['info'])
@@ -349,10 +303,11 @@ class ConsoleUIBaseTestCase(UIBaseTestCase):
self.patch(argparse._sys, 'stdout', fd)
with mock.patch('deluge.ui.console.main.ConsoleUI'):
- self.assertRaises(SystemExit, self.exec_command)
+ with pytest.raises(SystemExit):
+ self.exec_command()
std_output = fd.out.getvalue()
- self.assertIn('usage: info', std_output)
- self.assertIn('Show information about the torrents', std_output)
+ assert 'usage: info' in std_output
+ assert 'Show information about the torrents' in std_output
def test_console_unrecognized_arguments(self):
self.patch(
@@ -361,8 +316,9 @@ class ConsoleUIBaseTestCase(UIBaseTestCase):
fd = StringFileDescriptor(sys.stdout)
self.patch(argparse._sys, 'stderr', fd)
with mock.patch('deluge.ui.console.main.ConsoleUI'):
- self.assertRaises(SystemExit, self.exec_command)
- self.assertIn('unrecognized arguments: --ui', fd.out.getvalue())
+ with pytest.raises(SystemExit):
+ self.exec_command()
+ assert 'unrecognized arguments: --ui' in fd.out.getvalue()
class ConsoleUIWithDaemonBaseTestCase(UIWithDaemonBaseTestCase):
@@ -390,26 +346,28 @@ class ConsoleUIWithDaemonBaseTestCase(UIWithDaemonBaseTestCase):
+ command,
)
- @defer.inlineCallbacks
+ @pytest_twisted.inlineCallbacks
def test_console_command_add(self):
filename = common.get_test_data_file('test.torrent')
- self.patch_arg_command(['add ' + filename])
+ self.patch_arg_command([f'add "{filename}"'])
fd = StringFileDescriptor(sys.stdout)
self.patch(sys, 'stdout', fd)
yield self.exec_command()
std_output = fd.out.getvalue()
- self.assertEqual(
- std_output, 'Attempting to add torrent: ' + filename + '\nTorrent added!\n'
+ assert (
+ std_output
+ == 'Attempting to add torrent: ' + filename + '\nTorrent added!\n'
)
- @defer.inlineCallbacks
+ @pytest_twisted.inlineCallbacks
def test_console_command_add_move_completed(self):
filename = common.get_test_data_file('test.torrent')
+ tmp_path = 'c:\\tmp' if windows_check() else '/tmp'
self.patch_arg_command(
[
- 'add --move-path /tmp ' + filename + ' ; status'
+ f'add --move-path "{tmp_path}" "{filename}" ; status'
' ; manage'
' ab570cdd5a17ea1b61e970bb72047de141bce173'
' move_completed'
@@ -422,22 +380,23 @@ class ConsoleUIWithDaemonBaseTestCase(UIWithDaemonBaseTestCase):
yield self.exec_command()
std_output = fd.out.getvalue()
- self.assertTrue(
- std_output.endswith('move_completed: True\nmove_completed_path: /tmp\n')
- or std_output.endswith('move_completed_path: /tmp\nmove_completed: True\n')
+ assert std_output.endswith(
+ f'move_completed: True\nmove_completed_path: {tmp_path}\n'
+ ) or std_output.endswith(
+ f'move_completed_path: {tmp_path}\nmove_completed: True\n'
)
- @defer.inlineCallbacks
- def test_console_command_status(self):
+ @pytest_twisted.ensureDeferred
+ async def test_console_command_status(self):
fd = StringFileDescriptor(sys.stdout)
self.patch_arg_command(['status'])
self.patch(sys, 'stdout', fd)
- yield self.exec_command()
+ await self.exec_command()
std_output = fd.out.getvalue()
- self.assertTrue(std_output.startswith('Total upload: '))
- self.assertTrue(std_output.endswith(' Moving: 0\n'))
+ assert std_output.startswith('Total upload: ')
+ assert std_output.endswith(' Moving: 0\n')
@defer.inlineCallbacks
def test_console_command_config_set_download_location(self):
@@ -447,79 +406,36 @@ class ConsoleUIWithDaemonBaseTestCase(UIWithDaemonBaseTestCase):
yield self.exec_command()
std_output = fd.out.getvalue()
- self.assertTrue(
- std_output.startswith(
- 'Setting "download_location" to: {}\'/downloads\''.format(
- 'u' if PY2 else ''
- )
- )
- )
- self.assertTrue(
- std_output.endswith('Configuration value successfully updated.\n')
- )
-
-
-class ConsoleScriptEntryWithDaemonTestCase(
- BaseTestCase, ConsoleUIWithDaemonBaseTestCase
-):
-
- if windows_check():
- skip = 'Console ui test on Windows broken due to sys args issue'
-
- def __init__(self, testname):
- super(ConsoleScriptEntryWithDaemonTestCase, self).__init__(testname)
- ConsoleUIWithDaemonBaseTestCase.__init__(self)
- self.var['cmd_name'] = 'deluge-console'
- self.var['sys_arg_cmd'] = ['./deluge-console']
-
- def set_up(self):
- from deluge.ui.console.console import Console
-
- def start_console():
- return Console().start()
-
- self.patch(deluge.ui.console, 'start', start_console)
- self.var['start_cmd'] = deluge.ui.console.start
-
- return ConsoleUIWithDaemonBaseTestCase.set_up(self)
-
- def tear_down(self):
- return ConsoleUIWithDaemonBaseTestCase.tear_down(self)
-
-
-class ConsoleScriptEntryTestCase(BaseTestCase, ConsoleUIBaseTestCase):
-
- if windows_check():
- skip = 'Console ui test on Windows broken due to sys args issue'
-
- def __init__(self, testname):
- super(ConsoleScriptEntryTestCase, self).__init__(testname)
- ConsoleUIBaseTestCase.__init__(self)
- self.var['cmd_name'] = 'deluge-console'
- self.var['start_cmd'] = deluge.ui.console.start
- self.var['sys_arg_cmd'] = ['./deluge-console']
-
- def set_up(self):
- return ConsoleUIBaseTestCase.set_up(self)
-
- def tear_down(self):
- return ConsoleUIBaseTestCase.tear_down(self)
-
-
-class ConsoleDelugeScriptEntryTestCase(BaseTestCase, ConsoleUIBaseTestCase):
-
- if windows_check():
- skip = 'cannot test console ui on windows'
-
- def __init__(self, testname):
- super(ConsoleDelugeScriptEntryTestCase, self).__init__(testname)
- ConsoleUIBaseTestCase.__init__(self)
- self.var['cmd_name'] = 'deluge console'
- self.var['start_cmd'] = ui_entry.start_ui
- self.var['sys_arg_cmd'] = ['./deluge', 'console']
-
- def set_up(self):
- return ConsoleUIBaseTestCase.set_up(self)
-
- def tear_down(self):
- return ConsoleUIBaseTestCase.tear_down(self)
+ assert std_output.startswith('Setting "download_location" to: \'/downloads\'')
+ assert std_output.endswith('Configuration value successfully updated.\n')
+
+
+@pytest.mark.usefixtures('daemon', 'client')
+class TestConsoleScriptEntryWithDaemon(BaseTestCase, ConsoleUIWithDaemonBaseTestCase):
+ @pytest.fixture(autouse=True)
+ def set_var(self, request):
+ request.cls.var = {
+ 'cmd_name': 'deluge-console',
+ 'start_cmd': deluge.ui.console.start,
+ 'sys_arg_cmd': ['./deluge-console'],
+ }
+
+
+class TestConsoleScriptEntry(BaseTestCase, ConsoleUIBaseTestCase):
+ @pytest.fixture(autouse=True)
+ def set_var(self, request):
+ request.cls.var = {
+ 'cmd_name': 'deluge-console',
+ 'start_cmd': deluge.ui.console.start,
+ 'sys_arg_cmd': ['./deluge-console'],
+ }
+
+
+class TestConsoleDelugeScriptEntry(BaseTestCase, ConsoleUIBaseTestCase):
+ @pytest.fixture(autouse=True)
+ def set_var(self, request):
+ request.cls.var = {
+ 'cmd_name': 'deluge console',
+ 'start_cmd': ui_entry.start_ui,
+ 'sys_arg_cmd': ['./deluge', 'console'],
+ }