# Copyright 2017-2019 Onestein () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). import json import odoo from odoo.tests.common import TransactionCase from odoo.exceptions import UserError, ValidationError from ..hooks import post_load, uninstall_hook class TestBiViewEditor(TransactionCase): def setUp(self): def _get_models(model_name_list): return (self.env['ir.model'].search([ ('model', '=', name) ]) for name in model_name_list) def _get_fields(model_field_list): return (self.env['ir.model.fields'].search([ ('model', '=', model_field[0]), ('name', '=', model_field[1]) ], limit=1) for model_field in model_field_list) def get_new_field(self): return { 'model_id': self.partner_model.id, 'name': self.partner_field_name, 'id': self.partner_field.id, 'model': self.partner_model_name, 'type': self.partner_field.ttype, 'model_name': self.partner_model.name, 'description': self.partner_field.field_description } super().setUp() self.partner_model_name = 'res.partner' self.partner_field_name = 'name' self.partner_company_field_name = 'company_id' self.company_model_name = 'res.company' self.company_field_name = 'name' self.bi_view1 = None self.partner_model, self.company_model = _get_models( [self.partner_model_name, self.company_model_name]) (self.partner_field, self.partner_company_field, self.company_field) = _get_fields([ (self.partner_model_name, self.partner_field_name), (self.partner_model_name, self.partner_company_field_name), (self.company_model_name, self.company_field_name)]) self.data = [{ 'model_id': self.partner_model.id, 'model_name': self.partner_model.name, 'model': self.partner_model_name, 'type': self.partner_field.ttype, 'id': self.partner_field.id, 'description': self.partner_field.field_description, 'table_alias': 't0', 'row': 0, 'column': 1, 'list': 1, 'measure': 0 }, { 'model_id': self.partner_model.id, 'table_alias': 't0', 'relation': self.company_model_name, 'model': self.partner_model_name, 'model_name': self.partner_model.name, 'type': self.partner_company_field.ttype, 'id': self.partner_company_field.id, 'join_node': 't1', 'description': self.partner_company_field.field_description, 'row': 0, 'column': 0, 'list': 1, 'measure': 0 }, { 'model_id': self.company_model.id, 'model_name': self.company_model.name, 'model': self.company_model_name, 'type': self.company_field.ttype, 'id': self.company_field.id, 'description': self.company_field.field_description, 'table_alias': 't1', 'row': 1, 'column': 0, 'list': 0, 'measure': 0 }] self.bi_view1_vals = { 'state': 'draft', 'data': json.dumps(self.data) } self.new_field = get_new_field(self) def test_01_get_fields(self): fields = self.env['ir.model'].get_fields(self.partner_model.id) self.assertIsInstance(fields, list) self.assertGreater(len(fields), 0) def test_02_get_join_nodes(self): field_res_users = self.env['ir.model.fields'].search([ ('name', '=', 'login'), ('model', '=', 'res.users') ], limit=1) field_data = [{ 'model_id': field_res_users.model_id.id, 'name': 'login', 'column': False, 'table_alias': 't0', 'measure': False, 'id': field_res_users.id, 'model': 'res.users', 'row': False, 'type': 'char', 'model_name': 'Users', 'description': 'Login' }] new_field = self.new_field nodes = self.env['ir.model'].get_join_nodes(field_data, new_field) self.assertIsInstance(nodes, list) self.assertGreater(len(nodes), 0) def test_03_get_join_nodes(self): new_field = self.new_field nodes = self.env['ir.model'].get_join_nodes([], new_field) self.assertIsInstance(nodes, list) self.assertEqual(len(nodes), 0) def test_04_get_related_models(self): all_models = self.env['ir.model'].get_models() self.assertIsInstance(all_models, list) self.assertGreater(len(all_models), 0) related_models = self.env['ir.model'].get_models({ 't0': self.partner_model.id, 't1': self.company_model.id }) self.assertIsInstance(related_models, list) self.assertGreater(len(related_models), 0) def test_05_create_copy_view(self): vals = self.bi_view1_vals vals.update({'name': 'Test View1'}) # create bi_view1 = self.env['bve.view'].create(vals) self.assertIsNotNone(bi_view1) self.assertEqual(len(bi_view1), 1) self.assertEqual(bi_view1.state, 'draft') # copy bi_view2 = bi_view1.copy() self.assertEqual(bi_view2.name, 'Test View1 (copy)') def test_06_create_group_bve_object(self): vals = self.bi_view1_vals employees_group = self.env.ref('base.group_user') vals.update({ 'name': 'Test View2', 'group_ids': [(6, 0, [employees_group.id])], }) bi_view2 = self.env['bve.view'].create(vals) self.assertEqual(len(bi_view2.user_ids), len(employees_group.users)) def test_07_check_empty_data(self): vals = { 'name': 'Test View Empty', 'state': 'draft', 'data': '' } bi_view4 = self.env['bve.view'].create(vals) self.assertEqual(len(bi_view4), 1) self.assertTrue(bi_view4.er_diagram_image) # create sql view with self.assertRaises(ValidationError): bi_view4.action_create() def test_08_get_models(self): models = self.env['ir.model'].get_models() self.assertIsInstance(models, list) self.assertGreater(len(models), 0) @odoo.tests.tagged('post_install', '-at_install') def test_09_create_open_bve_object(self): vals = self.bi_view1_vals employees_group = self.env.ref('base.group_user') vals.update({ 'name': 'Test View4', 'group_ids': [(6, 0, [employees_group.id])], }) bi_view = self.env['bve.view'].create(vals) self.assertEqual(len(bi_view), 1) self.assertEqual(len(bi_view.line_ids), 3) self.assertTrue(bi_view.er_diagram_image) # check lines line1 = bi_view.line_ids[0] line2 = bi_view.line_ids[1] line3 = bi_view.line_ids[2] self.assertTrue(line1.in_list) self.assertTrue(line2.in_list) self.assertFalse(line3.in_list) self.assertFalse(line1.row) self.assertTrue(line1.column) self.assertFalse(line1.measure) self.assertFalse(line2.row) self.assertFalse(line2.column) self.assertFalse(line2.measure) self.assertTrue(line3.row) self.assertFalse(line3.column) self.assertFalse(line3.measure) # create bve object bi_view.action_create() model = self.env['ir.model'].search([ ('model', '=', 'x_bve.testview4'), ('name', '=', 'Test View4') ]) self.assertEqual(len(model), 1) # open view open_action = bi_view.open_view() self.assertEqual(isinstance(open_action, dict), True) self.assertEqual(bi_view.state, 'created') # try to remove view with self.assertRaises(UserError): bi_view.unlink() # reset to draft bi_view.action_reset() self.assertEqual(bi_view.state, 'draft') # remove view bi_view.unlink() @odoo.tests.tagged('post_install', '-at_install') def test_10_create_open_bve_object_apostrophe(self): vals = self.bi_view1_vals vals.update({ 'name': "Test View5", }) data_list = list() for r in json.loads(vals['data']): r['model_name'] = "model'name" data_list.append(r) new_format_data = json.dumps(data_list) vals.update({'data': new_format_data}) bi_view = self.env['bve.view'].create(vals) self.assertEqual(len(bi_view), 1) # create bve object bi_view.action_create() def test_11_clean_nodes(self): data_dict1 = { 'sequence': 1, 'model_id': 74, 'id': 858, 'name': 'name', 'model_name': 'Contact', 'model': 'res.partner', 'type': 'char', 'table_alias': 't74', 'description': 'Name', 'row': False, 'column': False, 'measure': False, 'list': True, } data_dict2 = { 'sequence': 2, 'model_id': 74, 'id': 896, 'name': 'company_id', 'model_name': 'Contact', 'model': 'res.partner', 'type': 'many2one', 'table_alias': 't74', 'description': 'Company', 'row': False, 'column': False, 'measure': False, 'list': True, 'join_node': 't83', 'relation': 'res.company', 'join_left': False } old_data = json.dumps([data_dict1, data_dict2]) new_data = self.env['bve.view'].get_clean_list(old_data) new_data_dict = json.loads(new_data) self.assertEqual(len(new_data_dict), 1) for key in data_dict1.keys(): self.assertEqual(new_data_dict[0][key], data_dict1[key]) def test_12_check_groups(self): vals = self.bi_view1_vals group_system = self.env.ref('base.group_system') vals.update({ 'name': 'Test View1', 'group_ids': [(6, 0, [group_system.id])], }) bi_view1 = self.env['bve.view'].create(vals) with self.assertRaises(UserError): bi_view1.action_create() def test_13_check_lines_missing_model(self): vals = self.bi_view1_vals group_user = self.env.ref('base.group_user') vals.update({ 'name': 'Test View1', 'group_ids': [(6, 0, [group_user.id])], }) bi_view1 = self.env['bve.view'].create(vals) for line in bi_view1.line_ids: self.assertTrue(line.model_id) self.assertTrue(line.model_name) self.env.cr.execute('UPDATE bve_view_line SET model_id = null') bi_view1.invalidate_cache() for line in bi_view1.line_ids: self.assertFalse(line.model_id) self.assertTrue(line.model_name) with self.assertRaises(ValidationError): bi_view1.action_create() def test_14_check_lines_missing_fieldl(self): vals = self.bi_view1_vals group_user = self.env.ref('base.group_user') vals.update({ 'name': 'Test View1', 'group_ids': [(6, 0, [group_user.id])], }) bi_view1 = self.env['bve.view'].create(vals) for line in bi_view1.line_ids: self.assertTrue(line.field_id) self.assertTrue(line.field_name) self.env.cr.execute('UPDATE bve_view_line SET field_id = null') bi_view1.invalidate_cache() for line in bi_view1.line_ids: self.assertFalse(line.field_id) self.assertTrue(line.field_name) with self.assertRaises(ValidationError): bi_view1.action_create() def test_15_create_lines(self): vals = self.bi_view1_vals vals.update({'name': 'Test View1'}) bi_view1 = self.env['bve.view'].create(vals) bi_view1._compute_serialized_data() data = json.loads(bi_view1.data) self.assertTrue(data) self.assertTrue(isinstance(data, list)) def test_16_post_load(self): post_load() def test_17_uninstall_hook(self): uninstall_hook(self.cr, self.env) def test_18_action_translations(self): self.env['res.lang'].load_lang('it_IT') vals = self.bi_view1_vals vals.update({'name': 'Test View1'}) bi_view1 = self.env['bve.view'].create(vals) res = bi_view1.action_translations() self.assertFalse(res) bi_view1.action_create() res = bi_view1.action_translations() self.assertTrue(res) @odoo.tests.tagged('post_install', '-at_install') def test_19_field_selection(self): field = self.env['ir.model.fields'].search([ ('model', '=', self.company_model_name), ('name', '=', 'base_onboarding_company_state') ], limit=1) selection_data = [{ 'model_id': self.company_model.id, 'model_name': self.company_model.name, 'model': self.company_model_name, 'type': field.ttype, 'id': field.id, 'description': 'State of the onboarding company step', 'table_alias': 't1', 'row': 0, 'column': 0, 'list': 1, 'measure': 0 }] vals = { 'state': 'draft', 'data': json.dumps(self.data + selection_data) } vals.update({'name': 'Test View6'}) bi_view1 = self.env['bve.view'].create(vals) bi_view1.action_create() self.assertEqual(len(bi_view1.line_ids), 4)