Move workflow method in ModelWorkflow Move workflow service in workflow module Remove Service and LocalService Remove web_service and use a dispatcher in protocols New netrpc/xmlrpc syntax to be easier to introspect
258 lines
8.0 KiB
Python
258 lines
8.0 KiB
Python
#!/usr/bin/env 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 sys, os
|
|
DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
|
|
'..', '..', '..', 'trytond')))
|
|
if os.path.isdir(DIR):
|
|
sys.path.insert(0, os.path.dirname(DIR))
|
|
|
|
import unittest
|
|
import time
|
|
from trytond import pysocket
|
|
|
|
ADMIN_PASSWORD = 'admin'
|
|
HOST = '127.0.0.1'
|
|
PORT = '8070'
|
|
DB_NAME = 'test_' + str(int(time.time()))
|
|
USERNAME = 'admin'
|
|
PASSWORD = 'admin'
|
|
CONTEXT = {}
|
|
USER = None
|
|
SESSION = None
|
|
|
|
SOCK = pysocket.PySocket()
|
|
SOCK.connect(HOST, PORT)
|
|
|
|
class DBTestCase(unittest.TestCase):
|
|
'''
|
|
Test DB service.
|
|
'''
|
|
|
|
def test0010create(self):
|
|
'''
|
|
Create database.
|
|
'''
|
|
SOCK.send((None, None, None, 'common', 'db', 'create', DB_NAME,
|
|
ADMIN_PASSWORD, 'en_US', PASSWORD))
|
|
res = SOCK.receive()
|
|
self.assert_(res)
|
|
|
|
def test0020list(self):
|
|
'''
|
|
List databases.
|
|
'''
|
|
SOCK.send((None, None, None, 'common', 'db', 'list'))
|
|
res = SOCK.receive()
|
|
self.assert_(DB_NAME in res)
|
|
|
|
def test0030login(self):
|
|
'''
|
|
Login.
|
|
'''
|
|
login()
|
|
|
|
|
|
class MPTTTestCase(unittest.TestCase):
|
|
'''
|
|
Test Modified Preorder Tree Traversal.
|
|
'''
|
|
|
|
def setUp(self):
|
|
install_module('tests')
|
|
self.mptt = RPCProxy('tests.mptt')
|
|
|
|
def CheckTree(self, parent_id=False, left=0, right=0):
|
|
child_ids = self.mptt.search([
|
|
('parent', '=', parent_id),
|
|
], 0, None, None, CONTEXT)
|
|
childs = self.mptt.read(child_ids, ['left', 'right'], CONTEXT)
|
|
for child in childs:
|
|
if child['left'] <= left:
|
|
raise Exception('Record (%d): left %d <= parent left %d' % \
|
|
(child['id'], child['left'], left))
|
|
if child['left'] >= child['right']:
|
|
raise Exception('Record (%d): left %d >= right %d' % \
|
|
(child['id'], child['left'], child['right']))
|
|
if right != 0 and child['right'] >= right:
|
|
raise Exception('Record (%d): right %d >= parent right %d' % \
|
|
(child['id'], child['right'], right))
|
|
self.CheckTree(child['id'], left=child['left'],
|
|
right=child['right'])
|
|
next_left = 0
|
|
for child in childs:
|
|
if child['left'] <= next_left:
|
|
raise Exception('Record (%d): left %d <= next left %d' % \
|
|
(child['id'], child['left'], next_left))
|
|
next_left = child['right']
|
|
childs.reverse()
|
|
previous_right = 0
|
|
for child in childs:
|
|
if previous_right != 0 and child['right'] >= previous_right:
|
|
raise Exception('Record (%d): right %d >= previous right %d' % \
|
|
(child['id'] , child['right'], previous_right))
|
|
previous_right = child['left']
|
|
|
|
def test0010create(self):
|
|
'''
|
|
Create tree.
|
|
'''
|
|
new_records = [False]
|
|
for j in range(3):
|
|
parent_records = new_records
|
|
new_records = []
|
|
k = 0
|
|
for parent_record in parent_records:
|
|
for i in range(3):
|
|
record_id = self.mptt.create({
|
|
'name': 'Test %d %d %d' % (j, k, i),
|
|
'parent': parent_record,
|
|
}, CONTEXT)
|
|
new_records.append(record_id)
|
|
k += 1
|
|
self.assertRaises(Exception, self.CheckTree())
|
|
|
|
def test0020reorder(self):
|
|
'''
|
|
Re-order.
|
|
'''
|
|
def reorder(parent_id=False):
|
|
record_ids = self.mptt.search([
|
|
('parent', '=', parent_id),
|
|
], CONTEXT)
|
|
if not record_ids:
|
|
return
|
|
i = len(record_ids)
|
|
for record_id in record_ids:
|
|
self.mptt.write(record_id, {
|
|
'sequence': i,
|
|
}, CONTEXT)
|
|
i -= 1
|
|
self.assertRaises(Exception, self.CheckTree())
|
|
i = 0
|
|
for record_id in record_ids:
|
|
self.mptt.write(record_id, {
|
|
'sequence': i,
|
|
}, CONTEXT)
|
|
i += 1
|
|
self.assertRaises(Exception, self.CheckTree())
|
|
for record_id in record_ids:
|
|
reorder(record_id)
|
|
reorder()
|
|
record_ids = self.mptt.search([], CONTEXT)
|
|
self.mptt.write(record_ids, {
|
|
'sequence': 0,
|
|
}, CONTEXT)
|
|
self.assertRaises(Exception, self.CheckTree())
|
|
|
|
def test0030reparent(self):
|
|
'''
|
|
Re-parent.
|
|
'''
|
|
def reparent(parent_id=False):
|
|
record_ids = self.mptt.search([
|
|
('parent', '=', parent_id),
|
|
], CONTEXT)
|
|
if not record_ids:
|
|
return
|
|
for record_id in record_ids:
|
|
for record2_id in record_ids:
|
|
if record_id != record2_id:
|
|
self.mptt.write(record_id, {
|
|
'parent': record2_id,
|
|
}, CONTEXT)
|
|
self.assertRaises(Exception, self.CheckTree())
|
|
self.mptt.write(record_id, {
|
|
'parent': parent_id,
|
|
}, CONTEXT)
|
|
self.assertRaises(Exception, self.CheckTree())
|
|
for record_id in record_ids:
|
|
reparent(record_id)
|
|
reparent()
|
|
|
|
def test0040delete(self):
|
|
'''
|
|
Delete.
|
|
'''
|
|
record_ids = self.mptt.search([], CONTEXT)
|
|
for record_id in record_ids:
|
|
if record_id % 2:
|
|
self.mptt.delete(record_id, CONTEXT)
|
|
self.assertRaises(Exception, self.CheckTree())
|
|
record_ids = self.mptt.search([], CONTEXT)
|
|
self.mptt.delete(record_ids[:len(record_ids)/2], CONTEXT)
|
|
self.assertRaises(Exception, self.CheckTree())
|
|
record_ids = self.mptt.search([], CONTEXT)
|
|
self.mptt.delete(record_ids, CONTEXT)
|
|
self.assertRaises(Exception, self.CheckTree())
|
|
|
|
|
|
class RPCProxy(object):
|
|
|
|
def __init__(self, name):
|
|
self.name = name
|
|
self.__attrs = {}
|
|
|
|
def __getattr__(self, attr):
|
|
if attr not in self.__attrs:
|
|
self.__attrs[attr] = RPCFunction(self.name, attr)
|
|
return self.__attrs[attr]
|
|
|
|
|
|
class RPCFunction(object):
|
|
|
|
def __init__(self, name, func_name):
|
|
self.name = name
|
|
self.func_name = func_name
|
|
|
|
def __call__(self, *args):
|
|
SOCK.send((DB_NAME, USER, SESSION, 'model', self.name, self.func_name) \
|
|
+ args)
|
|
res = SOCK.receive()
|
|
return res
|
|
|
|
def login():
|
|
global USER, SESSION, CONTEXT
|
|
SOCK.send((DB_NAME, USERNAME, PASSWORD, 'common', 'db', 'login'))
|
|
USER, SESSION = SOCK.receive()
|
|
user = RPCProxy('res.user')
|
|
context = user.get_preferences(True, {})
|
|
for i in context:
|
|
value = context[i]
|
|
CONTEXT[i] = value
|
|
|
|
def install_module(name):
|
|
module = RPCProxy('ir.module.module')
|
|
module_ids = module.search([
|
|
('name', '=', name),
|
|
('state', '!=', 'installed'),
|
|
])
|
|
|
|
if not module_ids:
|
|
return
|
|
|
|
module.button_install(module_ids, CONTEXT)
|
|
|
|
SOCK.send((DB_NAME, USER, SESSION, 'wizard',
|
|
'ir.module.module.install_upgrade', 'create'))
|
|
wiz_id = SOCK.receive()
|
|
|
|
SOCK.send((DB_NAME, USER, SESSION, 'wizard',
|
|
'ir.module.module.install_upgrade', 'execute', wiz_id, {}, 'start',
|
|
CONTEXT))
|
|
SOCK.receive()
|
|
|
|
SOCK.send((DB_NAME, USER, SESSION, 'wizard',
|
|
'ir.module.module.install_upgrade', 'delete', wiz_id))
|
|
SOCK.receive()
|
|
|
|
def suite():
|
|
return unittest.TestLoader().loadTestsFromTestCase(DBTestCase)
|
|
|
|
if __name__ == '__main__':
|
|
suite = suite()
|
|
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(MPTTTestCase))
|
|
unittest.TextTestRunner(verbosity=2).run(suite)
|
|
SOCK.disconnect()
|