[IMP] base: Adapt tests to work with/without demo data

This commit is contained in:
Yannick Tivisse
2019-11-05 13:08:02 +01:00
parent 1306a4d80a
commit 04dc074804
9 changed files with 124 additions and 73 deletions
+23 -22
View File
@@ -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
+20 -13
View File
@@ -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)
+3 -2
View File
@@ -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
+47 -20
View File
@@ -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):
@@ -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,23 @@ 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
# [('internal_type', '=', 'payable'), ('deprecated', '=', False)]
partner_form.save()
def test_create_res_users(self):
+7 -13
View File
@@ -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):
"""
+1
View File
@@ -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()
+1
View File
@@ -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']
@@ -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)])