- Force UTC timezone on MySQL connection - Add 1s sleep to test check timestamp review2801002
83 lines
3.0 KiB
Python
83 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# 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
|
|
import time
|
|
|
|
from trytond.config import CONFIG
|
|
from trytond.exceptions import UserError, ConcurrencyException
|
|
from trytond.transaction import Transaction
|
|
from trytond.tests.test_tryton import POOL, DB_NAME, USER, CONTEXT, \
|
|
install_module
|
|
|
|
|
|
class ModelSQLTestCase(unittest.TestCase):
|
|
'Test ModelSQL'
|
|
|
|
def setUp(self):
|
|
install_module('tests')
|
|
self.modelsql = POOL.get('test.modelsql')
|
|
self.modelsql_timestamp = POOL.get('test.modelsql.timestamp')
|
|
|
|
def test0010required_field_missing(self):
|
|
'Test error message when a required field is missing'
|
|
if CONFIG['db_type'] not in ('postgresql', 'mysql'):
|
|
# SQLite not concerned because tryton don't set "NOT NULL"
|
|
# constraint: 'ALTER TABLE' don't support NOT NULL constraint
|
|
# without default value
|
|
return
|
|
fields = {
|
|
'desc': '',
|
|
'integer': 0,
|
|
}
|
|
for key, value in fields.iteritems():
|
|
with Transaction().start(DB_NAME, USER, context=CONTEXT):
|
|
try:
|
|
self.modelsql.create([{key: value}])
|
|
except UserError, err:
|
|
# message must not quote key
|
|
msg = "'%s' not missing but quoted in error: '%s'" % (key,
|
|
err.message)
|
|
self.assertTrue(key not in err.message, msg)
|
|
continue
|
|
self.fail('UserError should be caught')
|
|
|
|
def test0020check_timestamp(self):
|
|
'Test check timestamp'
|
|
# cursor must be committed between each changes otherwise NOW() returns
|
|
# always the same timestamp.
|
|
with Transaction().start(DB_NAME, USER,
|
|
context=CONTEXT) as transaction:
|
|
cursor = transaction.cursor
|
|
record, = self.modelsql_timestamp.create([{}])
|
|
cursor.commit()
|
|
|
|
timestamp = self.modelsql_timestamp.read([record.id],
|
|
['_timestamp'])[0]['_timestamp']
|
|
|
|
if CONFIG['db_type'] in ('sqlite', 'mysql'):
|
|
# timestamp precision of sqlite is the second
|
|
time.sleep(1)
|
|
|
|
self.modelsql_timestamp.write([record], {})
|
|
cursor.commit()
|
|
|
|
transaction.timestamp[str(record)] = timestamp
|
|
self.assertRaises(ConcurrencyException,
|
|
self.modelsql_timestamp.write, [record], {})
|
|
|
|
transaction.timestamp[str(record)] = timestamp
|
|
self.assertRaises(ConcurrencyException,
|
|
self.modelsql_timestamp.delete, [record])
|
|
|
|
transaction.timestamp.pop(str(record), None)
|
|
self.modelsql_timestamp.write([record], {})
|
|
cursor.commit()
|
|
self.modelsql_timestamp.delete([record])
|
|
cursor.commit()
|
|
|
|
|
|
def suite():
|
|
return unittest.TestLoader().loadTestsFromTestCase(ModelSQLTestCase)
|