diff --git a/addons/mail/tests/common.py b/addons/mail/tests/common.py index 5a5c28f95d7..3bc8a0b020e 100644 --- a/addons/mail/tests/common.py +++ b/addons/mail/tests/common.py @@ -22,63 +22,66 @@ from openerp.tests import common -class TestMail(common.TransactionCase): +class TestMail(common.SavepointCase): - def _init_mock_build_email(self): - self._build_email_args_list = [] - self._build_email_kwargs_list = [] + @classmethod + def _init_mock_build_email(cls): + cls._build_email_args_list = [] + cls._build_email_kwargs_list = [] def setUp(self): super(TestMail, self).setUp() - cr, uid = self.cr, self.uid + self._build_email_args_list[:] = [] + self._build_email_kwargs_list[:] = [] - # Install mock SMTP gateway - test = self + @classmethod + def setUpClass(cls): + super(TestMail, cls).setUpClass() + cr, uid = cls.cr, cls.uid def build_email(self, *args, **kwargs): - test._build_email_args_list.append(args) - test._build_email_kwargs_list.append(kwargs) + cls._build_email_args_list.append(args) + cls._build_email_kwargs_list.append(kwargs) return build_email.origin(self, *args, **kwargs) def send_email(self, cr, uid, message, *args, **kwargs): return message['Message-Id'] - self._init_mock_build_email() - self.registry('ir.mail_server')._patch_method('build_email', build_email) - self.registry('ir.mail_server')._patch_method('send_email', send_email) + cls._init_mock_build_email() + cls.registry('ir.mail_server')._patch_method('build_email', build_email) + cls.registry('ir.mail_server')._patch_method('send_email', send_email) # Usefull models - self.ir_model = self.registry('ir.model') - self.ir_model_data = self.registry('ir.model.data') - self.ir_attachment = self.registry('ir.attachment') - self.mail_alias = self.registry('mail.alias') - self.mail_thread = self.registry('mail.thread') - self.mail_group = self.registry('mail.group') - self.mail_mail = self.registry('mail.mail') - self.mail_message = self.registry('mail.message') - self.mail_notification = self.registry('mail.notification') - self.mail_followers = self.registry('mail.followers') - self.mail_message_subtype = self.registry('mail.message.subtype') - self.res_users = self.registry('res.users') - self.res_partner = self.registry('res.partner') + cls.ir_model = cls.registry('ir.model') + cls.ir_model_data = cls.registry('ir.model.data') + cls.ir_attachment = cls.registry('ir.attachment') + cls.mail_alias = cls.registry('mail.alias') + cls.mail_thread = cls.registry('mail.thread') + cls.mail_group = cls.registry('mail.group') + cls.mail_mail = cls.registry('mail.mail') + cls.mail_message = cls.registry('mail.message') + cls.mail_notification = cls.registry('mail.notification') + cls.mail_followers = cls.registry('mail.followers') + cls.mail_message_subtype = cls.registry('mail.message.subtype') + cls.res_users = cls.registry('res.users') + cls.res_partner = cls.registry('res.partner') # Find Employee group - group_employee_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'base', 'group_user') - self.group_employee_id = group_employee_ref and group_employee_ref[1] or False + cls.group_employee_id = cls.env.ref('base.group_user').id or False # Partner Data # User Data: employee, noone - self.user_employee_id = self.res_users.create(cr, uid, { + cls.user_employee_id = cls.res_users.create(cr, uid, { 'name': 'Ernest Employee', 'login': 'ernest', 'alias_name': 'ernest', 'email': 'e.e@example.com', 'signature': '--\nErnest', 'notify_email': 'always', - 'groups_id': [(6, 0, [self.group_employee_id])] + 'groups_id': [(6, 0, [cls.group_employee_id])] }, {'no_reset_password': True}) - self.user_noone_id = self.res_users.create(cr, uid, { + cls.user_noone_id = cls.res_users.create(cr, uid, { 'name': 'Noemie NoOne', 'login': 'noemie', 'alias_name': 'noemie', @@ -89,16 +92,16 @@ class TestMail(common.TransactionCase): }, {'no_reset_password': True}) # Test users to use through the various tests - self.res_users.write(cr, uid, uid, {'name': 'Administrator'}) - self.user_raoul_id = self.res_users.create(cr, uid, { + cls.res_users.write(cr, uid, uid, {'name': 'Administrator'}) + cls.user_raoul_id = cls.res_users.create(cr, uid, { 'name': 'Raoul Grosbedon', 'signature': 'SignRaoul', 'email': 'raoul@raoul.fr', 'login': 'raoul', 'alias_name': 'raoul', - 'groups_id': [(6, 0, [self.group_employee_id])] + 'groups_id': [(6, 0, [cls.group_employee_id])] }) - self.user_bert_id = self.res_users.create(cr, uid, { + cls.user_bert_id = cls.res_users.create(cr, uid, { 'name': 'Bert Tartignole', 'signature': 'SignBert', 'email': 'bert@bert.fr', @@ -106,27 +109,28 @@ class TestMail(common.TransactionCase): 'alias_name': 'bert', 'groups_id': [(6, 0, [])] }) - self.user_raoul = self.res_users.browse(cr, uid, self.user_raoul_id) - self.user_bert = self.res_users.browse(cr, uid, self.user_bert_id) - self.user_admin = self.res_users.browse(cr, uid, uid) - self.partner_admin_id = self.user_admin.partner_id.id - self.partner_raoul_id = self.user_raoul.partner_id.id - self.partner_bert_id = self.user_bert.partner_id.id + cls.user_raoul = cls.res_users.browse(cr, uid, cls.user_raoul_id) + cls.user_bert = cls.res_users.browse(cr, uid, cls.user_bert_id) + cls.user_admin = cls.res_users.browse(cr, uid, uid) + cls.partner_admin_id = cls.user_admin.partner_id.id + cls.partner_raoul_id = cls.user_raoul.partner_id.id + cls.partner_bert_id = cls.user_bert.partner_id.id # Test 'pigs' group to use through the various tests - self.group_pigs_id = self.mail_group.create( + cls.group_pigs_id = cls.mail_group.create( cr, uid, {'name': 'Pigs', 'description': 'Fans of Pigs, unite !', 'alias_name': 'group+pigs'}, {'mail_create_nolog': True} ) - self.group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id) + cls.group_pigs = cls.mail_group.browse(cr, uid, cls.group_pigs_id) # Test mail.group: public to provide access to everyone - self.group_jobs_id = self.mail_group.create(cr, uid, {'name': 'Jobs', 'public': 'public'}) + cls.group_jobs_id = cls.mail_group.create(cr, uid, {'name': 'Jobs', 'public': 'public'}) # Test mail.group: private to restrict access - self.group_priv_id = self.mail_group.create(cr, uid, {'name': 'Private', 'public': 'private'}) + cls.group_priv_id = cls.mail_group.create(cr, uid, {'name': 'Private', 'public': 'private'}) - def tearDown(self): + @classmethod + def tearDownClass(cls): # Remove mocks - self.registry('ir.mail_server')._revert_method('build_email') - self.registry('ir.mail_server')._revert_method('send_email') - super(TestMail, self).tearDown() + cls.registry('ir.mail_server')._revert_method('build_email') + cls.registry('ir.mail_server')._revert_method('send_email') + super(TestMail, cls).tearDownClass() diff --git a/addons/mail/tests/test_invite.py b/addons/mail/tests/test_invite.py index c4484d254bb..e4b48c36645 100644 --- a/addons/mail/tests/test_invite.py +++ b/addons/mail/tests/test_invite.py @@ -19,7 +19,7 @@ # ############################################################################## -from openerp.addons.mail.tests.common import TestMail +from .common import TestMail class test_invite(TestMail): diff --git a/addons/mail/tests/test_mail_features.py b/addons/mail/tests/test_mail_features.py index 44b573f3e4a..a457dd0db73 100644 --- a/addons/mail/tests/test_mail_features.py +++ b/addons/mail/tests/test_mail_features.py @@ -19,9 +19,9 @@ # ############################################################################## -from openerp.addons.mail.mail_mail import mail_mail -from openerp.addons.mail.mail_thread import mail_thread -from openerp.addons.mail.tests.common import TestMail +from ..mail_mail import mail_mail +from ..mail_thread import mail_thread +from .common import TestMail from openerp.tools import mute_logger, email_split, html2plaintext from openerp.tools.mail import html_sanitize diff --git a/addons/mail/tests/test_mail_gateway.py b/addons/mail/tests/test_mail_gateway.py index 624d573d36a..ba13b5ebacb 100644 --- a/addons/mail/tests/test_mail_gateway.py +++ b/addons/mail/tests/test_mail_gateway.py @@ -19,7 +19,7 @@ # ############################################################################## -from openerp.addons.mail.tests.common import TestMail +from .common import TestMail from openerp.tools import mute_logger import socket diff --git a/addons/mail/tests/test_mail_group.py b/addons/mail/tests/test_mail_group.py index c131ce0bd0b..e343f1a429b 100644 --- a/addons/mail/tests/test_mail_group.py +++ b/addons/mail/tests/test_mail_group.py @@ -19,7 +19,7 @@ # ############################################################################## -from openerp.addons.mail.tests.common import TestMail +from .common import TestMail from openerp.exceptions import AccessError from openerp.osv.orm import except_orm from openerp.tools import mute_logger diff --git a/addons/mail/tests/test_mail_message.py b/addons/mail/tests/test_mail_message.py index 9883449d754..e6e78fe9254 100644 --- a/addons/mail/tests/test_mail_message.py +++ b/addons/mail/tests/test_mail_message.py @@ -19,7 +19,7 @@ # ############################################################################## -from openerp.addons.mail.tests.common import TestMail +from .common import TestMail from openerp.exceptions import AccessError from openerp.osv.orm import except_orm from openerp.tools import mute_logger diff --git a/addons/mail/tests/test_message_read.py b/addons/mail/tests/test_message_read.py index fbf30f2ed22..a8605a35238 100644 --- a/addons/mail/tests/test_message_read.py +++ b/addons/mail/tests/test_message_read.py @@ -19,7 +19,7 @@ # ############################################################################## -from openerp.addons.mail.tests.common import TestMail +from .common import TestMail class test_mail_access_rights(TestMail): diff --git a/addons/portal/tests/test_portal.py b/addons/portal/tests/test_portal.py index 6a8242bf0cf..6da7cfe6709 100644 --- a/addons/portal/tests/test_portal.py +++ b/addons/portal/tests/test_portal.py @@ -27,26 +27,26 @@ from openerp.tools.misc import mute_logger class test_portal(TestMail): - def setUp(self): - super(test_portal, self).setUp() - cr, uid = self.cr, self.uid + @classmethod + def setUpClass(cls): + super(test_portal, cls).setUpClass() + cr, uid = cls.cr, cls.uid # Find Portal group - group_portal = self.registry('ir.model.data').get_object(cr, uid, 'base', 'group_portal') - self.group_portal_id = group_portal.id + cls.group_portal_id = cls.env.ref('base.group_portal').id # Create Chell (portal user) - self.user_chell_id = self.res_users.create(cr, uid, {'name': 'Chell Gladys', 'login': 'chell', 'email': 'chell@gladys.portal', 'groups_id': [(6, 0, [self.group_portal_id])]}) - self.user_chell = self.res_users.browse(cr, uid, self.user_chell_id) - self.partner_chell_id = self.user_chell.partner_id.id + cls.user_chell_id = cls.res_users.create(cr, uid, {'name': 'Chell Gladys', 'login': 'chell', 'email': 'chell@gladys.portal', 'groups_id': [(6, 0, [cls.group_portal_id])]}) + cls.user_chell = cls.res_users.browse(cr, uid, cls.user_chell_id) + cls.partner_chell_id = cls.user_chell.partner_id.id # Create a PigsPortal group - self.group_port_id = self.mail_group.create(cr, uid, - {'name': 'PigsPortal', 'public': 'groups', 'group_public_id': self.group_portal_id}, + cls.group_port_id = cls.mail_group.create(cr, uid, + {'name': 'PigsPortal', 'public': 'groups', 'group_public_id': cls.group_portal_id}, {'mail_create_nolog': True}) # Set an email address for the user running the tests, used as Sender for outgoing mails - self.res_users.write(cr, uid, uid, {'email': 'test@localhost'}) + cls.res_users.write(cr, uid, uid, {'email': 'test@localhost'}) @mute_logger('openerp.addons.base.ir.ir_model', 'openerp.models') def test_00_mail_access_rights(self): diff --git a/addons/project/tests/test_project_base.py b/addons/project/tests/test_project_base.py index 70f8b59812f..fc788de5c6c 100644 --- a/addons/project/tests/test_project_base.py +++ b/addons/project/tests/test_project_base.py @@ -24,76 +24,75 @@ from openerp.addons.mail.tests.common import TestMail class TestProjectBase(TestMail): - def setUp(self): - super(TestProjectBase, self).setUp() - cr, uid = self.cr, self.uid + @classmethod + def setUpClass(cls): + super(TestProjectBase, cls).setUpClass() + cr, uid = cls.cr, cls.uid # Usefull models - self.project_project = self.registry('project.project') - self.project_task = self.registry('project.task') - self.project_task_delegate = self.registry('project.task.delegate') + cls.project_project = cls.registry('project.project') + cls.project_task = cls.registry('project.task') + cls.project_task_delegate = cls.registry('project.task.delegate') # Find Project User group - group_project_user_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'project', 'group_project_user') - self.group_project_user_id = group_project_user_ref and group_project_user_ref[1] or False + cls.group_project_user_id = cls.env.ref('project.group_project_user').id or False # Find Project Manager group - group_project_manager_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'project', 'group_project_manager') - self.group_project_manager_id = group_project_manager_ref and group_project_manager_ref[1] or False + cls.group_project_manager_id = cls.env.ref('project.group_project_manager').id or False # Test partners to use through the various tests - self.project_partner_id = self.res_partner.create(cr, uid, { + cls.project_partner_id = cls.res_partner.create(cr, uid, { 'name': 'Gertrude AgrolaitPartner', 'email': 'gertrude.partner@agrolait.com', }) - self.email_partner_id = self.res_partner.create(cr, uid, { + cls.email_partner_id = cls.res_partner.create(cr, uid, { 'name': 'Patrick Ratatouille', 'email': 'patrick.ratatouille@agrolait.com', }) # Test users to use through the various tests - self.user_projectuser_id = self.res_users.create(cr, uid, { + cls.user_projectuser_id = cls.res_users.create(cr, uid, { 'name': 'Armande ProjectUser', 'login': 'Armande', 'alias_name': 'armande', 'email': 'armande.projectuser@example.com', - 'groups_id': [(6, 0, [self.group_employee_id, self.group_project_user_id])] + 'groups_id': [(6, 0, [cls.group_employee_id, cls.group_project_user_id])] }) - self.user_projectmanager_id = self.res_users.create(cr, uid, { + cls.user_projectmanager_id = cls.res_users.create(cr, uid, { 'name': 'Bastien ProjectManager', 'login': 'bastien', 'alias_name': 'bastien', 'email': 'bastien.projectmanager@example.com', - 'groups_id': [(6, 0, [self.group_employee_id, self.group_project_manager_id])] + 'groups_id': [(6, 0, [cls.group_employee_id, cls.group_project_manager_id])] }) - self.user_none_id = self.res_users.create(cr, uid, { + cls.user_none_id = cls.res_users.create(cr, uid, { 'name': 'Charlie Avotbonkeur', 'login': 'charlie', 'alias_name': 'charlie', 'email': 'charlie.noone@example.com', 'groups_id': [(6, 0, [])] }) - self.user_projectuser = self.res_users.browse(cr, uid, self.user_projectuser_id) - self.user_projectmanager = self.res_users.browse(cr, uid, self.user_projectmanager_id) - self.partner_projectuser_id = self.user_projectuser.partner_id.id - self.partner_projectmanager_id = self.user_projectmanager.partner_id.id + cls.user_projectuser = cls.res_users.browse(cr, uid, cls.user_projectuser_id) + cls.user_projectmanager = cls.res_users.browse(cr, uid, cls.user_projectmanager_id) + cls.partner_projectuser_id = cls.user_projectuser.partner_id.id + cls.partner_projectmanager_id = cls.user_projectmanager.partner_id.id # Test 'Pigs' project - self.project_pigs_id = self.project_project.create(cr, uid, { + cls.project_pigs_id = cls.project_project.create(cr, uid, { 'name': 'Pigs', 'privacy_visibility': 'public', 'alias_name': 'project+pigs', - 'partner_id': self.partner_raoul_id, + 'partner_id': cls.partner_raoul_id, }, {'mail_create_nolog': True}) # Already-existing tasks in Pigs - self.task_1_id = self.project_task.create(cr, uid, { + cls.task_1_id = cls.project_task.create(cr, uid, { 'name': 'Pigs UserTask', - 'user_id': self.user_projectuser_id, - 'project_id': self.project_pigs_id, + 'user_id': cls.user_projectuser_id, + 'project_id': cls.project_pigs_id, }, {'mail_create_nolog': True}) - self.task_2_id = self.project_task.create(cr, uid, { + cls.task_2_id = cls.project_task.create(cr, uid, { 'name': 'Pigs ManagerTask', - 'user_id': self.user_projectmanager_id, - 'project_id': self.project_pigs_id, + 'user_id': cls.user_projectmanager_id, + 'project_id': cls.project_pigs_id, }, {'mail_create_nolog': True}) diff --git a/addons/project/tests/test_project_flow.py b/addons/project/tests/test_project_flow.py index 58263f6ea8a..cc3432b62e0 100644 --- a/addons/project/tests/test_project_flow.py +++ b/addons/project/tests/test_project_flow.py @@ -19,7 +19,7 @@ # ############################################################################## -from openerp.addons.project.tests.test_project_base import TestProjectBase +from .test_project_base import TestProjectBase from openerp.exceptions import AccessError from openerp.tools import mute_logger diff --git a/addons/survey/test/__init__.py b/addons/survey/test/__init__.py deleted file mode 100644 index ee6793c4b7c..00000000000 --- a/addons/survey/test/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Business Applications -# Copyright (c) 2012-TODAY OpenERP S.A. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - - -from . import test_survey diff --git a/addons/survey/test/test_survey.py b/addons/survey/test/test_survey.py deleted file mode 100644 index c3a3f4459af..00000000000 --- a/addons/survey/test/test_survey.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Business Applications -# Copyright (c) 2014-TODAY OpenERP S.A. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -from openerp.tests import common - - -class test_survey(common.TransactionCase): - - def setUp(self): - super(test_survey, self).setUp() - cr, uid, context = self.cr, self.uid, {} - pass - - def test_00_create_survey_and_questions(self): - cr, uid, context = self.cr, self.uid, {} - pass - - def test_01_fill_survey(self): - pass - - def test_02_answer_survey(self): - pass diff --git a/addons/website_forum/tests/common.py b/addons/website_forum/tests/common.py index 324d676fcb3..c92d72fae96 100644 --- a/addons/website_forum/tests/common.py +++ b/addons/website_forum/tests/common.py @@ -15,20 +15,21 @@ KARMA = { } -class TestForumCommon(common.TransactionCase): +class TestForumCommon(common.SavepointCase): - def setUp(self): - super(TestForumCommon, self).setUp() + @classmethod + def setUpClass(cls): + super(TestForumCommon, cls).setUpClass() - Forum = self.env['forum.forum'] - Post = self.env['forum.post'] + Forum = cls.env['forum.forum'] + Post = cls.env['forum.post'] # Test users - TestUsersEnv = self.env['res.users'].with_context({'no_reset_password': True}) - group_employee_id = self.ref('base.group_user') - group_portal_id = self.ref('base.group_portal') - group_public_id = self.ref('base.group_public') - self.user_employee = TestUsersEnv.create({ + TestUsersEnv = cls.env['res.users'].with_context({'no_reset_password': True}) + group_employee_id = cls.env.ref('base.group_user').id + group_portal_id = cls.env.ref('base.group_portal').id + group_public_id = cls.env.ref('base.group_public').id + cls.user_employee = TestUsersEnv.create({ 'name': 'Armande Employee', 'login': 'Armande', 'alias_name': 'armande', @@ -36,7 +37,7 @@ class TestForumCommon(common.TransactionCase): 'karma': 0, 'groups_id': [(6, 0, [group_employee_id])] }) - self.user_portal = TestUsersEnv.create({ + cls.user_portal = TestUsersEnv.create({ 'name': 'Beatrice Portal', 'login': 'Beatrice', 'alias_name': 'beatrice', @@ -44,7 +45,7 @@ class TestForumCommon(common.TransactionCase): 'karma': 0, 'groups_id': [(6, 0, [group_portal_id])] }) - self.user_public = TestUsersEnv.create({ + cls.user_public = TestUsersEnv.create({ 'name': 'Cedric Public', 'login': 'Cedric', 'alias_name': 'cedric', @@ -54,7 +55,7 @@ class TestForumCommon(common.TransactionCase): }) # Test forum - self.forum = Forum.create({ + cls.forum = Forum.create({ 'name': 'TestForum', 'karma_ask': KARMA['ask'], 'karma_answer': KARMA['ans'], @@ -79,15 +80,15 @@ class TestForumCommon(common.TransactionCase): 'karma_gen_answer_accept': 9999, 'karma_gen_answer_accepted': 9999, }) - self.post = Post.create({ + cls.post = Post.create({ 'name': 'TestQuestion', 'content': 'I am not a bird.', - 'forum_id': self.forum.id, - 'tag_ids': [(0, 0, {'name': 'Tag0', 'forum_id': self.forum.id})] + 'forum_id': cls.forum.id, + 'tag_ids': [(0, 0, {'name': 'Tag0', 'forum_id': cls.forum.id})] }) - self.answer = Post.create({ + cls.answer = Post.create({ 'name': 'TestAnswer', 'content': 'I am an anteater.', - 'forum_id': self.forum.id, - 'parent_id': self.post.id, + 'forum_id': cls.forum.id, + 'parent_id': cls.post.id, }) diff --git a/addons/website_forum/tests/test_forum.py b/addons/website_forum/tests/test_forum.py index 7ca4c2a69ab..3f97dd7d916 100644 --- a/addons/website_forum/tests/test_forum.py +++ b/addons/website_forum/tests/test_forum.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- -from openerp.addons.website_forum.tests.common import KARMA, TestForumCommon -from openerp.addons.website_forum.models.forum import KarmaError +from .common import KARMA, TestForumCommon +from ..models.forum import KarmaError from openerp.exceptions import Warning, AccessError from openerp.tools import mute_logger diff --git a/openerp/tests/common.py b/openerp/tests/common.py index 3a4700be682..65de700352a 100644 --- a/openerp/tests/common.py +++ b/openerp/tests/common.py @@ -13,6 +13,7 @@ import select import subprocess import threading import time +import itertools import unittest2 import urllib2 import xmlrpclib @@ -171,6 +172,27 @@ class SingleTransactionCase(BaseCase): cls.cr.close() +savepoint_seq = itertools.count() +class SavepointCase(SingleTransactionCase): + """ Similar to :class:`SingleTransactionCase` in that all test methods + are run in a single transaction *but* each test case is run inside a + rollbacked savepoint (sub-transaction). + + Useful for test cases containing fast tests but with significant database + setup common to all cases (complex in-db test data): :meth:`~.setUpClass` + can be used to generate db test data once, then all test cases use the + same data without influencing one another but without having to recreate + the test data either. + """ + def setUp(self): + self._savepoint_id = next(savepoint_seq) + self.cr.execute('SAVEPOINT test_%d' % self._savepoint_id) + def tearDown(self): + self.cr.execute('ROLLBACK TO SAVEPOINT test_%d' % self._savepoint_id) + self.env.clear() + self.registry.clear_caches() + + class RedirectHandler(urllib2.HTTPRedirectHandler): """ HTTPRedirectHandler is predicated upon HTTPErrorProcessor being used and