Files
tradon/tests/test_importdata.py
2025-12-26 13:11:43 +00:00

626 lines
20 KiB
Python
Executable File

# -*- 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 datetime as dt
import unittest
from decimal import Decimal
from trytond.model.exceptions import ImportDataError
from trytond.pool import Pool
from trytond.tests.test_tryton import activate_module, with_transaction
class ImportDataTestCase(unittest.TestCase):
'Test import_data'
@classmethod
def setUpClass(cls):
activate_module('tests')
@with_transaction()
def test_boolean(self):
'Test boolean'
pool = Pool()
Boolean = pool.get('test.import_data.boolean')
for value in ['True', '1', 'False', '0', '']:
with self.subTest(value=value):
self.assertEqual(
Boolean.import_data(['boolean'], [[value]]), 1)
@with_transaction()
def test_boolean_many_rows(self):
"Test boolean many rows"
pool = Pool()
Boolean = pool.get('test.import_data.boolean')
self.assertEqual(
Boolean.import_data(['boolean'], [['True'], ['False']]), 2)
@with_transaction()
def test_boolean_invalid(self):
"Test boolean invalid value"
pool = Pool()
Boolean = pool.get('test.import_data.boolean')
with self.assertRaises(ImportDataError):
Boolean.import_data(['boolean'], [['foo']])
@with_transaction()
def test_integer(self):
'Test integer'
pool = Pool()
Integer = pool.get('test.import_data.integer')
for value in ['1', '0', 0, 1, '-1', '', None]:
with self.subTest(value=value):
self.assertEqual(
Integer.import_data(['integer'], [[value]]), 1)
@with_transaction()
def test_integer_many_rows(self):
"Test integer many rows"
pool = Pool()
Integer = pool.get('test.import_data.integer')
self.assertEqual(
Integer.import_data(['integer'], [['1'], ['2']]), 2)
@with_transaction()
def test_integer_invalid(self):
"Test integer invalid value"
pool = Pool()
Integer = pool.get('test.import_data.integer')
for value in ['1.1', '-1.1', 'foo']:
with self.subTest(value=value):
with self.assertRaises(ImportDataError):
Integer.import_data(['integer'], [[value]])
@with_transaction()
def test_float(self):
'Test float'
pool = Pool()
Float = pool.get('test.import_data.float')
for value in [
'1.1', 0.0, 1.1, '-1.1', '1', '', '1.1', '0', '0.0', None]:
with self.subTest(value=value):
self.assertEqual(
Float.import_data(['float'], [[value]]), 1)
@with_transaction()
def test_float_invalid(self):
"Test float invalid value"
pool = Pool()
Float = pool.get('test.import_data.float')
with self.assertRaises(ImportDataError):
Float.import_data(['float'], [['foo']])
@with_transaction()
def test_numeric(self):
'Test numeric'
pool = Pool()
Numeric = pool.get('test.import_data.numeric')
for value in [
'1.1', Decimal('1.1'), '-1.1', '1',
Decimal('0.0'), '0', '0.0', '', None]:
with self.subTest(value=value):
self.assertEqual(
Numeric.import_data(['numeric'], [[value]]), 1)
@with_transaction()
def test_numeric_invalid(self):
pool = Pool()
Numeric = pool.get('test.import_data.numeric')
with self.assertRaises(ImportDataError):
Numeric.import_data(['numeric'], [['foo']])
@with_transaction()
def test_char(self):
'Test char'
pool = Pool()
Char = pool.get('test.import_data.char')
for value in ['test', '']:
with self.subTest(value=value):
self.assertEqual(
Char.import_data(['char'], [[value]]), 1)
@with_transaction()
def test_char_many_rows(self):
"Test char many rows"
pool = Pool()
Char = pool.get('test.import_data.char')
self.assertEqual(
Char.import_data(['char'], [['test'], ['foo'], ['bar']]), 3)
@with_transaction()
def test_text(self):
'Test text'
pool = Pool()
Text = pool.get('test.import_data.text')
for value in ['test', '']:
with self.subTest(value=value):
self.assertEqual(
Text.import_data(['text'], [[value]]), 1)
@with_transaction()
def test_text_many_rows(self):
"Test text many rows"
pool = Pool()
Text = pool.get('test.import_data.text')
self.assertEqual(
Text.import_data(['text'], [['test'], ['foo'], ['bar']]), 3)
@with_transaction()
def test_date(self):
'Test date'
pool = Pool()
Date = pool.get('test.import_data.date')
for value in ['2010-01-01', dt.date(2019, 3, 13), '']:
with self.subTest(value=value):
self.assertEqual(
Date.import_data(['date'], [[value]]), 1)
@with_transaction()
def test_date_many_rows(self):
"Test date many rows"
pool = Pool()
Date = pool.get('test.import_data.date')
self.assertEqual(
Date.import_data(['date'], [['2010-01-01'], ['2010-02-01']]), 2)
@with_transaction()
def test_date_invalid(self):
"Test date invalid value"
pool = Pool()
Date = pool.get('test.import_data.date')
with self.assertRaises(ImportDataError):
Date.import_data(['date'], [['foo']])
@with_transaction()
def test_datetime(self):
'Test datetime'
pool = Pool()
Datetime = pool.get('test.import_data.datetime')
for value in [
'2010-01-01 12:00:00', dt.datetime(2019, 3, 13, 12, 0), '']:
with self.subTest(value=value):
self.assertEqual(
Datetime.import_data(['datetime'], [[value]]), 1)
@with_transaction()
def test_datetime_many_rows(self):
"Test datetime many rows"
pool = Pool()
Datetime = pool.get('test.import_data.datetime')
self.assertEqual(
Datetime.import_data(
['datetime'], [
['2010-01-01 12:00:00'], ['2010-01-01 13:30:00']]), 2)
@with_transaction()
def test_datetime_invalid(self):
"Test datetime invalid value"
pool = Pool()
Datetime = pool.get('test.import_data.datetime')
with self.assertRaises(ImportDataError):
Datetime.import_data(['datetime'], [['foo']])
@with_transaction()
def test_timedelta(self):
'Test timedelta'
pool = Pool()
Timedelta = pool.get('test.import_data.timedelta')
for value in [
'00:00', '0:00:00', '01:00:00', '36:00:00', '0:00:00.0001',
dt.timedelta(
weeks=2, days=3, hours=8, minutes=50, seconds=30.45),
30.45]:
with self.subTest(value=value):
self.assertEqual(
Timedelta.import_data(['timedelta'], [[value]]), 1)
@with_transaction()
def test_timedelta_invalid(self):
'Test timedelta'
pool = Pool()
Timedelta = pool.get('test.import_data.timedelta')
with self.assertRaises(ImportDataError):
Timedelta.import_data(['timedelta'], [['foo']])
@with_transaction()
def test_selection(self):
'Test selection'
pool = Pool()
Selection = pool.get('test.import_data.selection')
for value in ['select1', '']:
with self.subTest(value=value):
self.assertEqual(
Selection.import_data(['selection'], [[value]]), 1)
@with_transaction()
def test_selection_many_rows(self):
'Test selection many rows'
pool = Pool()
Selection = pool.get('test.import_data.selection')
self.assertEqual(
Selection.import_data(['selection'], [['select1'], ['select2']]),
2)
@with_transaction()
def test_many2one(self):
'Test many2one'
pool = Pool()
Many2one = pool.get('test.import_data.many2one')
for value in ['Test', '']:
with self.subTest(value=value):
self.assertEqual(
Many2one.import_data(['many2one'], [[value]]), 1)
@with_transaction()
def test_many2one_id(self):
"Test many2one with id"
pool = Pool()
Many2one = pool.get('test.import_data.many2one')
self.assertEqual(
Many2one.import_data(
['many2one:id'], [['tests.import_data_many2one_target_test']]),
1)
@with_transaction()
def test_many2one_many_rows(self):
"Test many2one many rows"
pool = Pool()
Many2one = pool.get('test.import_data.many2one')
self.assertEqual(
Many2one.import_data(['many2one'], [['Test'], ['Test']]), 2)
@with_transaction()
def test_many2one_invalid(self):
"Test many2one invalid value"
pool = Pool()
Many2one = pool.get('test.import_data.many2one')
for value in ['foo', 'Duplicate']:
with self.subTest(value=value):
with self.assertRaises(ImportDataError):
Many2one.import_data(['many2one'], [[value]])
@with_transaction()
def test_many2one_id_invalid(self):
"Test many2one invalid id"
pool = Pool()
Many2one = pool.get('test.import_data.many2one')
for value in ['foo', 'tests.foo']:
with self.subTest(value=value):
with self.assertRaises(ImportDataError):
Many2one.import_data(['many2one:id'], [[value]])
@with_transaction()
def test_many2many(self):
'Test many2many'
pool = Pool()
Many2many = pool.get('test.import_data.many2many')
for value in [
'Test 1', 'Test\\, comma', 'Test\\, comma,Test 1',
'Test 1,Test 2', '']:
with self.subTest(value=value):
self.assertEqual(
Many2many.import_data(['many2many'], [[value]]), 1)
@with_transaction()
def test_many2many_id(self):
"Test many2many with id"
pool = Pool()
Many2many = pool.get('test.import_data.many2many')
for value in [
'tests.import_data_many2many_target_test1',
'tests.import_data_many2many_target_test1,'
'tests.import_data_many2many_target_test2']:
with self.subTest(value=value):
self.assertEqual(
Many2many.import_data(['many2many:id'], [[value]]), 1)
@with_transaction()
def test_many2many_many_rows(self):
"Test many2many many rows"
pool = Pool()
Many2many = pool.get('test.import_data.many2many')
self.assertEqual(
Many2many.import_data(['many2many'], [['Test 1'], ['Test 2']]), 2)
@with_transaction()
def test_many2many_invalid(self):
"Test many2many invalid value"
pool = Pool()
Many2many = pool.get('test.import_data.many2many')
for value in ['foo', 'Test 1,foo', 'Duplicate', 'Test 1,Duplicate']:
with self.subTest(value=value):
with self.assertRaises(ImportDataError):
Many2many.import_data(['many2many'], [[value]])
@with_transaction()
def test_one2many(self):
'Test one2many'
pool = Pool()
One2many = pool.get('test.import_data.one2many')
self.assertEqual(One2many.import_data(
['name', 'one2many/name'], [['Test', 'Test 1']]), 1)
@with_transaction()
def test_one2many_many_targets(self):
"Test one2many with many targets"
pool = Pool()
One2many = pool.get('test.import_data.one2many')
self.assertEqual(One2many.import_data(
['name', 'one2many/name'],
[['Test', 'Test 1'], ['', 'Test 2']]), 1)
@with_transaction()
def test_one2many_many_rows(self):
"Test one2many many rows"
pool = Pool()
One2many = pool.get('test.import_data.one2many')
self.assertEqual(One2many.import_data(
['name', 'one2many/name'],
[
['Test 1', 'Test 1'],
['', 'Test 2'],
['Test 2', 'Test 1']]), 2)
@with_transaction()
def test_many_one2many(self):
"Test many one2many"
pool = Pool()
One2many = pool.get('test.import_data.one2manies')
self.assertEqual(One2many.import_data(
['name', 'one2many1/name', 'one2many2/name'],
[["Test", "Test 1", "Test 2"],
['', '', "Test 3"]]), 1)
record, = One2many.search([])
self.assertEqual(len(record.one2many1), 1)
self.assertEqual(len(record.one2many2), 2)
@with_transaction()
def test_many_one2many_empty_last(self):
"Test many one2many with empty last"
pool = Pool()
One2many = pool.get('test.import_data.one2manies')
self.assertEqual(One2many.import_data(
['name', 'one2many1/name', 'one2many2/name'],
[["Test", "Test 1", "Test 2"],
['', "Test 3", '']]), 1)
record, = One2many.search([])
self.assertEqual(len(record.one2many1), 2)
self.assertEqual(len(record.one2many2), 1)
@with_transaction()
def test_many_one2many_multiple_empty(self):
"Test many one2many with multiple empty"
pool = Pool()
One2many = pool.get('test.import_data.one2manies')
self.assertEqual(One2many.import_data(
['name', 'one2many1/name', 'one2many2/name'],
[["Test", "Test 1", "Test 2"],
['', "Test 3", ''],
['', '', "Test 4"]]), 1)
record, = One2many.search([])
self.assertEqual(len(record.one2many1), 2)
self.assertEqual(len(record.one2many2), 2)
@with_transaction()
def test_reference(self):
'Test reference'
pool = Pool()
Reference = pool.get('test.import_data.reference')
self.assertEqual(Reference.import_data(['reference'],
[['test.import_data.reference.selection,Test']]), 1)
reference, = Reference.search([])
self.assertEqual(reference.reference.__name__,
'test.import_data.reference.selection')
@with_transaction()
def test_reference_id(self):
"Test reference with id"
pool = Pool()
Reference = pool.get('test.import_data.reference')
self.assertEqual(Reference.import_data(['reference:id'],
[['test.import_data.reference.selection,'
'tests.import_data_reference_selection_test']]), 1)
reference, = Reference.search([])
self.assertEqual(reference.reference.__name__,
'test.import_data.reference.selection')
@with_transaction()
def test_reference_empty(self):
"Test reference empty"
pool = Pool()
Reference = pool.get('test.import_data.reference')
self.assertEqual(Reference.import_data(['reference'],
[['']]), 1)
reference, = Reference.search([])
self.assertEqual(reference.reference, None)
@with_transaction()
def test_reference_many_rows(self):
"Test reference many rows"
pool = Pool()
Reference = pool.get('test.import_data.reference')
self.assertEqual(Reference.import_data(['reference'],
[['test.import_data.reference.selection,Test'],
['test.import_data.reference.selection,Test']]), 2)
for reference in Reference.search([]):
self.assertEqual(reference.reference.__name__,
'test.import_data.reference.selection')
@with_transaction()
def test_reference_invalid(self):
"Test reference invalid value"
pool = Pool()
Reference = pool.get('test.import_data.reference')
for value in [
'test.import_data.reference.selection,foo',
'test.import_data.reference.selection,Duplicate',
'test.import_data.reference.selection,test.foo']:
with self.subTest(value=value):
with self.assertRaises(ImportDataError):
Reference.import_data(['reference'], [[value]])
@with_transaction()
def test_reference_id_invalid(self):
"Test reference invalid id"
pool = Pool()
Reference = pool.get('test.import_data.reference')
with self.assertRaises(ImportDataError):
Reference.import_data(
['reference:id'],
[['test.import_data.reference.selection,foo']])
@with_transaction()
def test_binary_bytes(self):
"Test binary bytes"
pool = Pool()
Binary = pool.get('test.import_data.binary')
self.assertEqual(Binary.import_data(['data'], [[b'data']]), 1)
record, = Binary.search([])
self.assertEqual(record.data, b'data')
@with_transaction()
def test_binary_base64(self):
"Test binary base64"
pool = Pool()
Binary = pool.get('test.import_data.binary')
self.assertEqual(Binary.import_data(['data'], [['ZGF0YQ==']]), 1)
record, = Binary.search([])
self.assertEqual(record.data, b'data')
@with_transaction()
def test_update_id(self):
"Test update with ID"
pool = Pool()
Char = pool.get('test.import_data.update')
record = Char(name="foo")
record.save()
count = Char.import_data(['id', 'name'], [[str(record.id), "bar"]])
record, = Char.search([])
self.assertEqual(count, 1)
self.assertEqual(record.name, "bar")
@with_transaction()
def test_update_rec_name(self):
"Test update with rec_name"
pool = Pool()
Char = pool.get('test.import_data.update')
record = Char(name="foo")
record.save()
count = Char.import_data(['id', 'name'], [[record.rec_name, "bar"]])
record, = Char.search([])
self.assertEqual(count, 1)
self.assertEqual(record.name, "bar")
@with_transaction()
def test_update_many2many(self):
"Test update many2many"
pool = Pool()
Many2many = pool.get('test.import_data.many2many')
Target = pool.get('test.import_data.many2many.target')
record = Many2many(many2many=[{'name': "Foo"}])
record.save()
target = Target(name="Bar")
target.save()
count = Many2many.import_data(
['id', 'many2many'],
[[record.id, "Bar"]])
self.assertEqual(count, 1)
self.assertEqual([m.name for m in record.many2many], ["Bar"])
@with_transaction()
def test_update_many2many_id(self):
"Test update many2many with id"
pool = Pool()
Many2many = pool.get('test.import_data.many2many')
record = Many2many(many2many=[{'name': "Foo"}])
record.save()
count = Many2many.import_data(
['id', 'many2many:id'],
[[record.id, 'tests.import_data_many2many_target_test1']])
self.assertEqual(count, 1)
self.assertEqual([m.name for m in record.many2many], ["Test 1"])
@with_transaction()
def test_update_one2many(self):
"Test update one2many"
pool = Pool()
One2many = pool.get('test.import_data.one2many')
Target = pool.get('test.import_data.one2many.target')
record = One2many(name="test", one2many=[
Target(name="foo"), Target(name="test")])
record.save()
target, _ = record.one2many
count = One2many.import_data(
['id', 'one2many/id', 'one2many/name'],
[[record.id, target.id, "bar"],
['', '', "baz"]])
self.assertEqual(count, 1)
self.assertEqual(len(record.one2many), 2)
self.assertEqual([t.name for t in record.one2many], ["bar", "baz"])
self.assertFalse(Target.search([('name', '=', "test")]))