You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
5.7 KiB
130 lines
5.7 KiB
# -*- coding: utf-8 -*-
|
|
# Copyright 2017-2018 Therp BV <http://therp.nl>
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
from mock import patch
|
|
from odoo.tests.common import TransactionCase, post_install, at_install
|
|
from ..models.import_odoo_database import ImportContext, field_context
|
|
|
|
|
|
class TestBaseImportOdoo(TransactionCase):
|
|
def setUp(self):
|
|
super(TestBaseImportOdoo, self).setUp()
|
|
# if our tests run with an accounting scheme, it will fail on accounts
|
|
# to fix this, if the account model exists, we create mappings for it
|
|
if 'account.account' in self.env.registry:
|
|
self.env.ref('base_import_odoo.demodb').write({
|
|
'import_field_mappings': [
|
|
(
|
|
0, False,
|
|
{
|
|
'mapping_type': 'fixed',
|
|
'model_id':
|
|
self.env.ref('account.model_account_account').id,
|
|
'local_id': account.id,
|
|
'remote_id': account.id,
|
|
},
|
|
)
|
|
for account in self.env['account.account'].search([])
|
|
],
|
|
})
|
|
|
|
@at_install(False)
|
|
@post_install(True)
|
|
@patch(
|
|
'odoorpc.ODOO.__init__',
|
|
side_effect=lambda self, *args, **kwargs: None,
|
|
)
|
|
@patch('odoorpc.ODOO.login', side_effect=lambda *args: None)
|
|
def test_base_import_odoo(self, mock_client, mock_client_login):
|
|
# the mocked functions simply search/read in the current database
|
|
# the effect then should be that the models in question are duplicated,
|
|
# we just need to try not to be confused by the fact that local and
|
|
# remote ids are the same
|
|
def _mock_execute(model, method, *args):
|
|
if method == 'read':
|
|
return self.env[model].browse(args[0]).read(args[1])
|
|
if method == 'search':
|
|
return self.env[model].search(args[0]).ids
|
|
|
|
group_count = self.env['res.groups'].search([], count=True)
|
|
user_count = self.env['res.users'].search([], count=True)
|
|
run = 1
|
|
for dummy in range(2):
|
|
# we run this two times to enter the code path where xmlids exist
|
|
self.env.ref('base_import_odoo.demodb').write({
|
|
'password': 'admin',
|
|
})
|
|
with patch('odoorpc.ODOO.execute', side_effect=_mock_execute):
|
|
self.env.ref('base_import_odoo.demodb')._run_import()
|
|
# here the actual test begins - check that we created new
|
|
# objects, check xmlids, check values, check if dummies are
|
|
# cleaned up/replaced
|
|
imported_user = self.env.ref(self._get_xmlid('base.user_demo'))
|
|
user = self.env.ref('base.user_demo')
|
|
self.assertNotEqual(imported_user, user)
|
|
# check that the imported scalars are equal
|
|
fields = ['name', 'email', 'signature', 'active']
|
|
(imported_user + user).read(fields)
|
|
self.assertEqual(
|
|
self._get_cache(self._get_xmlid('base.user_demo'), fields),
|
|
self._get_cache('base.user_demo', fields),
|
|
)
|
|
# check that links are correctly mapped
|
|
self.assertEqual(
|
|
imported_user.partner_id,
|
|
self.env.ref(self._get_xmlid('base.partner_demo'))
|
|
)
|
|
# no new groups because they should be mapped by name
|
|
self.assertEqual(
|
|
group_count, self.env['res.groups'].search([], count=True)
|
|
)
|
|
# all users save for root should be duplicated for every run
|
|
self.assertEqual(
|
|
self.env['res.users'].search([], count=True),
|
|
user_count + (user_count - 1) * run,
|
|
)
|
|
# check that there's a new attachment
|
|
attachment = self.env.ref('base_import_odoo.attachment_demo')
|
|
imported_attachment = self.env['ir.attachment'].search([
|
|
('res_model', '=', 'res.users'),
|
|
('res_id', '=', imported_user.id),
|
|
])
|
|
self.assertTrue(attachment)
|
|
self.assertEqual(attachment.datas, imported_attachment.datas)
|
|
self.assertNotEqual(attachment, imported_attachment)
|
|
run += 1
|
|
demodb = self.env.ref('base_import_odoo.demodb')
|
|
for line in demodb.import_line_ids:
|
|
self.assertIn(line.model_id.model, demodb.status_html)
|
|
demodb.action_import()
|
|
self.assertTrue(demodb.cronjob_id)
|
|
demodb.cronjob_id.write({'active': False})
|
|
demodb.action_import()
|
|
self.assertTrue(demodb.cronjob_id.active)
|
|
self.assertFalse(demodb.cronjob_running)
|
|
# in our setting we won't get dummies, so we test this manually
|
|
import_context = ImportContext(
|
|
None, self.env.ref('base_import_odoo.model_partner'),
|
|
[], {}, {}, [], {}, field_context(None, None, None)
|
|
)
|
|
dummy_id = demodb._run_import_create_dummy(
|
|
import_context, self.env['res.partner'], {'id': 424242},
|
|
forcecreate=True,
|
|
)
|
|
self.assertTrue(self.env['res.partner'].browse(dummy_id).exists())
|
|
|
|
def _get_xmlid(self, remote_xmlid):
|
|
remote_obj = self.env.ref(remote_xmlid)
|
|
return 'base_import_odoo.%d-%s-%s' % (
|
|
self.env.ref('base_import_odoo.demodb').id,
|
|
remote_obj._name.replace('.', '_'),
|
|
remote_obj.id,
|
|
)
|
|
|
|
def _get_cache(self, xmlid, fields):
|
|
record = self.env.ref(xmlid)
|
|
return {
|
|
field_name: record._cache[field_name]
|
|
for field_name in record._fields
|
|
if field_name in fields
|
|
}
|