Browse Source

Refactor tests of module 'base_exception'.

Defines a new mechanism to build odoo classes that are only
defined during testing.
pull/1111/head
Jordi Ballester 7 years ago
parent
commit
5871f5dfce
  1. 3
      base_exception/__init__.py
  2. 1
      base_exception/__manifest__.py
  3. 28
      base_exception/models/base_exception.py
  4. 8
      base_exception/security/tmp_test_model_access_rule.xml
  5. 3
      base_exception/tests/__init__.py
  6. 14
      base_exception/tests/common.py
  7. 73
      base_exception/tests/purchase_test.py
  8. 35
      base_exception/tests/test_base_exception.py
  9. 77
      base_exception/tests/test_tmp_model.py

3
base_exception/__init__.py

@ -1,5 +1,2 @@
# Copyright 2011 Raphaël Valyi, Renato Lima, Guewen Baconnier, Sodexis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import wizard, models
from .tests import test_tmp_model

1
base_exception/__manifest__.py

@ -18,7 +18,6 @@
'data': [
'security/base_exception_security.xml',
'security/ir.model.access.csv',
'security/tmp_test_model_access_rule.xml',
'wizard/base_exception_confirm_view.xml',
'views/base_exception_view.xml',
],

28
base_exception/models/base_exception.py

@ -5,8 +5,7 @@
import time
from functools import wraps
import os
from odoo import api, fields, models, tools, _
from odoo import api, fields, models, _
import logging
from odoo.exceptions import UserError, ValidationError
@ -252,28 +251,3 @@ class BaseException(models.AbstractModel):
def _default_get_lines(self):
return []
@api.model
def _import_acl_for_tmp_test_model(self):
# import the access rule of temp test model only if testing
testing = tools.config.get('test_enable')\
or os.environ.get('ODOO_TEST_ENABLE')
if testing:
header = ['id', 'name', 'model_id:id', 'group_id:id',
'perm_read', 'perm_write',
'perm_create', 'perm_unlink']
IrModelAccess = self.env['ir.model.access']
acl_data = [
['access_base_exception_test_purchase',
'access_base_exception_test_purchase',
'base_exception.model_base_exception_test_purchase',
'base.group_system', '1', '1', '1', '1'],
['access_base_exception_test_purchase_line',
'access_base_exception_test_purchase_line',
'base_exception.model_base_exception_test_purchase_line',
'base.group_system', '1', '1', '1', '1']
]
result = IrModelAccess.load(header, acl_data)
if result['messages']:
_logger.warning(result['messages'])

8
base_exception/security/tmp_test_model_access_rule.xml

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<function
model="base.exception"
name="_import_acl_for_tmp_test_model"/>
</data>
</odoo>

3
base_exception/tests/__init__.py

@ -1,3 +1,4 @@
from . import test_tmp_model
from . import common
from . import purchase_test
from . import test_base_exception

14
base_exception/tests/common.py

@ -0,0 +1,14 @@
# -*- coding: utf-8 -*-
# Copyright 2017 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
def setup_test_model(env, model_clses):
for model_cls in model_clses:
model_cls._build_model(env.registry, env.cr)
env.registry.setup_models(env.cr)
env.registry.init_models(
env.cr, [model_cls._name for model_cls in model_clses],
dict(env.context, update_custom_fields=True)
)

73
base_exception/tests/purchase_test.py

@ -0,0 +1,73 @@
# Copyright 2016 Akretion Mourad EL HADJ MIMOUNE
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
class PurchaseTest(models.Model):
_inherit = 'base.exception'
_name = "base.exception.test.purchase"
_description = "Base Ecxeption Test Model"
rule_group = fields.Selection(
selection_add=[('test_base', 'test')],
default='test_base',
)
name = fields.Char(required=True)
user_id = fields.Many2one('res.users', string='Responsible')
state = fields.Selection(
[('draft', 'New'), ('cancel', 'Cancelled'),
('purchase', 'Purchase'),
('to approve', 'To approve'), ('done', 'Done')],
string="Status", readonly=True, default='draft')
active = fields.Boolean(default=True)
partner_id = fields.Many2one('res.partner', string='Partner')
line_ids = fields.One2many(
'base.exception.test.purchase.line', 'lead_id')
amount_total = fields.Float(
compute='_compute_amount_total', store=True)
@api.depends('line_ids')
def _compute_amount_total(cls):
for record in cls:
for line in record.line_ids:
record.amount_total += line.amount * line.qty
@api.constrains('ignore_exception', 'line_ids', 'state')
def test_purchase_check_exception(cls):
orders = cls.filtered(lambda s: s.state == 'purchase')
if orders:
orders._check_exception()
@api.multi
def button_approve(cls, force=False):
cls.write({'state': 'to approve'})
return {}
@api.multi
def button_draft(cls):
cls.write({'state': 'draft'})
return {}
@api.multi
def button_confirm(cls):
cls.write({'state': 'purchase'})
return True
@api.multi
def button_cancel(cls):
cls.write({'state': 'cancel'})
def test_base_get_lines(cls):
cls.ensure_one()
return cls.line_ids
class LineTest(models.Model):
_name = "base.exception.test.purchase.line"
_description = "Base Exception Test Model Line"
name = fields.Char()
lead_id = fields.Many2one('base.exception.test.purchase',
ondelete='cascade')
qty = fields.Float()
amount = fields.Float()

35
base_exception/tests/test_base_exception.py

@ -2,35 +2,38 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo.tests import common
from .common import setup_test_model
from .purchase_test import PurchaseTest, LineTest
import logging
_logger = logging.getLogger(__name__)
# @common.at_install(False)
# @common.post_install(True)
class TestBaseException(common.TransactionCase):
class TestBaseException(common.SavepointCase):
# pylint: disable=missing-return
def setUp(self):
super(TestBaseException, self).setUp()
@classmethod
def setUpClass(cls):
super(TestBaseException, cls).setUpClass()
setup_test_model(cls.env, [PurchaseTest, LineTest])
self.base_exception = self.env['base.exception']
self.exception_rule = self.env['exception.rule']
self.exception_confirm = self.env['exception.rule.confirm']
cls.base_exception = cls.env['base.exception']
cls.exception_rule = cls.env['exception.rule']
cls.exception_confirm = cls.env['exception.rule.confirm']
self.exception_rule._fields['rule_group'].selection.append(
cls.exception_rule._fields['rule_group'].selection.append(
('test_base', 'test base exception')
)
self.exception_rule._fields['model'].selection.append(
cls.exception_rule._fields['model'].selection.append(
('base.exception.test.purchase',
'base.exception.test.purchase')
)
self.exception_rule._fields['model'].selection.append(
cls.exception_rule._fields['model'].selection.append(
('base.exception.test.purchase.line',
'base.exception.test.purchase.line')
)
self.exceptionnozip = self.env['exception.rule'].create({
cls.exceptionnozip = cls.env['exception.rule'].create({
'name': "No ZIP code on destination",
'sequence': 10,
'rule_group': "test_base",
@ -38,7 +41,7 @@ class TestBaseException(common.TransactionCase):
'code': """if not test_base.partner_id.zip:
failed=True""",
})
self.exceptionno_minorder = self.env['exception.rule'].create({
cls.exceptionno_minorder = cls.env['exception.rule'].create({
'name': "Min order except",
'sequence': 10,
'rule_group': "test_base",
@ -47,7 +50,7 @@ class TestBaseException(common.TransactionCase):
failed=True""",
})
self.exceptionno_lineqty = self.env['exception.rule'].create({
cls.exceptionno_lineqty = cls.env['exception.rule'].create({
'name': "Qty > 0",
'sequence': 10,
'rule_group': "test_base",
@ -55,7 +58,7 @@ class TestBaseException(common.TransactionCase):
'code': """if test_base_line.qty <= 0:
failed=True"""})
def test_sale_order_exception(self):
def test_purchase_order_exception(self):
partner = self.env.ref('base.res_partner_1')
partner.zip = False
potest1 = self.env['base.exception.test.purchase'].create({

77
base_exception/tests/test_tmp_model.py

@ -1,77 +0,0 @@
# Copyright 2017 Akretion (http://www.akretion.com)
# Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
import os
from odoo import api, fields, models, tools
import logging
_logger = logging.getLogger(__name__)
testing = tools.config.get('test_enable') or os.environ.get('ODOO_TEST_ENABLE')
if testing:
class PurchaseTest(models.Model):
_inherit = 'base.exception'
_name = "base.exception.test.purchase"
_description = "Base Ecxeption Test Model"
rule_group = fields.Selection(
selection_add=[('test_base', 'test')],
default='test_base',
)
name = fields.Char(required=True)
user_id = fields.Many2one('res.users', string='Responsible')
state = fields.Selection(
[('draft', 'New'), ('cancel', 'Cancelled'),
('purchase', 'Purchase'),
('to approve', 'To approve'), ('done', 'Done')],
string="Status", readonly=True, default='draft')
active = fields.Boolean(default=True)
partner_id = fields.Many2one('res.partner', string='Partner')
line_ids = fields.One2many(
'base.exception.test.purchase.line', 'lead_id')
amount_total = fields.Float(
compute='_compute_amount_total', store=True)
@api.depends('line_ids')
def _compute_amount_total(self):
for record in self:
for line in record.line_ids:
record.amount_total += line.amount * line.qty
@api.constrains('ignore_exception', 'line_ids', 'state')
def test_purchase_check_exception(self):
orders = self.filtered(lambda s: s.state == 'purchase')
if orders:
orders._check_exception()
@api.multi
def button_approve(self, force=False):
self.write({'state': 'to approve'})
return {}
@api.multi
def button_draft(self):
self.write({'state': 'draft'})
return {}
@api.multi
def button_confirm(self):
self.write({'state': 'purchase'})
return True
@api.multi
def button_cancel(self):
self.write({'state': 'cancel'})
def test_base_get_lines(self):
self.ensure_one()
return self.line_ids
class LineTest(models.Model):
_name = "base.exception.test.purchase.line"
_description = "Base Ecxeption Test Model Line"
name = fields.Char()
lead_id = fields.Many2one('base.exception.test.purchase',
ondelete='cascade')
qty = fields.Float()
amount = fields.Float()
Loading…
Cancel
Save