diff options
| author | Odoo's Mergebot <xmo+roboto@odoo.com> | 2019-11-07 08:37:12 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-11-07 08:37:12 +0100 |
| commit | cfc65bd1b72b6fb7833f67fa580fa9fdac28b1f5 (patch) | |
| tree | c1aa353aa7e29d0ed918911dbdce456ed957b72e /odoo | |
| parent | a3f5afdd53f5f0d8d76427fe14dce6f02e064a75 (diff) | |
| parent | bc8fe668495a1d080ff883d5e61e961a128669de (diff) | |
[MERGE] various: Make the test suite demo data independant
Purpose
=======
This is the first huge step to improve the test suite in several ways:
- Make them demo data independent, allowing to modify the demo data without having to adapt the tests depending on it. It also allows to have a beautiful + convenient demo dataset to make a demonstration, and to configure complex data in the tests to manage the corner cases.
- Improve the test performances by converting them into SavepointCase. Each test will be rollbacked to it's initial state, after the setUpClass call. That way the different data are not re-created at each test for nothing.
- Introduce several test classes in base/tests/common.py to launch a TransactionCase, HttpCase or SavepointCase test with an available demo user, portal user or a large set of partners.
- This is the first step to tend to a rolling release process, allowing to execute the tests (or a subset of the tests) on a migrated base, for example.
closes odoo/odoo#39868
Taskid: 2075739
Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
Diffstat (limited to 'odoo')
33 files changed, 548 insertions, 161 deletions
diff --git a/odoo/addons/base/tests/__init__.py b/odoo/addons/base/tests/__init__.py index 54a68834374..e22f21be75c 100644 --- a/odoo/addons/base/tests/__init__.py +++ b/odoo/addons/base/tests/__init__.py @@ -1,4 +1,7 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import common from . import test_acl from . import test_api from . import test_base diff --git a/odoo/addons/base/tests/common.py b/odoo/addons/base/tests/common.py new file mode 100644 index 00000000000..4d7e7e00c87 --- /dev/null +++ b/odoo/addons/base/tests/common.py @@ -0,0 +1,196 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.tests.common import SavepointCase, TransactionCase, HttpCase + + +class TransactionCaseWithUserDemo(TransactionCase): + + def setUp(self): + super(TransactionCaseWithUserDemo, self).setUp() + + self.env.ref('base.partner_admin').write({'name': 'Mitchell Admin'}) + self.user_demo = self.env['res.users'].search([('login', '=', 'demo')]) + self.partner_demo = self.user_demo.partner_id + + if not self.user_demo: + self.env['ir.config_parameter'].sudo().set_param('auth_password_policy.minlength', 4) + # YTI TODO: This could be factorized between the different classes + self.partner_demo = self.env['res.partner'].create({ + 'name': 'Marc Demo', + 'email': 'mark.brown23@example.com', + }) + self.user_demo = self.env['res.users'].create({ + 'login': 'demo', + 'password': 'demo', + 'partner_id': self.partner_demo.id, + 'groups_id': [(6, 0, [self.env.ref('base.group_user').id, self.env.ref('base.group_partner_manager').id])], + }) + + +class HttpCaseWithUserDemo(HttpCase): + + def setUp(self): + super(HttpCaseWithUserDemo, self).setUp() + self.env.ref('base.partner_admin').write({'name': 'Mitchell Admin'}) + self.user_demo = self.env['res.users'].search([('login', '=', 'demo')]) + self.partner_demo = self.user_demo.partner_id + + if not self.user_demo: + self.env['ir.config_parameter'].sudo().set_param('auth_password_policy.minlength', 4) + self.partner_demo = self.env['res.partner'].create({ + 'name': 'Marc Demo', + 'email': 'mark.brown23@example.com', + }) + self.user_demo = self.env['res.users'].create({ + 'login': 'demo', + 'password': 'demo', + 'partner_id': self.partner_demo.id, + 'groups_id': [(6, 0, [self.env.ref('base.group_user').id, self.env.ref('base.group_partner_manager').id])], + }) + + +class SavepointCaseWithUserDemo(SavepointCase): + + @classmethod + def setUpClass(cls): + super(SavepointCaseWithUserDemo, cls).setUpClass() + + cls.user_demo = cls.env['res.users'].search([('login', '=', 'demo')]) + cls.partner_demo = cls.user_demo.partner_id + + if not cls.user_demo: + cls.env['ir.config_parameter'].sudo().set_param('auth_password_policy.minlength', 4) + cls.partner_demo = cls.env['res.partner'].create({ + 'name': 'Marc Demo', + 'email': 'mark.brown23@example.com', + }) + cls.user_demo = cls.env['res.users'].create({ + 'login': 'demo', + 'password': 'demo', + 'partner_id': cls.partner_demo.id, + 'groups_id': [(6, 0, [cls.env.ref('base.group_user').id, cls.env.ref('base.group_partner_manager').id])], + }) + + @classmethod + def _load_partners_set(cls): + cls.partner_category = cls.env['res.partner.category'].create({ + 'name': 'Sellers', + 'color': 2, + }) + cls.partner_category_child_1 = cls.env['res.partner.category'].create({ + 'name': 'Office Supplies', + 'parent_id': cls.partner_category.id, + }) + cls.partner_category_child_2 = cls.env['res.partner.category'].create({ + 'name': 'Desk Manufacturers', + 'parent_id': cls.partner_category.id, + }) + + # Load all the demo partners + cls.partners = cls.env['res.partner'].create([ + { + 'name': 'Inner Works', # Wood Corner + 'state_id': cls.env.ref('base.state_us_1').id, + 'category_id': [(6, 0, [cls.partner_category_child_1.id, cls.partner_category_child_2.id,])], + 'child_ids': [(0, 0, { + 'name': 'Sheila Ruiz', # 'Willie Burke', + }), (0, 0, { + 'name': 'Wyatt Howard', # 'Ron Gibson', + }), (0, 0, { + 'name': 'Austin Kennedy', # Tom Ruiz + })], + }, { + 'name': 'Pepper Street', # 'Deco Addict', + 'state_id': cls.env.ref('base.state_us_2').id, + 'child_ids': [(0, 0, { + 'name': 'Liam King', # 'Douglas Fletcher', + }), (0, 0, { + 'name': 'Craig Richardson', # 'Floyd Steward', + }), (0, 0, { + 'name': 'Adam Cox', # 'Addison Olson', + })], + }, { + 'name': 'AnalytIQ', #'Gemini Furniture', + 'state_id': cls.env.ref('base.state_us_3').id, + 'child_ids': [(0, 0, { + 'name': 'Pedro Boyd', # Edwin Hansen + }), (0, 0, { + 'name': 'Landon Roberts', # 'Jesse Brown', + 'company_id': cls.env.ref('base.main_company').id, + }), (0, 0, { + 'name': 'Leona Shelton', # 'Soham Palmer', + }), (0, 0, { + 'name': 'Scott Kim', # 'Oscar Morgan', + })], + }, { + 'name': 'Urban Trends', # 'Ready Mat', + 'state_id': cls.env.ref('base.state_us_4').id, + 'category_id': [(6, 0, [cls.partner_category_child_1.id, cls.partner_category_child_2.id,])], + 'child_ids': [(0, 0, { + 'name': 'Louella Jacobs', # 'Billy Fox', + }), (0, 0, { + 'name': 'Albert Alexander', # 'Kim Snyder', + }), (0, 0, { + 'name': 'Brad Castillo', # 'Edith Sanchez', + }), (0, 0, { + 'name': 'Sophie Montgomery', # 'Sandra Neal', + }), (0, 0, { + 'name': 'Chloe Bates', # 'Julie Richards', + }), (0, 0, { + 'name': 'Mason Crawford', # 'Travis Mendoza', + }), (0, 0, { + 'name': 'Elsie Kennedy', # 'Theodore Gardner', + })], + }, { + 'name': 'Ctrl-Alt-Fix', # 'The Jackson Group', + 'state_id': cls.env.ref('base.state_us_5').id, + 'child_ids': [(0, 0, { + 'name': 'carole miller', # 'Toni Rhodes', + }), (0, 0, { + 'name': 'Cecil Holmes', # 'Gordon Owens', + })], + }, { + 'name': 'Ignitive Labs', # 'Azure Interior', + 'state_id': cls.env.ref('base.state_us_6').id, + 'child_ids': [(0, 0, { + 'name': 'Jonathan Webb', # 'Brandon Freeman', + }), (0, 0, { + 'name': 'Clinton Clark', # 'Nicole Ford', + }), (0, 0, { + 'name': 'Howard Bryant', # 'Colleen Diaz', + })], + }, { + 'name': 'Amber & Forge', # 'Lumber Inc', + 'state_id': cls.env.ref('base.state_us_7').id, + 'child_ids': [(0, 0, { + 'name': 'Mark Webb', # 'Lorraine Douglas', + })], + }, { + 'name': 'Rebecca Day', # 'Chester Reed', + 'parent_id': cls.env.ref('base.main_partner').id, + }, { + 'name': 'Gabriella Jennings', # 'Dwayne Newman', + 'parent_id': cls.env.ref('base.main_partner').id, + } + ]) + +class HttpCaseWithUserPortal(HttpCase): + + def setUp(self): + super(HttpCaseWithUserPortal, self).setUp() + self.user_portal = self.env['res.users'].search([('login', '=', 'portal')]) + self.partner_portal = self.user_portal.partner_id + + if not self.user_portal: + self.env['ir.config_parameter'].sudo().set_param('auth_password_policy.minlength', 4) + self.partner_portal = self.env['res.partner'].create({ + 'name': 'Joel Willis', + 'email': 'joel.willis63@example.com', + }) + self.user_portal = self.env['res.users'].with_context(no_reset_password=True).create({ + 'login': 'portal', + 'password': 'portal', + 'partner_id': self.partner_portal.id, + 'groups_id': [(6, 0, [self.env.ref('base.group_portal').id])], + }) diff --git a/odoo/addons/base/tests/test_acl.py b/odoo/addons/base/tests/test_acl.py index 1648cf1dcea..fec7fda8ed5 100644 --- a/odoo/addons/base/tests/test_acl.py +++ b/odoo/addons/base/tests/test_acl.py @@ -4,19 +4,18 @@ from lxml import etree from odoo.exceptions import AccessError +from odoo.addons.base.tests.common import TransactionCaseWithUserDemo from odoo.tests.common import TransactionCase from odoo.tools.misc import mute_logger # test group that demo user should not have -USER_DEMO = 'base.user_demo' GROUP_SYSTEM = 'base.group_system' -class TestACL(TransactionCase): +class TestACL(TransactionCaseWithUserDemo): def setUp(self): super(TestACL, self).setUp() - self.demo_user = self.env.ref(USER_DEMO) self.erp_system_group = self.env.ref(GROUP_SYSTEM) def _set_field_groups(self, model, field_name, groups): @@ -26,7 +25,7 @@ class TestACL(TransactionCase): def test_field_visibility_restriction(self): """Check that model-level ``groups`` parameter effectively restricts access to that field for users who do not belong to one of the explicitly allowed groups""" - currency = self.env['res.currency'].with_user(self.demo_user) + currency = self.env['res.currency'].with_user(self.user_demo) # Add a view that adds a label for the field we are going to check extension = self.env["ir.ui.view"].create({ @@ -50,7 +49,7 @@ class TestACL(TransactionCase): original_fields = currency.fields_get([]) form_view = currency.fields_view_get(False, 'form') view_arch = etree.fromstring(form_view.get('arch')) - has_group_system = self.demo_user.has_group(GROUP_SYSTEM) + has_group_system = self.user_demo.has_group(GROUP_SYSTEM) self.assertFalse(has_group_system, "`demo` user should not belong to the restricted group before the test") self.assertIn('decimal_places', original_fields, "'decimal_places' field must be properly visible before the test") self.assertNotEqual(view_arch.xpath("//field[@name='decimal_places'][@nolabel='1']"), [], @@ -71,8 +70,8 @@ class TestACL(TransactionCase): "Label for 'decimal_places' must not be found in view definition") # Make demo user a member of the restricted group and check that the field is back - self.erp_system_group.users += self.demo_user - has_group_system = self.demo_user.has_group(GROUP_SYSTEM) + self.erp_system_group.users += self.user_demo + has_group_system = self.user_demo.has_group(GROUP_SYSTEM) fields = currency.fields_get([]) form_view = currency.fields_view_get(False, 'form') view_arch = etree.fromstring(form_view.get('arch')) @@ -86,10 +85,10 @@ class TestACL(TransactionCase): @mute_logger('odoo.models') def test_field_crud_restriction(self): "Read/Write RPC access to restricted field should be forbidden" - partner = self.env['res.partner'].browse(1).with_user(self.demo_user) + partner = self.env['res.partner'].browse(1).with_user(self.user_demo) # Verify the test environment first - has_group_system = self.demo_user.has_group(GROUP_SYSTEM) + has_group_system = self.user_demo.has_group(GROUP_SYSTEM) self.assertFalse(has_group_system, "`demo` user should not belong to the restricted group") self.assertTrue(partner.read(['bank_ids'])) self.assertTrue(partner.write({'bank_ids': []})) @@ -103,8 +102,8 @@ class TestACL(TransactionCase): partner.write({'bank_ids': []}) # Add the restricted group, and check that it works again - self.erp_system_group.users += self.demo_user - has_group_system = self.demo_user.has_group(GROUP_SYSTEM) + self.erp_system_group.users += self.user_demo + has_group_system = self.user_demo.has_group(GROUP_SYSTEM) self.assertTrue(has_group_system, "`demo` user should now belong to the restricted group") self.assertTrue(partner.read(['bank_ids'])) self.assertTrue(partner.write({'bank_ids': []})) @@ -112,7 +111,10 @@ class TestACL(TransactionCase): @mute_logger('odoo.models') def test_fields_browse_restriction(self): """Test access to records having restricted fields""" - partner = self.env['res.partner'].with_user(self.demo_user) + # Invalidate cache to avoid restricted value to be available + # in the cache + self.user_demo.invalidate_cache() + partner = self.env['res.partner'].with_user(self.user_demo) self._set_field_groups(partner, 'email', GROUP_SYSTEM) # accessing fields must no raise exceptions... @@ -126,7 +128,7 @@ class TestACL(TransactionCase): def test_view_create_edit_button_invisibility(self): """ Test form view Create, Edit, Delete button visibility based on access right of model""" methods = ['create', 'edit', 'delete'] - company = self.env['res.company'].with_user(self.demo_user) + company = self.env['res.company'].with_user(self.user_demo) company_view = company.fields_view_get(False, 'form') view_arch = etree.fromstring(company_view['arch']) for method in methods: @@ -134,9 +136,9 @@ class TestACL(TransactionCase): def test_view_create_edit_button_visibility(self): """ Test form view Create, Edit, Delete button visibility based on access right of model""" - self.erp_system_group.users += self.demo_user + self.erp_system_group.users += self.user_demo methods = ['create', 'edit', 'delete'] - company = self.env['res.company'].with_user(self.demo_user) + company = self.env['res.company'].with_user(self.user_demo) company_view = company.fields_view_get(False, 'form') view_arch = etree.fromstring(company_view['arch']) for method in methods: @@ -145,7 +147,7 @@ class TestACL(TransactionCase): def test_m2o_field_create_edit_invisibility(self): """ Test many2one field Create and Edit option visibility based on access rights of relation field""" methods = ['create', 'write'] - company = self.env['res.company'].with_user(self.demo_user) + company = self.env['res.company'].with_user(self.user_demo) company_view = company.fields_view_get(False, 'form') view_arch = etree.fromstring(company_view['arch']) field_node = view_arch.xpath("//field[@name='currency_id']") @@ -155,9 +157,9 @@ class TestACL(TransactionCase): def test_m2o_field_create_edit_visibility(self): """ Test many2one field Create and Edit option visibility based on access rights of relation field""" - self.erp_system_group.users += self.demo_user + self.erp_system_group.users += self.user_demo methods = ['create', 'write'] - company = self.env['res.company'].with_user(self.demo_user) + company = self.env['res.company'].with_user(self.user_demo) company_view = company.fields_view_get(False, 'form') view_arch = etree.fromstring(company_view['arch']) field_node = view_arch.xpath("//field[@name='currency_id']") @@ -166,12 +168,11 @@ class TestACL(TransactionCase): self.assertEqual(field_node[0].get('can_' + method), 'true') -class TestIrRule(TransactionCase): +class TestIrRule(TransactionCaseWithUserDemo): def test_ir_rule(self): model_res_partner = self.env.ref('base.model_res_partner') group_user = self.env.ref('base.group_user') - user_demo = self.env.ref('base.user_demo') # create an ir_rule for the Employee group with an blank domain rule1 = self.env['ir.rule'].create({ @@ -182,7 +183,7 @@ class TestIrRule(TransactionCase): }) # read as demo user the partners (one blank domain) - partners_demo = self.env['res.partner'].with_user(user_demo) + partners_demo = self.env['res.partner'].with_user(self.user_demo) partners = partners_demo.search([]) self.assertTrue(partners, "Demo user should see some partner.") @@ -256,7 +257,7 @@ class TestIrRule(TransactionCase): # create a new group with demo user in it, and a complex rule group_test = self.env['res.groups'].create({ 'name': 'Test Group', - 'users': [(6, 0, user_demo.ids)], + 'users': [(6, 0, self.user_demo.ids)], }) # add the rule to the new group, with a domain containing an implicit diff --git a/odoo/addons/base/tests/test_api.py b/odoo/addons/base/tests/test_api.py index 158fe2ee500..149e7b3a261 100644 --- a/odoo/addons/base/tests/test_api.py +++ b/odoo/addons/base/tests/test_api.py @@ -2,14 +2,19 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import models +from odoo.addons.base.tests.common import SavepointCaseWithUserDemo from odoo.tools import mute_logger -from odoo.tests import common from odoo.exceptions import AccessError -class TestAPI(common.TransactionCase): +class TestAPI(SavepointCaseWithUserDemo): """ test the new API of the ORM """ + @classmethod + def setUpClass(cls): + super(TestAPI, cls).setUpClass() + cls._load_partners_set() + def assertIsRecordset(self, value, model): self.assertIsInstance(value, models.BaseModel) self.assertEqual(value._name, model) @@ -48,8 +53,8 @@ class TestAPI(common.TransactionCase): @mute_logger('odoo.models') def test_02_query_limit(self): """ Build a recordset with offset, and check equivalence. """ - partners1 = self.env['res.partner'].search([], limit=10) - partners2 = self.env['res.partner'].search([])[:10] + partners1 = self.env['res.partner'].search([], order='id asc', limit=10) + partners2 = self.env['res.partner'].search([], order='id asc')[:10] self.assertIsRecordset(partners1, 'res.partner') self.assertIsRecordset(partners2, 'res.partner') self.assertEqual(list(partners1), list(partners2)) @@ -57,8 +62,8 @@ class TestAPI(common.TransactionCase): @mute_logger('odoo.models') def test_03_query_offset_limit(self): """ Build a recordset with offset and limit, and check equivalence. """ - partners1 = self.env['res.partner'].search([], offset=3, limit=7) - partners2 = self.env['res.partner'].search([])[3:10] + partners1 = self.env['res.partner'].search([], order='id asc', offset=3, limit=7) + partners2 = self.env['res.partner'].search([], order='id asc')[3:10] self.assertIsRecordset(partners1, 'res.partner') self.assertIsRecordset(partners2, 'res.partner') self.assertEqual(list(partners1), list(partners2)) @@ -173,7 +178,7 @@ class TestAPI(common.TransactionCase): partners[0].company_id.write({'name': 'Fools'}) # create an environment with the demo user - demo = self.env['res.users'].search([('login', '=', 'demo')])[0] + demo = self.env['res.users'].search([('login', 'ilike', 'demo')])[0] demo_env = self.env(user=demo) self.assertNotEqual(demo_env, self.env) @@ -193,16 +198,18 @@ class TestAPI(common.TransactionCase): self.assertEqual(p.env, demo_env) # demo user can read but not modify company data - demo_partners[0].company_id.name + demo_partner = self.env['res.partner'].search([('name', '=', 'Landon Roberts')]).with_user(demo) + self.assertTrue(demo_partner.company_id, 'This partner is supposed to be linked to a company') + demo_partner.company_id.name with self.assertRaises(AccessError): - demo_partners[0].company_id.write({'name': 'Pricks'}) + demo_partner.company_id.write({'name': 'Pricks'}) # remove demo user from all groups demo.write({'groups_id': [(5,)]}) # demo user can no longer access partner data with self.assertRaises(AccessError): - demo_partners[0].company_id.name + demo_partner.company_id.name @mute_logger('odoo.models') def test_60_cache(self): @@ -319,7 +326,7 @@ class TestAPI(common.TransactionCase): # the recordset operations below share the prefetch set same_prefetch(partners, partners.browse(partners.ids)) - same_prefetch(partners, partners.with_user(self.env.ref('base.user_demo'))) + same_prefetch(partners, partners.with_user(self.user_demo)) same_prefetch(partners, partners.with_context(active_test=False)) same_prefetch(partners, partners[:10].with_prefetch(partners._prefetch_ids)) @@ -338,7 +345,7 @@ class TestAPI(common.TransactionCase): 'name': 'Non-empty relational fields', 'country_id': self.ref('base.be'), 'bank_ids': [(0, 0, {'acc_number': 'FOO42'})], - 'category_id': [(4, self.ref('base.res_partner_category_0'))], + 'category_id': [(4, self.partner_category.id)], } partners = partners.create(vals0) + partners.create(vals1) for partner in partners: @@ -511,5 +518,5 @@ class TestAPI(common.TransactionCase): self.assertEqual(ps.sorted('name').ids, by_name_ids) # sort by inverse name, with a field name - by_name_ids.reverse() + by_name_ids = [p.id for p in sorted(ps, key=lambda p: p.name, reverse=True)] self.assertEqual(ps.sorted('name', reverse=True).ids, by_name_ids) diff --git a/odoo/addons/base/tests/test_cache.py b/odoo/addons/base/tests/test_cache.py index d6c18dd4132..0efa36ca48a 100644 --- a/odoo/addons/base/tests/test_cache.py +++ b/odoo/addons/base/tests/test_cache.py @@ -6,11 +6,12 @@ import platform import psutil import unittest +from odoo.addons.base.tests.common import TransactionCaseWithUserDemo from odoo.exceptions import CacheMiss from odoo.tests.common import TransactionCase -class TestRecordCache(TransactionCase): +class TestRecordCache(TransactionCaseWithUserDemo): def test_cache(self): """ Check the record cache object. """ @@ -37,7 +38,7 @@ class TestRecordCache(TransactionCase): check1(record, ref, ref_val) foo1, bar1 = Model.browse([1, 2]) - foo2, bar2 = Model.with_user(self.env.ref('base.user_demo')).browse([1, 2]) + foo2, bar2 = Model.with_user(self.user_demo).browse([1, 2]) self.assertNotEqual(foo1.env.uid, foo2.env.uid) # cache is empty diff --git a/odoo/addons/base/tests/test_expression.py b/odoo/addons/base/tests/test_expression.py index 7b5dfacadba..61d470e094c 100644 --- a/odoo/addons/base/tests/test_expression.py +++ b/odoo/addons/base/tests/test_expression.py @@ -3,13 +3,21 @@ import psycopg2 +from odoo.addons.base.tests.common import SavepointCaseWithUserDemo +from odoo.fields import Date from odoo.models import BaseModel from odoo.tests.common import TransactionCase from odoo.tools import mute_logger from odoo.osv import expression -class TestExpression(TransactionCase): +class TestExpression(SavepointCaseWithUserDemo): + + @classmethod + def setUpClass(cls): + super(TestExpression, cls).setUpClass() + cls._load_partners_set() + def _search(self, obj, domain, init_domain=[]): sql = obj.search(domain) allobj = obj.search(init_domain) @@ -111,7 +119,7 @@ class TestExpression(TransactionCase): Category = self.env['res.partner.category'] # search through m2m relation - partners = self._search(Partner, [('category_id', 'child_of', self.ref('base.res_partner_category_0'))]) + partners = self._search(Partner, [('category_id', 'child_of', self.partner_category.id)]) self.assertTrue(partners) # setup test partner categories @@ -217,8 +225,8 @@ class TestExpression(TransactionCase): Partner = self.env['res.partner'] all_partners = self._search(Partner, []) self.assertTrue(len(all_partners) > 1) - one = all_partners[0] - others = all_partners[1:] + one = self.env.ref('base.main_partner') + others = all_partners - one res_1 = self._search(Partner, [('id', '=', one.id)]) self.assertEqual(one, res_1) @@ -242,15 +250,15 @@ class TestExpression(TransactionCase): Partner = self.env['res.partner'] # testing equality with name - partners = self._search(Partner, [('parent_id', '=', 'Deco Addict')]) + partners = self._search(Partner, [('parent_id', '=', 'Pepper Street')]) self.assertTrue(partners) # testing the in operator with name - partners = self._search(Partner, [('parent_id', 'in', 'Deco Addict')]) + partners = self._search(Partner, [('parent_id', 'in', 'Pepper Street')]) self.assertTrue(partners) # testing the in operator with a list of names - partners = self._search(Partner, [('parent_id', 'in', ['Deco Addict', 'Wood Corner'])]) + partners = self._search(Partner, [('parent_id', 'in', ['Pepper Street', 'Inner Works'])]) self.assertTrue(partners) # check if many2one works with empty search list @@ -480,6 +488,22 @@ class TestExpression(TransactionCase): Currency = self.env['res.currency'] CurrencyRate = self.env['res.currency.rate'] + CurrencyRate.create([ + { + 'currency_id': self.env.ref('base.EUR').id, + 'name': '2000-01-01', + 'rate': 1.0, + }, { + 'currency_id': self.env.ref('base.USD').id, + 'name': '2000-01-01', + 'rate': 1.2834, + }, { + 'currency_id': self.env.ref('base.USD').id, + 'name': '2000-01-02', + 'rate': 1.5289, + } + ]) + # create a currency and a currency rate currency = Currency.create({'name': 'ZZZ', 'symbol': 'ZZZ', 'rounding': 1.0}) currency_rate = CurrencyRate.create({'name': '2010-01-01', 'currency_id': currency.id, 'rate': 1.0}) @@ -583,8 +607,8 @@ class TestExpression(TransactionCase): def test_like_wildcards(self): # check that =like/=ilike expressions are working on an untranslated field Partner = self.env['res.partner'] - partners = self._search(Partner, [('name', '=like', 'W_od_C_rn_r')]) - self.assertTrue(len(partners) == 1, "Must match one partner (Wood Corner)") + partners = self._search(Partner, [('name', '=like', 'I_ner_W_rk_')]) + self.assertTrue(all(partner.name == 'Inner Works' for partner in partners), "Must match only 'Inner Works'") partners = self._search(Partner, [('name', '=ilike', 'G%')]) self.assertTrue(len(partners) >= 1, "Must match one partner (Gemini Furniture)") @@ -608,12 +632,6 @@ class TestExpression(TransactionCase): countries = self._search(Country, domain) self.assertEqual(countries, belgium) - def test_long_table_alias(self): - # To test the 64 characters limit for table aliases in PostgreSQL - self.patch_order('res.users', 'partner_id') - self.patch_order('res.partner', 'commercial_partner_id,company_id,name') - self.env['res.users'].search([('name', '=', 'test')]) - @mute_logger('odoo.sql_db') def test_invalid(self): """ verify that invalid expressions are refused, even for magic fields """ @@ -640,12 +658,12 @@ class TestExpression(TransactionCase): vals = { 'name': 'OpenERP Test', 'active': False, - 'category_id': [(6, 0, [self.ref("base.res_partner_category_0")])], + 'category_id': [(6, 0, [self.partner_category.id])], 'child_ids': [(0, 0, {'name': 'address of OpenERP Test', 'country_id': self.ref("base.be")})], } Partner.create(vals) - partner = self._search(Partner, [('category_id', 'ilike', 'vendor'), ('active', '=', False)], [('active', '=', False)]) - self.assertTrue(partner, "Record not Found with category vendor and active False.") + partner = self._search(Partner, [('category_id', 'ilike', 'sellers'), ('active', '=', False)], [('active', '=', False)]) + self.assertTrue(partner, "Record not Found with category sellers and active False.") # testing for one2many field with country Belgium and active=False partner = self._search(Partner, [('child_ids.country_id','=','Belgium'),('active','=',False)], [('active', '=', False)]) @@ -655,7 +673,7 @@ class TestExpression(TransactionCase): """ Check that we can exclude translated fields (bug lp:1071710) """ # first install french language self.env['ir.translation']._load_module_terms(['base'], ['fr_FR']) - self.env.ref('base.res_partner_2').country_id = self.env.ref('base.be') + self.env['res.partner'].search([('name', '=', 'Pepper Street')]).country_id = self.env.ref('base.be') # actual test Country = self.env['res.country'].with_context(lang='fr_FR') be = self.env.ref('base.be') @@ -664,7 +682,7 @@ class TestExpression(TransactionCase): # indirect search via m2o Partner = self.env['res.partner'] - deco_addict = self._search(Partner, [('name', '=', 'Deco Addict')]) + deco_addict = self._search(Partner, [('name', '=', 'Pepper Street')]) not_be = self._search(Partner, [('country_id', '!=', 'Belgium')]) self.assertNotIn(deco_addict, not_be) @@ -715,6 +733,15 @@ class TestExpression(TransactionCase): self.assertEqual(expr, false) +class TestExpression2(TransactionCase): + + def test_long_table_alias(self): + # To test the 64 characters limit for table aliases in PostgreSQL + self.patch_order('res.users', 'partner_id') + self.patch_order('res.partner', 'commercial_partner_id,company_id,name') + self.env['res.users'].search([('name', '=', 'test')]) + + class TestAutoJoin(TransactionCase): def setUp(self): diff --git a/odoo/addons/base/tests/test_form_create.py b/odoo/addons/base/tests/test_form_create.py index 54757b68c57..9a787f46d2f 100644 --- a/odoo/addons/base/tests/test_form_create.py +++ b/odoo/addons/base/tests/test_form_create.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + from odoo.tests import TransactionCase, tagged, Form @@ -12,6 +14,22 @@ class TestFormCreate(TransactionCase): def test_create_res_partner(self): partner_form = Form(self.env['res.partner']) partner_form.name = 'a partner' + # YTI: Clean that brol + if hasattr(self.env['res.partner'], 'property_account_payable_id'): + property_account_payable_id = self.env['account.account'].create({ + 'name': 'Test Account', + 'user_type_id': self.env.ref('account.data_account_type_payable').id, + 'code': 'TestAccountPayable', + 'reconcile': True + }) + property_account_receivable_id = self.env['account.account'].create({ + 'name': 'Test Account', + 'user_type_id': self.env.ref('account.data_account_type_receivable').id, + 'code': 'TestAccountReceivable', + 'reconcile': True + }) + partner_form.property_account_payable_id = property_account_payable_id + partner_form.property_account_receivable_id = property_account_receivable_id partner_form.save() def test_create_res_users(self): diff --git a/odoo/addons/base/tests/test_ir_filters.py b/odoo/addons/base/tests/test_ir_filters.py index 040646cabba..1e0d0effc30 100644 --- a/odoo/addons/base/tests/test_ir_filters.py +++ b/odoo/addons/base/tests/test_ir_filters.py @@ -2,6 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import exceptions +from odoo.addons.base.tests.common import TransactionCaseWithUserDemo from odoo.tests.common import TransactionCase, ADMIN_USER_ID def noid(seq): @@ -12,7 +13,12 @@ def noid(seq): return seq -class FiltersCase(TransactionCase): +class FiltersCase(TransactionCaseWithUserDemo): + def setUp(self): + super(FiltersCase, self).setUp() + self.USER_NG = self.env['res.users'].name_search('demo')[0] + self.USER_ID = self.USER_NG[0] + def build(self, model, *args): Model = self.env[model].with_user(ADMIN_USER_ID) for vals in args: @@ -20,10 +26,6 @@ class FiltersCase(TransactionCase): class TestGetFilters(FiltersCase): - def setUp(self): - super(TestGetFilters, self).setUp() - self.USER_NG = self.env['res.users'].name_search('demo')[0] - self.USER_ID = self.USER_NG[0] def test_own_filters(self): self.build( @@ -77,10 +79,6 @@ class TestGetFilters(FiltersCase): class TestOwnDefaults(FiltersCase): - def setUp(self): - super(TestOwnDefaults, self).setUp() - self.USER_NG = self.env['res.users'].name_search('demo')[0] - self.USER_ID = self.USER_NG[0] def test_new_no_filter(self): """ @@ -180,10 +178,6 @@ class TestOwnDefaults(FiltersCase): class TestGlobalDefaults(FiltersCase): - def setUp(self): - super(TestGlobalDefaults, self).setUp() - self.USER_NG = self.env['res.users'].name_search('demo')[0] - self.USER_ID = self.USER_NG[0] def test_new_filter_not_default(self): """ diff --git a/odoo/addons/base/tests/test_misc.py b/odoo/addons/base/tests/test_misc.py index 34bd040eff8..29d0a021558 100644 --- a/odoo/addons/base/tests/test_misc.py +++ b/odoo/addons/base/tests/test_misc.py @@ -190,6 +190,7 @@ class TestDateRangeFunction(BaseCase): class TestFormatLangDate(TransactionCase): def test_00_accepted_types(self): + self.env.user.tz = 'Europe/Brussels' datetime_str = '2017-01-31 12:00:00' date_datetime = datetime.datetime.strptime(datetime_str, "%Y-%m-%d %H:%M:%S") date_date = date_datetime.date() diff --git a/odoo/addons/base/tests/test_qweb.py b/odoo/addons/base/tests/test_qweb.py index 9fa00468f06..13b95926f47 100644 --- a/odoo/addons/base/tests/test_qweb.py +++ b/odoo/addons/base/tests/test_qweb.py @@ -610,6 +610,7 @@ class TestQWeb(TransactionCase): return lambda: self.run_test_file(os.path.join(path, f)) def run_test_file(self, path): + self.env.user.tz = 'Europe/Brussels' doc = etree.parse(path).getroot() loader = FileSystemLoader(path) qweb = self.env['ir.qweb'] diff --git a/odoo/addons/base/tests/test_res_partner_bank.py b/odoo/addons/base/tests/test_res_partner_bank.py index 9d19b4ef395..1727cbb6916 100644 --- a/odoo/addons/base/tests/test_res_partner_bank.py +++ b/odoo/addons/base/tests/test_res_partner_bank.py @@ -3,10 +3,10 @@ # Copyright (c) 2015 ACSONE SA/NV (<http://acsone.eu>) -from odoo.tests.common import TransactionCase +from odoo.addons.base.tests.common import SavepointCaseWithUserDemo -class TestResPartnerBank(TransactionCase): +class TestResPartnerBank(SavepointCaseWithUserDemo): """Tests acc_number """ @@ -17,7 +17,7 @@ class TestResPartnerBank(TransactionCase): self.assertEqual(0, len(vals)) partner_bank = partner_bank_model.create({ 'acc_number': acc_number, - 'partner_id': self.ref('base.res_partner_2'), + 'partner_id': self.env['res.partner'].create({'name': 'Pepper Test'}).id, 'acc_type': 'bank', }) vals = partner_bank_model.search([('acc_number', '=', acc_number)]) diff --git a/odoo/addons/test_access_rights/tests/test_access_monetary_related.py b/odoo/addons/test_access_rights/tests/test_access_monetary_related.py index 2abe53294ed..0bff8048f8c 100644 --- a/odoo/addons/test_access_rights/tests/test_access_monetary_related.py +++ b/odoo/addons/test_access_rights/tests/test_access_monetary_related.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import odoo.tests +from odoo.addons.base.tests.common import TransactionCaseWithUserDemo -class TestMonetaryAccess(odoo.tests.TransactionCase): + +class TestMonetaryAccess(TransactionCaseWithUserDemo): def test_monetary_access_create(self): """Monetary fields that depend on compute/related currency @@ -13,7 +14,7 @@ class TestMonetaryAccess(odoo.tests.TransactionCase): as well as trigger spurious ACL errors. """ user_admin = self.env.ref("base.user_admin") - user_demo = self.env.ref("base.user_demo").with_user(user_admin) + user_demo = self.user_demo.with_user(user_admin) # this would raise without the fix introduced in this commit new_user = user_demo.copy({'monetary': 1/3}) diff --git a/odoo/addons/test_access_rights/tests/test_feedback.py b/odoo/addons/test_access_rights/tests/test_feedback.py index 09fd42589a8..40515026f3c 100644 --- a/odoo/addons/test_access_rights/tests/test_feedback.py +++ b/odoo/addons/test_access_rights/tests/test_feedback.py @@ -23,7 +23,15 @@ class TestSudo(Feedback): def test_sudo(self): record = self.env['test_access_right.some_obj'].create({'val': 5}) user1 = self.user - user2 = self.env.ref('base.user_demo') + partner_demo = self.env['res.partner'].create({ + 'name': 'Marc Demo', + }) + user2 = self.env['res.users'].create({ + 'login': 'demo2', + 'password': 'demo2', + 'partner_id': partner_demo.id, + 'groups_id': [(6, 0, [self.env.ref('base.group_user').id, self.env.ref('base.group_partner_manager').id])], + }) # with_user(user) record1 = record.with_user(user1) diff --git a/odoo/addons/test_convert/tests/test_env.py b/odoo/addons/test_convert/tests/test_env.py index fc5d9a094d3..1e549ce3db3 100644 --- a/odoo/addons/test_convert/tests/test_env.py +++ b/odoo/addons/test_convert/tests/test_env.py @@ -39,14 +39,14 @@ class TestEnv(common.TransactionCase): model="test_convert.usered", id="test_convert.testing" ), - uid="base.user_demo" + uid="base.default_user" ) ) r = self.env.ref('test_convert.testing') self.assertEqual(r.name, 'a') - self.assertEqual(r.create_uid, self.env.ref('base.user_demo')) - self.assertEqual(r.user_id, self.env.ref('base.user_demo')) + self.assertEqual(r.create_uid, self.env.ref('base.default_user')) + self.assertEqual(r.user_id, self.env.ref('base.default_user')) def test_uid_data_function(self): self.importer( @@ -56,14 +56,14 @@ class TestEnv(common.TransactionCase): name="create", eval="[[{'name': 'b'}]]", ), - uid="base.user_demo" + uid="base.default_user" ) ) r = self.env['test_convert.usered'].search([]) self.assertEqual(r.name, 'b') - self.assertEqual(r.create_uid, self.env.ref('base.user_demo')) - self.assertEqual(r.user_id, self.env.ref('base.user_demo')) + self.assertEqual(r.create_uid, self.env.ref('base.default_user')) + self.assertEqual(r.user_id, self.env.ref('base.default_user')) def test_uid_record(self): self.importer( @@ -72,7 +72,7 @@ class TestEnv(common.TransactionCase): field('c', name="name"), model="test_convert.usered", id="test_convert.testing", - uid="base.user_demo" + uid="base.default_user" ), uid="base.user_root" ) @@ -80,8 +80,8 @@ class TestEnv(common.TransactionCase): r = self.env.ref('test_convert.testing') self.assertEqual(r.name, 'c') - self.assertEqual(r.create_uid, self.env.ref('base.user_demo')) - self.assertEqual(r.user_id, self.env.ref('base.user_demo')) + self.assertEqual(r.create_uid, self.env.ref('base.default_user')) + self.assertEqual(r.user_id, self.env.ref('base.default_user')) def test_uid_function(self): @@ -90,7 +90,7 @@ class TestEnv(common.TransactionCase): function( model="test_convert.usered", name="create", - uid="base.user_demo", + uid="base.default_user", eval="[[{'name': 'd'}]]" ), uid="base.user_root" @@ -98,8 +98,8 @@ class TestEnv(common.TransactionCase): ) r = self.env['test_convert.usered'].search([]) self.assertEqual(r.name, 'd') - self.assertEqual(r.create_uid, self.env.ref('base.user_demo')) - self.assertEqual(r.user_id, self.env.ref('base.user_demo')) + self.assertEqual(r.create_uid, self.env.ref('base.default_user')) + self.assertEqual(r.user_id, self.env.ref('base.default_user')) def test_context_data_function(self): self.env.user.tz = 'UTC' diff --git a/odoo/addons/test_impex/tests/contacts.json b/odoo/addons/test_impex/tests/contacts.json index a024d2b7ee4..8bf490bb4c0 100644 --- a/odoo/addons/test_impex/tests/contacts.json +++ b/odoo/addons/test_impex/tests/contacts.json @@ -1 +1 @@ -[["Wood y Wood Pecker", "", "Snow Street, 25", "Kainuu", "Finland", "Vendor", "1", ""], ["Roger Pecker", "Contact", "Snow Street, 27", "Kainuu", "Finland", "Vendor", "0", "Wood y Wood Pecker"], ["Sharon Pecker", "Delivery Address", "Snow Street, 28", "Kainuu", "Finland", "Vendor", "0", "Wood y Wood Pecker"], ["Thomas Pecker", "Contact", "Snow Street, 27", "Kainuu", "Finland", "Vendor", "0", "Wood y Wood Pecker"], ["Norseman Roundabout", "", "Atonium Street, 45a", "Brussels", "Belgium", "Vendor", "1", ""], ["Yvan Holiday", "Invoice Address", "Atonium Street, 45b", "Brussels", "Belgium", "Vendor", "0", "Norseman Roundabout"], ["Jack Unsworth", "Contact", "Atonium Street, 45a", "Brussels", "Belgium", "Vendor", "0", "Norseman Roundabout"]] +[["Wood y Wood Pecker", "", "Snow Street, 25", "Kainuu", "Finland", "Sellers", "1", ""], ["Roger Pecker", "Contact", "Snow Street, 27", "Kainuu", "Finland", "Sellers", "0", "Wood y Wood Pecker"], ["Sharon Pecker", "Delivery Address", "Snow Street, 28", "Kainuu", "Finland", "Sellers", "0", "Wood y Wood Pecker"], ["Thomas Pecker", "Contact", "Snow Street, 27", "Kainuu", "Finland", "Sellers", "0", "Wood y Wood Pecker"], ["Norseman Roundabout", "", "Atonium Street, 45a", "Brussels", "Belgium", "Sellers", "1", ""], ["Yvan Holiday", "Invoice Address", "Atonium Street, 45b", "Brussels", "Belgium", "Sellers", "0", "Norseman Roundabout"], ["Jack Unsworth", "Contact", "Atonium Street, 45a", "Brussels", "Belgium", "Sellers", "0", "Norseman Roundabout"]] diff --git a/odoo/addons/test_impex/tests/test_load.py b/odoo/addons/test_impex/tests/test_load.py index edd346c6220..d2bd80f7e56 100644 --- a/odoo/addons/test_impex/tests/test_load.py +++ b/odoo/addons/test_impex/tests/test_load.py @@ -6,6 +6,7 @@ import pkgutil import re from odoo import fields +from odoo.addons.base.tests.common import SavepointCaseWithUserDemo from odoo.tests import common from odoo.tools.misc import mute_logger @@ -1007,7 +1008,13 @@ class test_o2m_multiple(ImporterCase): self.assertEqual(set(values(b.child2)), set([21, 22, 23])) -class test_realworld(common.TransactionCase): +class test_realworld(SavepointCaseWithUserDemo): + + @classmethod + def setUpClass(cls): + super(test_realworld, cls).setUpClass() + cls._load_partners_set() + def test_bigfile(self): data = json.loads(pkgutil.get_data(self.__module__, 'contacts_big.json').decode('utf-8')) result = self.env['res.partner'].load(['name', 'mobile', 'email', 'image_1920'], data) diff --git a/odoo/addons/test_inherit/tests/test_inherit.py b/odoo/addons/test_inherit/tests/test_inherit.py index d47f9b0dc93..8e5502d5671 100644 --- a/odoo/addons/test_inherit/tests/test_inherit.py +++ b/odoo/addons/test_inherit/tests/test_inherit.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from odoo.addons.base.tests.common import TransactionCaseWithUserDemo from odoo.tests import common class test_inherits(common.TransactionCase): @@ -68,10 +69,12 @@ class test_inherits(common.TransactionCase): self.assertEqual(mother._fields['state'].selection, [('a', 'A'), ('d', 'D'), ('b', 'B'), ('c', 'C')]) +class test_inherits_demo(TransactionCaseWithUserDemo): + def test_50_search_one2many(self): """ check search on one2many field based on inherited many2one field. """ # create a daughter record attached to partner Demo - partner_demo = self.env.ref('base.partner_demo') + partner_demo = self.partner_demo daughter = self.env['test.inherit.daughter'].create({'partner_id': partner_demo.id}) self.assertEqual(daughter.partner_id, partner_demo) self.assertIn(daughter, partner_demo.daughter_ids) diff --git a/odoo/addons/test_main_flows/static/tests/tours/main_flow.js b/odoo/addons/test_main_flows/static/tests/tours/main_flow.js index 4b49c9e7e08..272e98c5f54 100644 --- a/odoo/addons/test_main_flows/static/tests/tours/main_flow.js +++ b/odoo/addons/test_main_flows/static/tests/tours/main_flow.js @@ -666,12 +666,6 @@ tour.register('main_flow_tour', { content: _t("Register Payment"), position: "bottom", }, { - trigger: "select.o_field_widget[name=journal_id]", - extra_trigger: ".modal-dialog", - content: _t("Select Journal"), - position: "bottom", - run: 'text(Bank (USD))', -}, { trigger: ".modal-footer .btn-primary", content: _t("Validate"), position: "bottom", @@ -732,7 +726,7 @@ tour.register('main_flow_tour', { trigger: ".o_selected_row .o_field_widget[name=amount] input", content: _t("Write the amount received."), position: "bottom", - run: "text 12.65", + run: "text 11.00", }, { edition: "enterprise", trigger: ".o_selected_row .o_field_widget[name=partner_id] input", @@ -762,7 +756,7 @@ tour.register('main_flow_tour', { position: "bottom", }, { edition: "enterprise", - trigger: "button.o_reconcile", + trigger: "button.o_reconcile, button.o_validate", content: _t('<p><b>Click on Reconcile</p>'), position: "right", }, { diff --git a/odoo/addons/test_main_flows/tests/test_flow.py b/odoo/addons/test_main_flows/tests/test_flow.py index c412b031339..fe86f8187c6 100644 --- a/odoo/addons/test_main_flows/tests/test_flow.py +++ b/odoo/addons/test_main_flows/tests/test_flow.py @@ -7,4 +7,83 @@ import odoo.tests class TestUi(odoo.tests.HttpCase): def test_01_main_flow_tour(self): + # Define minimal accounting data to run without CoA + a_expense = self.env['account.account'].create({ + 'code': 'X2120', + 'name': 'Expenses - (test)', + 'user_type_id': self.env.ref('account.data_account_type_expenses').id, + }) + a_recv = self.env['account.account'].create({ + 'code': 'X1012', + 'name': 'Debtors - (test)', + 'reconcile': True, + 'user_type_id': self.env.ref('account.data_account_type_receivable').id, + }) + a_pay = self.env['account.account'].create({ + 'code': 'X1111', + 'name': 'Creditors - (test)', + 'user_type_id': self.env.ref('account.data_account_type_payable').id, + 'reconcile': True, + }) + a_sale = self.env['account.account'].create({ + 'code': 'X2020', + 'name': 'Product Sales - (test)', + 'user_type_id': self.env.ref('account.data_account_type_revenue').id, + }) + bnk = self.env['account.account'].create({ + 'code': 'X1014', + 'name': 'Bank Current Account - (test)', + 'user_type_id': self.env.ref('account.data_account_type_liquidity').id, + }) + + self.env['ir.property'].create([{ + 'name': 'property_account_receivable_id', + 'fields_id': self.env['ir.model.fields'].search([('model', '=', 'res.partner'), ('name', '=', 'property_account_receivable_id')], limit=1).id, + 'value': 'account.account,%s' % (a_recv.id), + 'company_id': self.env.company.id, + }, { + 'name': 'property_account_payable_id', + 'fields_id': self.env['ir.model.fields'].search([('model', '=', 'res.partner'), ('name', '=', 'property_account_payable_id')], limit=1).id, + 'value': 'account.account,%s' % (a_pay.id), + 'company_id': self.env.company.id, + }, { + 'name': 'property_account_position_id', + 'fields_id': self.env['ir.model.fields'].search([('model', '=', 'res.partner'), ('name', '=', 'property_account_position_id')], limit=1).id, + 'value': False, + 'company_id': self.env.company.id, + }, { + 'name': 'property_account_expense_categ_id', + 'fields_id': self.env['ir.model.fields'].search([('model', '=', 'product.category'), ('name', '=', 'property_account_expense_categ_id')], limit=1).id, + 'value': 'account.account,%s' % (a_expense.id), + 'company_id': self.env.company.id, + }, { + 'name': 'property_account_income_categ_id', + 'fields_id': self.env['ir.model.fields'].search([('model', '=', 'product.category'), ('name', '=', 'property_account_income_categ_id')], limit=1).id, + 'value': 'account.account,%s' % (a_sale.id), + 'company_id': self.env.company.id, + }]) + self.expenses_journal = self.env['account.journal'].create({ + 'name': 'Vendor Bills - Test', + 'code': 'TEXJ', + 'type': 'purchase', + 'default_credit_account_id': a_expense.id, + 'default_debit_account_id': a_expense.id, + 'refund_sequence': True, + }) + self.bank_journal = self.env['account.journal'].create({ + 'name': 'Bank - Test', + 'code': 'TBNK', + 'type': 'bank', + 'default_credit_account_id': bnk.id, + 'default_debit_account_id': bnk.id, + }) + self.sales_journal = self.env['account.journal'].create({ + 'name': 'Customer Invoices - Test', + 'code': 'TINV', + 'type': 'sale', + 'default_credit_account_id': a_sale.id, + 'default_debit_account_id': a_sale.id, + 'refund_sequence': True, + }) + self.start_tour("/web", 'main_flow_tour', login="admin", timeout=180) diff --git a/odoo/addons/test_new_api/__init__.py b/odoo/addons/test_new_api/__init__.py index a0fdc10fe11..dc5e6b693d1 100644 --- a/odoo/addons/test_new_api/__init__.py +++ b/odoo/addons/test_new_api/__init__.py @@ -1,2 +1,4 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + from . import models diff --git a/odoo/addons/test_new_api/__manifest__.py b/odoo/addons/test_new_api/__manifest__.py index 409fb15571a..f7ba4e9cdd8 100644 --- a/odoo/addons/test_new_api/__manifest__.py +++ b/odoo/addons/test_new_api/__manifest__.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + { 'name': 'Test API', 'version': '1.0', @@ -8,11 +10,11 @@ 'installable': True, 'auto_install': False, 'data': [ - 'ir.model.access.csv', - 'views.xml', - 'assets.xml', + 'security/ir.model.access.csv', + 'views/test_new_api_views.xml', + 'views/test_new_api_templates.xml', + 'data/test_new_api_data.xml', ], 'demo': [ - 'demo_data.xml', ], } diff --git a/odoo/addons/test_new_api/demo_data.xml b/odoo/addons/test_new_api/data/test_new_api_data.xml index ec6a5c8bced..678dabbece7 100644 --- a/odoo/addons/test_new_api/demo_data.xml +++ b/odoo/addons/test_new_api/data/test_new_api_data.xml @@ -10,7 +10,7 @@ <record id="discussion_0" model="test_new_api.discussion"> <field name="name">Stuff</field> - <field name="participants" eval="[(4, ref('base.user_root')), (4, ref('base.user_demo'))]"/> + <field name="participants" eval="[(4, ref('base.user_root'))]"/> </record> <record id="message_0_0" model="test_new_api.message"> @@ -20,7 +20,6 @@ </record> <record id="message_0_1" model="test_new_api.message"> <field name="discussion" ref="discussion_0"/> - <field name="author" ref="base.user_demo"/> <field name="body">What's up?</field> </record> <record id="message_0_2" model="test_new_api.message"> diff --git a/odoo/addons/test_new_api/models/__init__.py b/odoo/addons/test_new_api/models/__init__.py new file mode 100644 index 00000000000..8c9bb6618d1 --- /dev/null +++ b/odoo/addons/test_new_api/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import test_new_api diff --git a/odoo/addons/test_new_api/models.py b/odoo/addons/test_new_api/models/test_new_api.py index 3f45466efa3..3f45466efa3 100644 --- a/odoo/addons/test_new_api/models.py +++ b/odoo/addons/test_new_api/models/test_new_api.py diff --git a/odoo/addons/test_new_api/ir.model.access.csv b/odoo/addons/test_new_api/security/ir.model.access.csv index b676e85dd0d..b676e85dd0d 100644 --- a/odoo/addons/test_new_api/ir.model.access.csv +++ b/odoo/addons/test_new_api/security/ir.model.access.csv diff --git a/odoo/addons/test_new_api/tests/test_new_fields.py b/odoo/addons/test_new_api/tests/test_new_fields.py index 7622ec7e5a1..bb7c4ccbc1b 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -1,3 +1,6 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + # # test cases for new-style fields # @@ -9,6 +12,7 @@ from PIL import Image import psycopg2 from odoo import fields +from odoo.addons.base.tests.common import TransactionCaseWithUserDemo from odoo.exceptions import AccessError, UserError, ValidationError from odoo.tests import common from odoo.tools import mute_logger, float_repr @@ -16,7 +20,16 @@ from odoo.tools.date_utils import add, subtract, start_of, end_of from odoo.tools.image import image_data_uri -class TestFields(common.TransactionCase): +class TestFields(TransactionCaseWithUserDemo): + + def setUp(self): + super(TestFields, self).setUp() + self.env.ref('test_new_api.discussion_0').write({'participants': [(4, self.user_demo.id)]}) + # YTI FIX ME: The cache shouldn't be inconsistent (rco is gonna fix it) + # self.env.ref('test_new_api.discussion_0').participants -> 1 user + # self.env.ref('test_new_api.discussion_0').invalidate_cache() + # self.env.ref('test_new_api.discussion_0').with_context(active_test=False).participants -> 2 users + self.env.ref('test_new_api.message_0_1').write({'author': self.user_demo.id}) def test_00_basics(self): """ test accessing new fields """ @@ -110,6 +123,9 @@ class TestFields(common.TransactionCase): def test_10_computed_custom(self): """ check definition of custom computed fields """ + # Flush demo user before creating a new ir.model.fields to avoid + # a deadlock + self.user_demo.flush() self.env['ir.model.fields'].create({ 'name': 'x_bool_false_computed', 'model_id': self.env.ref('test_new_api.model_test_new_api_message').id, @@ -148,7 +164,7 @@ class TestFields(common.TransactionCase): # create a message, assign body, and check size in several environments message1 = self.env['test_new_api.message'].create({}) - message2 = message1.with_user(self.env.ref('base.user_demo')) + message2 = message1.with_user(self.user_demo) self.assertEqual(message1.size, 0) self.assertEqual(message2.size, 0) @@ -177,6 +193,10 @@ class TestFields(common.TransactionCase): check_stored(discussion1) # switch message from discussion, and check again + + # See YTI FIXME + discussion1.invalidate_cache() + discussion2 = discussion1.copy({'name': 'Another discussion'}) message2 = discussion1.messages[0] message2.discussion = discussion2 @@ -184,7 +204,7 @@ class TestFields(common.TransactionCase): # create a new discussion with messages, and check their name user_root = self.env.ref('base.user_root') - user_demo = self.env.ref('base.user_demo') + user_demo = self.user_demo discussion3 = self.env['test_new_api.discussion'].create({ 'name': 'Stuff', 'participants': [(4, user_root.id), (4, user_demo.id)], @@ -265,7 +285,7 @@ class TestFields(common.TransactionCase): # We need to force the read in order to test the security access User.invalidate_cache() # group users as a recordset, and read them as user demo - users = (user1 + user2 + user3).with_user(self.env.ref('base.user_demo')) + users = (user1 + user2 + user3).with_user(self.user_demo) user1, user2, user3 = users # regression test: a bug invalidated the field's value from cache user1.company_type @@ -480,6 +500,7 @@ class TestFields(common.TransactionCase): def test_15_constraint(self): """ test new-style Python constraints """ discussion = self.env.ref('test_new_api.discussion_0') + discussion.flush() # remove oneself from discussion participants: we can no longer create # messages in discussion @@ -773,7 +794,7 @@ class TestFields(common.TransactionCase): def test_23_relation(self): """ test relation fields """ - demo = self.env.ref('base.user_demo') + demo = self.user_demo message = self.env.ref('test_new_api.message_0_0') # check environment of record and related records @@ -792,6 +813,9 @@ class TestFields(common.TransactionCase): self.assertEqual(demo_message.env, demo_env) self.assertEqual(demo_message.discussion.env, demo_env) + # See YTI FIXME + message.discussion.invalidate_cache() + # assign record's parent to a record in demo_env message.discussion = message.discussion.copy({'name': 'Copy'}) @@ -1249,7 +1273,7 @@ class TestFields(common.TransactionCase): access.write({'perm_read': False}) # create an environment for demo user - env = self.env(user=self.env.ref('base.user_demo')) + env = self.env(user=self.user_demo) self.assertEqual(env.user.login, "demo") # create a new message as demo user @@ -1274,7 +1298,7 @@ class TestFields(common.TransactionCase): access.write({'perm_read': False}) # create an environment for demo user - env = self.env(user=self.env.ref('base.user_demo')) + env = self.env(user=self.user_demo) self.assertEqual(env.user.login, "demo") # create a new discussion and a new message as demo user @@ -1328,6 +1352,9 @@ class TestFields(common.TransactionCase): def test_70_x2many_write(self): discussion = self.env.ref('test_new_api.discussion_0') + # See YTI FIXME + discussion.invalidate_cache() + Message = self.env['test_new_api.message'] # There must be 3 messages, 0 important self.assertEqual(len(discussion.messages), 3) @@ -1353,11 +1380,15 @@ class TestFields(common.TransactionCase): def test_70_relational_inverse(self): """ Check the consistency of relational fields with inverse(s). """ discussion = self.env.ref('test_new_api.discussion_0') - demo_discussion = discussion.with_user(self.env.ref('base.user_demo')) + demo_discussion = discussion.with_user(self.user_demo) # check that the demo user sees the same messages self.assertEqual(demo_discussion.messages, discussion.messages) + # See YTI FIXME + discussion.invalidate_cache() + demo_discussion.invalidate_cache() + # add a message as user demo messages = demo_discussion.messages message = messages.create({'discussion': discussion.id}) @@ -1413,7 +1444,7 @@ class TestFields(common.TransactionCase): # And this gives error with self.assertRaises(UserError): self.env['test_new_api.binary_svg'].with_user( - self.env.ref('base.user_demo'), + self.user_demo, ).create({ 'name': 'Test without attachment', 'image_wo_attachment': SVG, @@ -1434,7 +1465,7 @@ class TestFields(common.TransactionCase): self.assertEqual(attachment.mimetype, 'image/svg+xml') # ...but this should be neutered with demo user record = self.env['test_new_api.binary_svg'].with_user( - self.env.ref('base.user_demo'), + self.user_demo, ).create({ 'name': 'Test without attachment', 'image_attachment': SVG, @@ -1448,7 +1479,7 @@ class TestFields(common.TransactionCase): def test_92_binary_self_avatar_svg(self): from odoo.addons.base.tests.test_mimetypes import SVG - demo_user = self.env.ref('base.user_demo') + demo_user = self.user_demo # User demo changes his own avatar demo_user.with_user(demo_user).image_1920 = SVG # The SVG file should have been neutered diff --git a/odoo/addons/test_new_api/tests/test_onchange.py b/odoo/addons/test_new_api/tests/test_onchange.py index 2359acd78fe..5d544bd2875 100644 --- a/odoo/addons/test_new_api/tests/test_onchange.py +++ b/odoo/addons/test_new_api/tests/test_onchange.py @@ -1,16 +1,19 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + try: from unittest.mock import patch except ImportError: from mock import patch +from odoo.addons.base.tests.common import SavepointCaseWithUserDemo from odoo.tests import common def strip_prefix(prefix, names): size = len(prefix) return [name[size:] for name in names if name.startswith(prefix)] -class TestOnChange(common.TransactionCase): +class TestOnChange(SavepointCaseWithUserDemo): def setUp(self): super(TestOnChange, self).setUp() @@ -229,7 +232,7 @@ class TestOnChange(common.TransactionCase): def test_onchange_one2many_multi(self): """ test the effect of multiple onchange methods on one2many fields """ - partner1 = self.env.ref('base.res_partner_1') + partner1 = self.env['res.partner'].create({'name': 'A partner'}) multi = self.env['test_new_api.multi'].create({'partner': partner1.id}) line1 = multi.lines.create({'multi': multi.id}) @@ -255,7 +258,7 @@ class TestOnChange(common.TransactionCase): # -> set 'partner' on all lines # -> recompute 'name' # -> set 'name' on all lines - partner2 = self.env.ref('base.res_partner_2') + partner2 = self.env['res.partner'].create({'name': 'A second partner'}) values = { 'name': partner1.name, 'partner': partner2.id, # this one just changed @@ -326,7 +329,7 @@ class TestOnChange(common.TransactionCase): def test_onchange_specific(self): """ test the effect of field-specific onchange method """ discussion = self.env.ref('test_new_api.discussion_0') - demo = self.env.ref('base.user_demo') + demo = self.user_demo field_onchange = self.Discussion._onchange_spec() self.assertEqual(field_onchange.get('moderator'), '1') @@ -381,7 +384,7 @@ class TestOnChange(common.TransactionCase): def test_onchange_one2many_value(self): """ test the value of the one2many field inside the onchange """ discussion = self.env.ref('test_new_api.discussion_0') - demo = self.env.ref('base.user_demo') + demo = self.user_demo field_onchange = self.Discussion._onchange_spec() self.assertEqual(field_onchange.get('messages'), '1') @@ -406,7 +409,7 @@ class TestOnChange(common.TransactionCase): def test_onchange_one2many_with_domain_on_related_field(self): """ test the value of the one2many field when defined with a domain on a related field""" discussion = self.env.ref('test_new_api.discussion_0') - demo = self.env.ref('base.user_demo') + demo = self.user_demo # mimic UI behaviour, so we get subfields # (we need at least subfield: 'important_emails.important') @@ -489,7 +492,7 @@ class TestOnChange(common.TransactionCase): self.assertEqual(result['value'], onchange_result) self.env.cache.invalidate() - Message = self.env(user=self.env.ref('base.user_demo').id)['test_new_api.related'] + Message = self.env(user=self.user_demo.id)['test_new_api.related'] result = Message.onchange(value, ['message', 'message_name', 'message_currency'], field_onchange) self.assertEqual(result['value'], onchange_result) diff --git a/odoo/addons/test_new_api/tests/test_ui.py b/odoo/addons/test_new_api/tests/test_ui.py index 6fa360ac9ae..979bf8064a9 100644 --- a/odoo/addons/test_new_api/tests/test_ui.py +++ b/odoo/addons/test_new_api/tests/test_ui.py @@ -1,9 +1,13 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + import odoo.tests from odoo.tools import mute_logger +from odoo.addons.base.tests.common import HttpCaseWithUserDemo @odoo.tests.common.tagged('post_install', '-at_install') -class TestUi(odoo.tests.HttpCase): +class TestUi(HttpCaseWithUserDemo): def test_01_admin_widget_x2many(self): # FIXME: breaks if too many children of base.menu_tests diff --git a/odoo/addons/test_new_api/assets.xml b/odoo/addons/test_new_api/views/test_new_api_templates.xml index 8bd75bceab5..8bd75bceab5 100644 --- a/odoo/addons/test_new_api/assets.xml +++ b/odoo/addons/test_new_api/views/test_new_api_templates.xml diff --git a/odoo/addons/test_new_api/views.xml b/odoo/addons/test_new_api/views/test_new_api_views.xml index 830210c4d87..830210c4d87 100644 --- a/odoo/addons/test_new_api/views.xml +++ b/odoo/addons/test_new_api/views/test_new_api_views.xml diff --git a/odoo/addons/test_performance/__manifest__.py b/odoo/addons/test_performance/__manifest__.py index ec3daa51a3f..e33ff4d4328 100644 --- a/odoo/addons/test_performance/__manifest__.py +++ b/odoo/addons/test_performance/__manifest__.py @@ -7,7 +7,4 @@ 'data': [ 'security/ir.model.access.csv', ], - 'demo': [ - 'demo/demo.xml', - ], } diff --git a/odoo/addons/test_performance/demo/demo.xml b/odoo/addons/test_performance/demo/demo.xml deleted file mode 100644 index 327e9082319..00000000000 --- a/odoo/addons/test_performance/demo/demo.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<odoo> - - <record id="object0" model="test_performance.base"> - <field name="name">Object 0</field> - <field name="value">0</field> - <field name="partner_id" ref="base.res_partner_3"/> - </record> - <record id="object1" model="test_performance.base"> - <field name="name">Object 1</field> - <field name="value">10</field> - <field name="partner_id" ref="base.res_partner_3"/> - </record> - <record id="object2" model="test_performance.base"> - <field name="name">Object 2</field> - <field name="value">20</field> - <field name="partner_id" ref="base.res_partner_4"/> - </record> - <record id="object3" model="test_performance.base"> - <field name="name">Object 3</field> - <field name="value">30</field> - <field name="partner_id" ref="base.res_partner_10"/> - </record> - <record id="object4" model="test_performance.base"> - <field name="name">Object 4</field> - <field name="value">40</field> - <field name="partner_id" ref="base.res_partner_12"/> - </record> - -</odoo> diff --git a/odoo/addons/test_performance/tests/test_performance.py b/odoo/addons/test_performance/tests/test_performance.py index 1db2e33f6d2..eaae5f41f10 100644 --- a/odoo/addons/test_performance/tests/test_performance.py +++ b/odoo/addons/test_performance/tests/test_performance.py @@ -4,11 +4,44 @@ from collections import defaultdict import json +from odoo.addons.base.tests.common import SavepointCaseWithUserDemo from odoo.tests.common import TransactionCase, users, warmup, tagged from odoo.tools import mute_logger -class TestPerformance(TransactionCase): +class TestPerformance(SavepointCaseWithUserDemo): + + @classmethod + def setUpClass(cls): + super(TestPerformance, cls).setUpClass() + cls._load_partners_set() + + partner3 = cls.env['res.partner'].search([('name', '=', 'AnalytIQ')], limit=1) + partner4 = cls.env['res.partner'].search([('name', '=', 'Urban Trends')], limit=1) + partner10 = cls.env['res.partner'].search([('name', '=', 'Ctrl-Alt-Fix')], limit=1) + partner12 = cls.env['res.partner'].search([('name', '=', 'Ignitive Labs')], limit=1) + + cls.env['test_performance.base'].create([{ + 'name': 'Object 0', + 'value': 0, + 'partner_id': partner3.id, + }, { + 'name': 'Object 1', + 'value': 10, + 'partner_id': partner3.id, + }, { + 'name': 'Object 2', + 'value': 20, + 'partner_id': partner4.id, + }, { + 'name': 'Object 3', + 'value': 30, + 'partner_id': partner10.id, + }, { + 'name': 'Object 4', + 'value': 40, + 'partner_id': partner12.id, + }]) @users('__system__', 'demo') @warmup @@ -377,9 +410,10 @@ class TestPerformance(TransactionCase): def expected_read_group(self): groups = defaultdict(list) - for record in self.env['test_performance.base'].search([]): + all_records = self.env['test_performance.base'].search([]) + for record in all_records: groups[record.partner_id.id].append(record.value) - partners = self.env['res.partner'].search([('id', 'in', list(groups))]) + partners = self.env['res.partner'].search([('id', 'in', all_records.mapped('partner_id').ids)]) return [{ '__domain': [('partner_id', '=', partner.id)], 'partner_id': (partner.id, partner.display_name), |
