diff --git a/trytond/CHANGELOG b/trytond/CHANGELOG index b8c69b7faf..7623ac030a 100644 --- a/trytond/CHANGELOG +++ b/trytond/CHANGELOG @@ -1,3 +1,4 @@ +* Add route test case * Add on_scan_code method on Model * Support add/update/remove/delete for on_change_with of xxx2Many * Add decorator on RPC diff --git a/trytond/doc/ref/tests.rst b/trytond/doc/ref/tests.rst index c0b4f8f150..25ac26aec9 100644 --- a/trytond/doc/ref/tests.rst +++ b/trytond/doc/ref/tests.rst @@ -42,10 +42,57 @@ ModuleTestCase Name of the tested module. +.. attribute:: ModuleTestCase.extras + + A list of extra modules to activate + +.. attribute:: ModuleTestCase.language + + The language to activate. + Default value is ``en``. + +RouteTestCase +------------- + +.. class:: RouteTestCase() + + A subclass of `unittest.TestCase`_ to test Tryton routes. + + It creates a temporary database with the module activated in setUpClass_ and + drops it in the tearDownClass_ method. + +.. attribute:: RouteTestCase.module + + Name of the tested module. + +.. attribute:: RouteTestCase.extras + + A list of extra modules to activate + +.. attribute:: RouteTestCase.language + + The language to activate. + Default value is ``en``. + +.. attribute:: RouteTestCase.db_name + + Returns the name of the database + +.. classmethod:: RouteTestCase.setUpDatabase() + + A method called by setUpClass_ after activating the modules in a + :class:`~trytond.transaction.Transaction`. + It is used to setup data in the database. + +.. method:: RouteTestCase.client() + + Return a client to simulate requests to the WSGI application. + .. _`unittest.TestCase`: https://docs.python.org/library/unittest.html#test-cases .. _setUpClass: https://docs.python.org/library/unittest.html#unittest.TestCase.setUpClass .. _tearDownClass: https://docs.python.org/library/unittest.html#unittest.TestCase.tearDownClass + Helpers ------- diff --git a/trytond/trytond/tests/test_tryton.py b/trytond/trytond/tests/test_tryton.py index 8efbc72c0d..997d8d7b95 100644 --- a/trytond/trytond/tests/test_tryton.py +++ b/trytond/trytond/tests/test_tryton.py @@ -34,16 +34,19 @@ from trytond.model import ( ModelSingleton, ModelSQL, ModelStorage, ModelView, Workflow, fields) from trytond.model.fields import Function from trytond.pool import Pool, isregisteredby +from trytond.protocols.wrappers import Response from trytond.pyson import PYSONDecoder, PYSONEncoder from trytond.tools import file_open, find_dir, is_instance_method from trytond.transaction import Transaction, TransactionError from trytond.wizard import StateAction, StateView +from trytond.wsgi import app __all__ = [ 'CONTEXT', 'Client', 'DB_NAME', 'ModuleTestCase', + 'RouteTestCase', 'USER', 'activate_module', 'doctest_checker', @@ -239,8 +242,7 @@ def with_transaction(user=1, context=None): return decorator -class ModuleTestCase(unittest.TestCase): - 'Trytond Test Case' +class _DBTestCase(unittest.TestCase): module = None extras = None language = 'en' @@ -252,13 +254,17 @@ class ModuleTestCase(unittest.TestCase): if cls.extras: modules.extend(cls.extras) activate_module(modules, lang=cls.language) - super(ModuleTestCase, cls).setUpClass() + super().setUpClass() @classmethod def tearDownClass(cls): - super(ModuleTestCase, cls).tearDownClass() + super().tearDownClass() drop_db() + +class ModuleTestCase(_DBTestCase): + "Tryton Module Test Case" + @with_transaction() def test_rec_name(self): for mname, model in Pool().iterobject(): @@ -923,6 +929,27 @@ class ModuleTestCase(unittest.TestCase): validator.assertValid(tree) +class RouteTestCase(_DBTestCase): + "Tryton Route Test Case" + + @classmethod + def setUpClass(cls): + super().setUpClass() + with Transaction().start(DB_NAME, 1): + cls.setUpDatabase() + + @classmethod + def setUpDatabase(cls): + pass + + @property + def db_name(self): + return DB_NAME + + def client(self): + return Client(app, Response) + + def db_exist(name=DB_NAME): database = backend.Database().connect() return name in database.list()