diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 21c257c45..6e9948f65 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,7 +10,7 @@ stages: run-test: stage: test script: - - python3 setup.py test_nogui + - python3 setup.py test -s test.no_gui -q run-mypy: stage: test diff --git a/setup.cfg b/setup.cfg index 03445e3f9..bfec00edd 100644 --- a/setup.cfg +++ b/setup.cfg @@ -18,6 +18,7 @@ classifiers = [options] python_requires = >=3.5 packages = find: +test_suite = test install_requires = cssutils>=1.0.2 keyring diff --git a/setup.py b/setup.py index 9830a5062..58b67d251 100644 --- a/setup.py +++ b/setup.py @@ -176,27 +176,6 @@ class install(_install): _install.run(self) -class test(Command): - description = "Run all tests" - user_options = [] - - def initialize_options(self): - pass - - def finalize_options(self): - pass - - def run(self): - exit(subprocess.call("./test/runtests.py")) - - -class test_nogui(test): - description = "Run tests without GUI" - - def run(self): - exit(subprocess.call(["./test/runtests.py", "-n"])) - - class update_po(Command): description = "Update po files" user_options = [] @@ -229,8 +208,6 @@ setup( cmdclass={ 'build_py': build, 'install': install, - 'test': test, - 'test_nogui': test_nogui, 'update_po': update_po, }, entry_points={ diff --git a/test/integration/test_gui_event_integration.py b/test/broken/integration/test_gui_event_integration.py similarity index 100% rename from test/integration/test_gui_event_integration.py rename to test/broken/integration/test_gui_event_integration.py diff --git a/test/integration/test_roster.py b/test/broken/integration/test_roster.py similarity index 100% rename from test/integration/test_roster.py rename to test/broken/integration/test_roster.py diff --git a/test/test_pluginmanager.py b/test/broken/test_pluginmanager.py similarity index 100% rename from test/test_pluginmanager.py rename to test/broken/test_pluginmanager.py diff --git a/test/unit/test_jingle.py b/test/broken/unit/test_jingle.py similarity index 100% rename from test/unit/test_jingle.py rename to test/broken/unit/test_jingle.py diff --git a/test/unit/test_sessions.py b/test/broken/unit/test_sessions.py similarity index 100% rename from test/unit/test_sessions.py rename to test/broken/unit/test_sessions.py diff --git a/test/unit/test_socks5.py b/test/broken/unit/test_socks5.py similarity index 99% rename from test/unit/test_socks5.py rename to test/broken/unit/test_socks5.py index c7f85aa0f..67d57ca97 100644 --- a/test/unit/test_socks5.py +++ b/test/broken/unit/test_socks5.py @@ -167,8 +167,6 @@ class TestSocks5(unittest.TestCase): self._check_inout() - - if __name__ == '__main__': unittest.main() diff --git a/test/gtk/htmltextview.py b/test/gtk/htmltextview.py index 4e0a48db9..a49bc6897 100644 --- a/test/gtk/htmltextview.py +++ b/test/gtk/htmltextview.py @@ -15,7 +15,6 @@ from gajim.gtk.util import get_cursor from gajim.conversation_textview import ConversationTextview from gajim.gui_interface import Interface - caps_cache.capscache = MagicMock() app.plugin_manager = MagicMock() app.logger = MagicMock() @@ -24,6 +23,7 @@ app.interface = Interface() change_cursor = None htmlview = ConversationTextview(None) + def on_textview_motion_notify_event(widget, event): """ Change the cursor to a hand when we are over a mail or an url @@ -52,7 +52,6 @@ def handler(texttag, widget, event, iter_, kind): if event.type == Gdk.EventType.BUTTON_PRESS: pass -htmlview.tv.hyperlink_handler = htmlview.hyperlink_handler htmlview.print_real_text(None, xhtml='
' 'Hello
\n' diff --git a/test/integration/test_resolver.py b/test/integration/test_resolver.py index f33a33241..2354f70cf 100644 --- a/test/integration/test_resolver.py +++ b/test/integration/test_resolver.py @@ -1,8 +1,6 @@ import unittest -import time - -import lib +from test import lib lib.setup_env() from gi.repository import GLib @@ -14,7 +12,8 @@ JABBERCZ_TXT_NAME = '_xmppconnect.jabber.cz' JABBERCZ_SRV_NAME = '_xmpp-client._tcp.jabber.cz' TEST_LIST = [(NONSENSE_NAME, 'srv', False), - (JABBERCZ_SRV_NAME, 'srv', True)] + (JABBERCZ_SRV_NAME, 'srv', True)] + class TestResolver(unittest.TestCase): ''' @@ -45,9 +44,9 @@ class TestResolver(unittest.TestCase): def _runGR(self, name, type_): self.resolver.resolve( - host = name, - type_ = type_, - on_ready = self._myonready) + host=name, + type_=type_, + on_ready=self._myonready) self.main_loop.run() diff --git a/test/lib/__init__.py b/test/lib/__init__.py index ba1367a1b..d3816c14d 100644 --- a/test/lib/__init__.py +++ b/test/lib/__init__.py @@ -1,26 +1,15 @@ -import sys import os -import getopt -use_x = True -shortargs = 'hnv:' -longargs = 'help no-x verbose=' -opts, args = getopt.getopt(sys.argv[1:], shortargs, longargs.split()) -for o, a in opts: - if o in ('-n', '--no-x'): - use_x = False - -gajim_root = os.path.join(os.path.abspath(os.path.dirname(__file__)), '../..') - -# look for modules in the CWD, then gajim/test/lib, then gajim/gajim, -# then everywhere else -sys.path.insert(1, gajim_root) -sys.path.insert(1, gajim_root + '/test/lib') +from tempfile import gettempdir # a temporary version of ~/.gajim for testing -configdir = gajim_root + '/test/tmp' +configdir = os.path.join(gettempdir(), 'gajim') +os.makedirs(configdir, exist_ok=True) + # plugins config dir pluginsconfigdir = configdir + '/pluginsconfig' +# theme config directory +themedir = configdir + '/theme' # define _ for i18n import builtins @@ -28,7 +17,7 @@ builtins._ = lambda x: x from gajim.common.contacts import LegacyContactsAPI -def setup_env(): +def setup_env(use_x=True): # wipe config directory if os.path.isdir(configdir): import shutil @@ -36,6 +25,7 @@ def setup_env(): os.mkdir(configdir) os.mkdir(pluginsconfigdir) + os.mkdir(themedir) from gajim.common import configpaths configpaths.set_config_root(configdir) @@ -47,13 +37,10 @@ def setup_env(): import logging logging.basicConfig() - configpaths.override_path('DATA', gajim_root + '/gajim/data') app.use_x = use_x app.contacts = LegacyContactsAPI() app.connections = {} if use_x: - from gajim import gtkgui_helpers - gtkgui_helpers.GUI_DIR = gajim_root + '/gajim/data/gui' from gajim.application import GajimApplication app.app = GajimApplication() diff --git a/test/lib/gajim_mocks.py b/test/lib/gajim_mocks.py index 5f03d835b..b5ffa9562 100644 --- a/test/lib/gajim_mocks.py +++ b/test/lib/gajim_mocks.py @@ -2,7 +2,7 @@ Module with dummy classes for Gajim specific unit testing ''' -from mock import Mock +from .mock import Mock from gajim.common import app from gajim.common import ged diff --git a/test/no_gui/__init__.py b/test/no_gui/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/test/no_gui/unit/__init__.py b/test/no_gui/unit/__init__.py new file mode 100644 index 000000000..0252a7b2f --- /dev/null +++ b/test/no_gui/unit/__init__.py @@ -0,0 +1,5 @@ +''' + +This package just contains plain unit tests + +''' diff --git a/test/unit/test_account.py b/test/no_gui/unit/test_account.py similarity index 94% rename from test/unit/test_account.py rename to test/no_gui/unit/test_account.py index 60c6eca96..75d94542e 100644 --- a/test/unit/test_account.py +++ b/test/no_gui/unit/test_account.py @@ -3,11 +3,9 @@ Tests for Account classes ''' import unittest -import lib -lib.setup_env() - from gajim.common.account import Account + class Test(unittest.TestCase): def testInstantiate(self): diff --git a/test/unit/test_caps_cache.py b/test/no_gui/unit/test_caps_cache.py similarity index 99% rename from test/unit/test_caps_cache.py rename to test/no_gui/unit/test_caps_cache.py index 58b2c4da7..0fb2204ae 100644 --- a/test/unit/test_caps_cache.py +++ b/test/no_gui/unit/test_caps_cache.py @@ -3,9 +3,6 @@ Tests for capabilities and the capabilities cache ''' import unittest -import lib -lib.setup_env() - from unittest.mock import MagicMock, Mock from nbxmpp import NS_MUC, NS_PING, NS_XHTML_IM, Iq from gajim.common import caps_cache as caps diff --git a/test/unit/test_contacts.py b/test/no_gui/unit/test_contacts.py similarity index 99% rename from test/unit/test_contacts.py rename to test/no_gui/unit/test_contacts.py index 40127dabf..8ca9810cb 100644 --- a/test/unit/test_contacts.py +++ b/test/no_gui/unit/test_contacts.py @@ -2,12 +2,9 @@ Test for Contact, GC_Contact and Contacts ''' import unittest - -import lib -lib.setup_env() +from nbxmpp import NS_MUC from gajim.common.contacts import CommonContact, Contact, GC_Contact, LegacyContactsAPI -from nbxmpp import NS_MUC from gajim.common import caps_cache diff --git a/test/unit/test_protocol_caps.py b/test/no_gui/unit/test_protocol_caps.py similarity index 98% rename from test/unit/test_protocol_caps.py rename to test/no_gui/unit/test_protocol_caps.py index c1201ba00..e3e0bbece 100644 --- a/test/unit/test_protocol_caps.py +++ b/test/no_gui/unit/test_protocol_caps.py @@ -7,9 +7,6 @@ from unittest.mock import MagicMock import nbxmpp -import lib -lib.setup_env() - from gajim.common import app from gajim.common import nec from gajim.common import ged diff --git a/test/runtests.py b/test/runtests.py deleted file mode 100755 index 857ba8e63..000000000 --- a/test/runtests.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python3 - - -''' -Runs Gajim's Test Suite - -Unit tests tests will be run on each commit. -''' - -import sys -import unittest -import getopt -use_x = True -verbose = 1 - -try: - shortargs = 'hnv:' - longargs = 'help no-x verbose=' - opts, args = getopt.getopt(sys.argv[1:], shortargs, longargs.split()) -except getopt.error as msg: - print(msg) - print('for help use --help') - sys.exit(2) -for o, a in opts: - if o in ('-h', '--help'): - print('runtests [--help] [--no-x] [--verbose level]') - sys.exit() - elif o in ('-n', '--no-x'): - use_x = False - elif o in ('-v', '--verbose'): - try: - verbose = int(a) - except Exception: - print('verbose must be a number >= 0') - sys.exit(2) - -# new test modules need to be added manually -modules = ( 'unit.test_protocol_caps', - 'unit.test_caps_cache', - 'unit.test_contacts', - 'unit.test_account', - ) - -if use_x: - modules += ( 'unit.test_sessions', - #'integration.test_gui_event_integration', - 'integration.test_roster', - 'integration.test_resolver', - 'unit.test_gui_interface', - ) - -nb_errors = 0 -nb_failures = 0 - -for mod in modules: - print("Now running: %s" % mod) - suite = unittest.defaultTestLoader.loadTestsFromName(mod) - result = unittest.TextTestRunner(verbosity=verbose).run(suite) - if use_x: - # Wait 500ms to be sure all timeout_add will be called before we cleanup main loop - import time - time.sleep(0.5) - # Clean main loop - from gi.repository import GLib - mc = GLib.main_context_default() - while mc.pending(): - mc.iteration() - nb_errors += len(result.errors) - nb_failures += len(result.failures) - -sys.exit(nb_errors + nb_failures) diff --git a/test/unit/test_gui_interface.py b/test/unit/test_gui_interface.py index 2055f7653..babb5ad42 100644 --- a/test/unit/test_gui_interface.py +++ b/test/unit/test_gui_interface.py @@ -3,7 +3,7 @@ Some diverse tests covering functionality in the GUI Interface class. ''' import unittest -import lib +from test import lib lib.setup_env() from gajim.common import logging_helpers