Files
tryton/trytond/tests/test_model.py
T
Cédric Krier d9b4d71a11 Ensure context is correctly set when initializing Model
We make the assignation twice if any field has a context defined. This ensures
that the context will be evaluated with all initialized values when
the target records will be instantiated.

issue8586
review282041002
2019-09-09 22:41:54 +02:00

147 lines
4.2 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of this
# repository contains the full copyright notices and license terms.
import unittest
from trytond.pool import Pool
from trytond.tests.test_tryton import activate_module, with_transaction
class ModelTestCase(unittest.TestCase):
'Test Model'
@classmethod
def setUpClass(cls):
activate_module('tests')
@with_transaction()
def test_repr(self):
'Test repr'
pool = Pool()
Model = pool.get('test.model')
record = Model(name='foo')
self.assertEqual(
repr(record), "Pool().get('test.model')(**{'name': 'foo'})")
record.save()
self.assertEqual(
repr(record), "Pool().get('test.model')(%s)" % record.id)
@with_transaction()
def test_init_parent(self):
"Test __init__ with _parent_"
pool = Pool()
Model = pool.get('test.model_child')
values = {
'_parent_parent.name': "Test",
}
record = Model(**values)
self.assertEqual(record.parent.name, "Test")
@with_transaction()
def test_init_parent_parent(self):
"Test __init__ with _parent_._parent_"
pool = Pool()
Model = pool.get('test.model_child_child')
values = {
'_parent_parent.name': "Test 1",
'_parent_parent._parent_parent.name': "Test 2",
}
record = Model(**values)
self.assertEqual(record.parent.name, "Test 1")
self.assertEqual(record.parent.parent.name, "Test 2")
@with_transaction()
def test_init_context(self):
"Test __init__ for field with context"
pool = Pool()
Model = pool.get('test.model')
ModelContext = pool.get('test.model_context')
target, = Model.create([{'name': "Test Context"}])
# The dictionary order is important
values = {
'target': target.id,
'name': "foo",
}
record = ModelContext(**values)
self.assertEqual(record.target._context, {'name': "foo"})
@with_transaction()
def test_init_parent_context(self):
"Test __init__ with _parent for field with context"
pool = Pool()
ModelContext = pool.get('test.model_context')
# The dictionary order is important
values = {
'_parent_target.name': "Test Context",
'name': "foo",
}
record = ModelContext(**values)
self.assertEqual(record.target._context, {'name': "foo"})
@with_transaction()
def test_init_context_parent(self):
"Test __init__ for field with context from _parent"
pool = Pool()
Model = pool.get('test.model')
ModelContext = pool.get('test.model_context_parent')
target, = Model.create([{'name': "Test Context"}])
# The dictionary order is important
values = {
'target': target.id,
'_parent_parent.name': "bar",
}
record = ModelContext(**values)
self.assertEqual(record.target._context, {'name': "bar"})
@with_transaction()
def test_init_parent_context_parent(self):
"Test __init__ with _parent for field with context from _parent"
pool = Pool()
ModelContext = pool.get('test.model_context_parent')
# The dictionary order is important
values = {
'_parent_target.name': "Test Context",
'_parent_parent.name': "bar",
}
record = ModelContext(**values)
self.assertEqual(record.parent.name, "bar")
self.assertEqual(record.target._context, {'name': "bar"})
@with_transaction()
def test_names_model(self):
"Test __names__ for model only"
pool = Pool()
Model = pool.get('test.model')
names = Model.__names__()
self.assertEqual(names, {'model': "Model"})
@with_transaction()
def test_names_field(self):
"Test __names__ with field"
pool = Pool()
Model = pool.get('test.model')
names = Model.__names__('name')
self.assertEqual(names, {'model': "Model", 'field': "Name"})
def suite():
return unittest.TestLoader().loadTestsFromTestCase(ModelTestCase)