112 lines
3.6 KiB
Python
Executable File
112 lines
3.6 KiB
Python
Executable File
# 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 unittest.mock import patch
|
|
|
|
from trytond.pool import Pool
|
|
from trytond.tests.test_tryton import activate_module, with_transaction
|
|
from trytond.transaction import Transaction
|
|
|
|
|
|
class FieldFunctionTestCase(unittest.TestCase):
|
|
"Test Field Function"
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
activate_module('tests')
|
|
|
|
@with_transaction()
|
|
def test_definition(self):
|
|
pool = Pool()
|
|
Model = pool.get('test.function.definition')
|
|
|
|
definition = Model.function.definition(Model, 'en')
|
|
self.assertEqual(definition, {
|
|
'context': '{}',
|
|
'loading': 'lazy',
|
|
'name': 'function',
|
|
'on_change': [],
|
|
'on_change_with': [],
|
|
'readonly': True,
|
|
'required': False,
|
|
'states': '{}',
|
|
'type': 'integer',
|
|
'domain': '[]',
|
|
'searchable': True,
|
|
'sortable': False,
|
|
'help': '',
|
|
'string': 'Integer',
|
|
})
|
|
|
|
@with_transaction()
|
|
def test_accessor(self):
|
|
"Test accessing field on unsaved instance"
|
|
pool = Pool()
|
|
Model = pool.get('test.function.accessor')
|
|
Target = pool.get('test.function.accessor.target')
|
|
|
|
target = Target()
|
|
target.save()
|
|
record = Model()
|
|
record.target = target
|
|
|
|
self.assertEqual(record.function, target)
|
|
|
|
@with_transaction()
|
|
def test_getter_context(self):
|
|
"Test getter context"
|
|
pool = Pool()
|
|
Model = pool.get('test.function.getter_context')
|
|
|
|
record = Model()
|
|
record.save()
|
|
|
|
with Transaction().set_context(language='en', test='foo'):
|
|
record = Model(record.id)
|
|
|
|
self.assertEqual(record.function_with_context, 'en - foo')
|
|
self.assertEqual(record.function_without_context, 'en - empty')
|
|
|
|
@with_transaction()
|
|
def test_getter_cached_readonly_transaction(self):
|
|
"Test getter cached in read only transaction"
|
|
pool = Pool()
|
|
Model = pool.get('test.function.getter_context')
|
|
|
|
with Transaction().new_transaction(readonly=True), \
|
|
patch.object(Model, 'getter') as getter:
|
|
record, = Model.search([], limit=1)
|
|
record.function_with_context
|
|
record.function_without_context
|
|
self.assertEqual(getter.call_count, 2)
|
|
|
|
getter.reset_mock()
|
|
with Transaction().set_context(test='foo'):
|
|
record = Model(record.id)
|
|
record.function_with_context
|
|
record.function_without_context
|
|
self.assertEqual(getter.call_count, 1)
|
|
|
|
getter.reset_mock()
|
|
# Change transaction key context
|
|
with Transaction().set_context(language='en'):
|
|
record = Model(record.id)
|
|
record.function_with_context
|
|
record.function_without_context
|
|
self.assertEqual(getter.call_count, 2)
|
|
|
|
@with_transaction()
|
|
def test_getter_local_cache(self):
|
|
"Test getter use local cache"
|
|
pool = Pool()
|
|
Model = pool.get('test.function.getter_local_cache')
|
|
|
|
record = Model()
|
|
record.save()
|
|
with patch.object(Model, 'get_function1', autospec=True) as getter:
|
|
getter.return_value = 'test'
|
|
|
|
Model.read([record.id], ['function1', 'function2'])
|
|
|
|
self.assertEqual(getter.call_count, 1)
|