Files
tryton/trytond/tests/test_tools.py
T
Cédric Krier e2318257bb Allow to extend Field string and help
Those attributes are stored as StringPartitioned and each part creates its own
translation record. The translated strings are constructed by concatenation of
each translated part.

issue8040
review46731002
2019-03-15 13:01:11 +01:00

195 lines
6.5 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 doctest
import sql
import sql.operators
from trytond.tools import (
reduce_ids, reduce_domain, decimal_, is_instance_method, file_open)
from trytond.tools.string_ import StringPartitioned
class ToolsTestCase(unittest.TestCase):
'Test tools'
table = sql.Table('test')
def test_reduce_ids_empty(self):
'Test reduce_ids empty list'
self.assertEqual(reduce_ids(self.table.id, []), sql.Literal(False))
def test_reduce_ids_continue(self):
'Test reduce_ids continue list'
self.assertEqual(reduce_ids(self.table.id, list(range(10))),
sql.operators.Or(((self.table.id >= 0) & (self.table.id <= 9),)))
def test_reduce_ids_one_hole(self):
'Test reduce_ids continue list with one hole'
self.assertEqual(reduce_ids(self.table.id, list(range(10)) + list(range(20, 30))),
((self.table.id >= 0) & (self.table.id <= 9))
| ((self.table.id >= 20) & (self.table.id <= 29)))
def test_reduce_ids_short_continue(self):
'Test reduce_ids short continue list'
self.assertEqual(reduce_ids(self.table.id, list(range(4))),
sql.operators.Or((self.table.id.in_(list(range(4))),)))
def test_reduce_ids_complex(self):
'Test reduce_ids complex list'
self.assertEqual(reduce_ids(self.table.id,
list(range(10)) + list(range(25, 30)) + list(range(15, 20))),
(((self.table.id >= 0) & (self.table.id <= 14))
| (self.table.id.in_(list(range(25, 30))))))
def test_reduce_ids_complex_small_continue(self):
'Test reduce_ids complex list with small continue'
self.assertEqual(reduce_ids(self.table.id,
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 18, 19, 21]),
(((self.table.id >= 1) & (self.table.id <= 12))
| (self.table.id.in_([15, 18, 19, 21]))))
def test_reduce_ids_float(self):
'Test reduce_ids with integer as float'
self.assertEqual(reduce_ids(self.table.id,
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0,
15.0, 18.0, 19.0, 21.0]),
(((self.table.id >= 1.0) & (self.table.id <= 12.0))
| (self.table.id.in_([15.0, 18.0, 19.0, 21.0]))))
self.assertRaises(AssertionError, reduce_ids, self.table.id, [1.1])
def test_reduce_domain(self):
'Test reduce_domain'
clause = ('x', '=', 'x')
tests = (
([clause], ['AND', clause]),
([clause, [clause]], ['AND', clause, clause]),
(['AND', clause, [clause]], ['AND', clause, clause]),
([clause, ['AND', clause]], ['AND', clause, clause]),
([clause, ['AND', clause, clause]],
['AND', clause, clause, clause]),
(['AND', clause, ['AND', clause]], ['AND', clause, clause]),
([[[clause]]], ['AND', clause]),
(['OR', clause], ['OR', clause]),
(['OR', clause, [clause]], ['OR', clause, ['AND', clause]]),
(['OR', clause, [clause, clause]],
['OR', clause, ['AND', clause, clause]]),
(['OR', clause, ['OR', clause]], ['OR', clause, clause]),
(['OR', clause, [clause, ['OR', clause, clause]]],
['OR', clause, ['AND', clause, ['OR', clause, clause]]]),
(['OR', [clause]], ['OR', ['AND', clause]]),
([], []),
(['OR', clause, []], ['OR', clause, []]),
(['AND', clause, []], ['AND', clause, []]),
)
for i, j in tests:
self.assertEqual(reduce_domain(i), j,
'%s -> %s != %s' % (i, reduce_domain(i), j))
def test_is_instance_method(self):
'Test is_instance_method'
class Foo(object):
@staticmethod
def static():
pass
@classmethod
def klass(cls):
pass
def instance(self):
pass
self.assertFalse(is_instance_method(Foo, 'static'))
self.assertFalse(is_instance_method(Foo, 'klass'))
self.assertTrue(is_instance_method(Foo, 'instance'))
def test_file_open(self):
"Test file_open"
with file_open('__init__.py', subdir=None) as fp:
self.assertTrue(fp)
with file_open('ir/__init__.py') as fp:
self.assertTrue(fp)
with self.assertRaisesRegex(IOError, "File not found :"):
with file_open('ir/noexist'):
pass
with self.assertRaisesRegex(IOError, "Permission denied:"):
with file_open('/etc/passwd'):
pass
with self.assertRaisesRegex(IOError, "Permission denied:"):
with file_open('../../foo'):
pass
def test_file_open_suffix(self):
"Test file_open from same root name but with a suffix"
with self.assertRaisesRegex(IOError, "Permission denied:"):
file_open('../trytond_suffix', subdir=None)
class StringPartitionedTestCase(unittest.TestCase):
"Test StringPartitioned"
def test_init(self):
s = StringPartitioned('foo')
self.assertEqual(s, 'foo')
self.assertEqual(s._parts, ('foo',))
def test_init_partitioned(self):
s = StringPartitioned(
StringPartitioned('foo') + StringPartitioned('bar'))
self.assertEqual(s, 'foobar')
self.assertEqual(s._parts, ('foo', 'bar'))
def test_iter(self):
s = StringPartitioned('foo')
self.assertEqual(list(s), ['foo'])
def test_len(self):
s = StringPartitioned('foo')
self.assertEqual(len(s), 3)
def test_str(self):
s = StringPartitioned('foo')
s = str(s)
self.assertEqual(s, 'foo')
self.assertIsInstance(s, str)
self.assertNotIsInstance(s, StringPartitioned)
def test_add(self):
s = StringPartitioned('foo')
s = s + 'bar'
self.assertEqual(s, 'foobar')
self.assertEqual(list(s), ['foo', 'bar'])
def test_radd(self):
s = StringPartitioned('foo')
s = 'bar' + s
self.assertEqual(s, 'barfoo')
self.assertEqual(list(s), ['bar', 'foo'])
def suite():
func = unittest.TestLoader().loadTestsFromTestCase
suite = unittest.TestSuite()
for testcase in [ToolsTestCase, StringPartitionedTestCase]:
suite.addTests(func(testcase))
suite.addTest(doctest.DocTestSuite(decimal_))
return suite