summaryrefslogtreecommitdiff
path: root/odoo/addons
diff options
context:
space:
mode:
authorOdoo's Mergebot <xmo+roboto@odoo.com>2019-11-07 08:37:12 +0100
committerGitHub <noreply@github.com>2019-11-07 08:37:12 +0100
commitcfc65bd1b72b6fb7833f67fa580fa9fdac28b1f5 (patch)
treec1aa353aa7e29d0ed918911dbdce456ed957b72e /odoo/addons
parenta3f5afdd53f5f0d8d76427fe14dce6f02e064a75 (diff)
parentbc8fe668495a1d080ff883d5e61e961a128669de (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/addons')
-rw-r--r--odoo/addons/base/tests/__init__.py3
-rw-r--r--odoo/addons/base/tests/common.py196
-rw-r--r--odoo/addons/base/tests/test_acl.py45
-rw-r--r--odoo/addons/base/tests/test_api.py33
-rw-r--r--odoo/addons/base/tests/test_cache.py5
-rw-r--r--odoo/addons/base/tests/test_expression.py67
-rw-r--r--odoo/addons/base/tests/test_form_create.py18
-rw-r--r--odoo/addons/base/tests/test_ir_filters.py20
-rw-r--r--odoo/addons/base/tests/test_misc.py1
-rw-r--r--odoo/addons/base/tests/test_qweb.py1
-rw-r--r--odoo/addons/base/tests/test_res_partner_bank.py6
-rw-r--r--odoo/addons/test_access_rights/tests/test_access_monetary_related.py7
-rw-r--r--odoo/addons/test_access_rights/tests/test_feedback.py10
-rw-r--r--odoo/addons/test_convert/tests/test_env.py24
-rw-r--r--odoo/addons/test_impex/tests/contacts.json2
-rw-r--r--odoo/addons/test_impex/tests/test_load.py9
-rw-r--r--odoo/addons/test_inherit/tests/test_inherit.py5
-rw-r--r--odoo/addons/test_main_flows/static/tests/tours/main_flow.js10
-rw-r--r--odoo/addons/test_main_flows/tests/test_flow.py79
-rw-r--r--odoo/addons/test_new_api/__init__.py2
-rw-r--r--odoo/addons/test_new_api/__manifest__.py10
-rw-r--r--odoo/addons/test_new_api/data/test_new_api_data.xml (renamed from odoo/addons/test_new_api/demo_data.xml)3
-rw-r--r--odoo/addons/test_new_api/models/__init__.py4
-rw-r--r--odoo/addons/test_new_api/models/test_new_api.py (renamed from odoo/addons/test_new_api/models.py)0
-rw-r--r--odoo/addons/test_new_api/security/ir.model.access.csv (renamed from odoo/addons/test_new_api/ir.model.access.csv)0
-rw-r--r--odoo/addons/test_new_api/tests/test_new_fields.py53
-rw-r--r--odoo/addons/test_new_api/tests/test_onchange.py17
-rw-r--r--odoo/addons/test_new_api/tests/test_ui.py6
-rw-r--r--odoo/addons/test_new_api/views/test_new_api_templates.xml (renamed from odoo/addons/test_new_api/assets.xml)0
-rw-r--r--odoo/addons/test_new_api/views/test_new_api_views.xml (renamed from odoo/addons/test_new_api/views.xml)0
-rw-r--r--odoo/addons/test_performance/__manifest__.py3
-rw-r--r--odoo/addons/test_performance/demo/demo.xml30
-rw-r--r--odoo/addons/test_performance/tests/test_performance.py40
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),