OCA reporting engine fork for dev and update.
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.

409 lines
14 KiB

  1. # Copyright 2017-2019 Onestein (<https://www.onestein.eu>)
  2. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
  3. import json
  4. import odoo
  5. from odoo.tests.common import TransactionCase
  6. from odoo.exceptions import UserError, ValidationError
  7. from ..hooks import post_load, uninstall_hook
  8. class TestBiViewEditor(TransactionCase):
  9. def setUp(self):
  10. def _get_models(model_name_list):
  11. return (self.env['ir.model'].search([
  12. ('model', '=', name)
  13. ]) for name in model_name_list)
  14. def _get_fields(model_field_list):
  15. return (self.env['ir.model.fields'].search([
  16. ('model', '=', model_field[0]),
  17. ('name', '=', model_field[1])
  18. ], limit=1) for model_field in model_field_list)
  19. def get_new_field(self):
  20. return {
  21. 'model_id': self.partner_model.id,
  22. 'name': self.partner_field_name,
  23. 'id': self.partner_field.id,
  24. 'model': self.partner_model_name,
  25. 'type': self.partner_field.ttype,
  26. 'model_name': self.partner_model.name,
  27. 'description': self.partner_field.field_description
  28. }
  29. super().setUp()
  30. self.partner_model_name = 'res.partner'
  31. self.partner_field_name = 'name'
  32. self.partner_company_field_name = 'company_id'
  33. self.company_model_name = 'res.company'
  34. self.company_field_name = 'name'
  35. self.bi_view1 = None
  36. self.partner_model, self.company_model = _get_models(
  37. [self.partner_model_name, self.company_model_name])
  38. (self.partner_field,
  39. self.partner_company_field,
  40. self.company_field) = _get_fields([
  41. (self.partner_model_name, self.partner_field_name),
  42. (self.partner_model_name, self.partner_company_field_name),
  43. (self.company_model_name, self.company_field_name)])
  44. self.data = [{
  45. 'model_id': self.partner_model.id,
  46. 'model_name': self.partner_model.name,
  47. 'model': self.partner_model_name,
  48. 'type': self.partner_field.ttype,
  49. 'id': self.partner_field.id,
  50. 'description': self.partner_field.field_description,
  51. 'table_alias': 't0',
  52. 'row': 0,
  53. 'column': 1,
  54. 'list': 1,
  55. 'measure': 0
  56. }, {
  57. 'model_id': self.partner_model.id,
  58. 'table_alias': 't0',
  59. 'relation': self.company_model_name,
  60. 'model': self.partner_model_name,
  61. 'model_name': self.partner_model.name,
  62. 'type': self.partner_company_field.ttype,
  63. 'id': self.partner_company_field.id,
  64. 'join_node': 't1',
  65. 'description': self.partner_company_field.field_description,
  66. 'row': 0,
  67. 'column': 0,
  68. 'list': 1,
  69. 'measure': 0
  70. }, {
  71. 'model_id': self.company_model.id,
  72. 'model_name': self.company_model.name,
  73. 'model': self.company_model_name,
  74. 'type': self.company_field.ttype,
  75. 'id': self.company_field.id,
  76. 'description': self.company_field.field_description,
  77. 'table_alias': 't1',
  78. 'row': 1,
  79. 'column': 0,
  80. 'list': 0,
  81. 'measure': 0
  82. }]
  83. self.bi_view1_vals = {
  84. 'state': 'draft',
  85. 'data': json.dumps(self.data)
  86. }
  87. self.new_field = get_new_field(self)
  88. def test_01_get_fields(self):
  89. fields = self.env['ir.model'].get_fields(self.partner_model.id)
  90. self.assertIsInstance(fields, list)
  91. self.assertGreater(len(fields), 0)
  92. def test_02_get_join_nodes(self):
  93. field_res_users = self.env['ir.model.fields'].search([
  94. ('name', '=', 'login'),
  95. ('model', '=', 'res.users')
  96. ], limit=1)
  97. field_data = [{
  98. 'model_id': field_res_users.model_id.id,
  99. 'name': 'login',
  100. 'column': False,
  101. 'table_alias': 't0',
  102. 'measure': False,
  103. 'id': field_res_users.id,
  104. 'model': 'res.users',
  105. 'row': False,
  106. 'type': 'char',
  107. 'model_name': 'Users',
  108. 'description': 'Login'
  109. }]
  110. new_field = self.new_field
  111. nodes = self.env['ir.model'].get_join_nodes(field_data, new_field)
  112. self.assertIsInstance(nodes, list)
  113. self.assertGreater(len(nodes), 0)
  114. def test_03_get_join_nodes(self):
  115. new_field = self.new_field
  116. nodes = self.env['ir.model'].get_join_nodes([], new_field)
  117. self.assertIsInstance(nodes, list)
  118. self.assertEqual(len(nodes), 0)
  119. def test_04_get_related_models(self):
  120. all_models = self.env['ir.model'].get_models()
  121. self.assertIsInstance(all_models, list)
  122. self.assertGreater(len(all_models), 0)
  123. related_models = self.env['ir.model'].get_models({
  124. 't0': self.partner_model.id,
  125. 't1': self.company_model.id
  126. })
  127. self.assertIsInstance(related_models, list)
  128. self.assertGreater(len(related_models), 0)
  129. def test_05_create_copy_view(self):
  130. vals = self.bi_view1_vals
  131. vals.update({'name': 'Test View1'})
  132. # create
  133. bi_view1 = self.env['bve.view'].create(vals)
  134. self.assertIsNotNone(bi_view1)
  135. self.assertEqual(len(bi_view1), 1)
  136. self.assertEqual(bi_view1.state, 'draft')
  137. # copy
  138. bi_view2 = bi_view1.copy()
  139. self.assertEqual(bi_view2.name, 'Test View1 (copy)')
  140. def test_06_create_group_bve_object(self):
  141. vals = self.bi_view1_vals
  142. employees_group = self.env.ref('base.group_user')
  143. vals.update({
  144. 'name': 'Test View2',
  145. 'group_ids': [(6, 0, [employees_group.id])],
  146. })
  147. bi_view2 = self.env['bve.view'].create(vals)
  148. self.assertEqual(len(bi_view2.user_ids), len(employees_group.users))
  149. def test_07_check_empty_data(self):
  150. vals = {
  151. 'name': 'Test View Empty',
  152. 'state': 'draft',
  153. 'data': ''
  154. }
  155. bi_view4 = self.env['bve.view'].create(vals)
  156. self.assertEqual(len(bi_view4), 1)
  157. self.assertTrue(bi_view4.er_diagram_image)
  158. # create sql view
  159. with self.assertRaises(ValidationError):
  160. bi_view4.action_create()
  161. def test_08_get_models(self):
  162. models = self.env['ir.model'].get_models()
  163. self.assertIsInstance(models, list)
  164. self.assertGreater(len(models), 0)
  165. @odoo.tests.tagged('post_install', '-at_install')
  166. def test_09_create_open_bve_object(self):
  167. vals = self.bi_view1_vals
  168. employees_group = self.env.ref('base.group_user')
  169. vals.update({
  170. 'name': 'Test View4',
  171. 'group_ids': [(6, 0, [employees_group.id])],
  172. })
  173. bi_view = self.env['bve.view'].create(vals)
  174. self.assertEqual(len(bi_view), 1)
  175. self.assertEqual(len(bi_view.line_ids), 3)
  176. self.assertTrue(bi_view.er_diagram_image)
  177. # check lines
  178. line1 = bi_view.line_ids[0]
  179. line2 = bi_view.line_ids[1]
  180. line3 = bi_view.line_ids[2]
  181. self.assertTrue(line1.in_list)
  182. self.assertTrue(line2.in_list)
  183. self.assertFalse(line3.in_list)
  184. self.assertFalse(line1.row)
  185. self.assertTrue(line1.column)
  186. self.assertFalse(line1.measure)
  187. self.assertFalse(line2.row)
  188. self.assertFalse(line2.column)
  189. self.assertFalse(line2.measure)
  190. self.assertTrue(line3.row)
  191. self.assertFalse(line3.column)
  192. self.assertFalse(line3.measure)
  193. # create bve object
  194. bi_view.action_create()
  195. model = self.env['ir.model'].search([
  196. ('model', '=', 'x_bve.testview4'),
  197. ('name', '=', 'Test View4')
  198. ])
  199. self.assertEqual(len(model), 1)
  200. # open view
  201. open_action = bi_view.open_view()
  202. self.assertEqual(isinstance(open_action, dict), True)
  203. self.assertEqual(bi_view.state, 'created')
  204. # try to remove view
  205. with self.assertRaises(UserError):
  206. bi_view.unlink()
  207. # reset to draft
  208. bi_view.action_reset()
  209. self.assertEqual(bi_view.state, 'draft')
  210. # remove view
  211. bi_view.unlink()
  212. @odoo.tests.tagged('post_install', '-at_install')
  213. def test_10_create_open_bve_object_apostrophe(self):
  214. vals = self.bi_view1_vals
  215. vals.update({
  216. 'name': "Test View5",
  217. })
  218. data_list = list()
  219. for r in json.loads(vals['data']):
  220. r['model_name'] = "model'name"
  221. data_list.append(r)
  222. new_format_data = json.dumps(data_list)
  223. vals.update({'data': new_format_data})
  224. bi_view = self.env['bve.view'].create(vals)
  225. self.assertEqual(len(bi_view), 1)
  226. # create bve object
  227. bi_view.action_create()
  228. def test_11_clean_nodes(self):
  229. data_dict1 = {
  230. 'sequence': 1,
  231. 'model_id': 74,
  232. 'id': 858,
  233. 'name': 'name',
  234. 'model_name': 'Contact',
  235. 'model': 'res.partner',
  236. 'type': 'char',
  237. 'table_alias': 't74',
  238. 'description': 'Name',
  239. 'row': False,
  240. 'column': False,
  241. 'measure': False,
  242. 'list': True,
  243. }
  244. data_dict2 = {
  245. 'sequence': 2,
  246. 'model_id': 74,
  247. 'id': 896,
  248. 'name': 'company_id',
  249. 'model_name': 'Contact',
  250. 'model': 'res.partner',
  251. 'type': 'many2one',
  252. 'table_alias': 't74',
  253. 'description': 'Company',
  254. 'row': False,
  255. 'column': False,
  256. 'measure': False,
  257. 'list': True,
  258. 'join_node': 't83',
  259. 'relation': 'res.company',
  260. 'join_left': False
  261. }
  262. old_data = json.dumps([data_dict1, data_dict2])
  263. new_data = self.env['bve.view'].get_clean_list(old_data)
  264. new_data_dict = json.loads(new_data)
  265. self.assertEqual(len(new_data_dict), 1)
  266. for key in data_dict1.keys():
  267. self.assertEqual(new_data_dict[0][key], data_dict1[key])
  268. def test_12_check_groups(self):
  269. vals = self.bi_view1_vals
  270. group_system = self.env.ref('base.group_system')
  271. vals.update({
  272. 'name': 'Test View1',
  273. 'group_ids': [(6, 0, [group_system.id])],
  274. })
  275. bi_view1 = self.env['bve.view'].create(vals)
  276. with self.assertRaises(UserError):
  277. bi_view1.action_create()
  278. def test_13_check_lines_missing_model(self):
  279. vals = self.bi_view1_vals
  280. group_user = self.env.ref('base.group_user')
  281. vals.update({
  282. 'name': 'Test View1',
  283. 'group_ids': [(6, 0, [group_user.id])],
  284. })
  285. bi_view1 = self.env['bve.view'].create(vals)
  286. for line in bi_view1.line_ids:
  287. self.assertTrue(line.model_id)
  288. self.assertTrue(line.model_name)
  289. self.env.cr.execute('UPDATE bve_view_line SET model_id = null')
  290. bi_view1.invalidate_cache()
  291. for line in bi_view1.line_ids:
  292. self.assertFalse(line.model_id)
  293. self.assertTrue(line.model_name)
  294. with self.assertRaises(ValidationError):
  295. bi_view1.action_create()
  296. def test_14_check_lines_missing_fieldl(self):
  297. vals = self.bi_view1_vals
  298. group_user = self.env.ref('base.group_user')
  299. vals.update({
  300. 'name': 'Test View1',
  301. 'group_ids': [(6, 0, [group_user.id])],
  302. })
  303. bi_view1 = self.env['bve.view'].create(vals)
  304. for line in bi_view1.line_ids:
  305. self.assertTrue(line.field_id)
  306. self.assertTrue(line.field_name)
  307. self.env.cr.execute('UPDATE bve_view_line SET field_id = null')
  308. bi_view1.invalidate_cache()
  309. for line in bi_view1.line_ids:
  310. self.assertFalse(line.field_id)
  311. self.assertTrue(line.field_name)
  312. with self.assertRaises(ValidationError):
  313. bi_view1.action_create()
  314. def test_15_create_lines(self):
  315. vals = self.bi_view1_vals
  316. vals.update({'name': 'Test View1'})
  317. bi_view1 = self.env['bve.view'].create(vals)
  318. bi_view1._compute_serialized_data()
  319. data = json.loads(bi_view1.data)
  320. self.assertTrue(data)
  321. self.assertTrue(isinstance(data, list))
  322. def test_16_post_load(self):
  323. post_load()
  324. def test_17_uninstall_hook(self):
  325. uninstall_hook(self.cr, self.env)
  326. def test_18_action_translations(self):
  327. self.env['res.lang'].load_lang('it_IT')
  328. vals = self.bi_view1_vals
  329. vals.update({'name': 'Test View1'})
  330. bi_view1 = self.env['bve.view'].create(vals)
  331. res = bi_view1.action_translations()
  332. self.assertFalse(res)
  333. bi_view1.action_create()
  334. res = bi_view1.action_translations()
  335. self.assertTrue(res)
  336. @odoo.tests.tagged('post_install', '-at_install')
  337. def test_19_field_selection(self):
  338. field = self.env['ir.model.fields'].search([
  339. ('model', '=', self.company_model_name),
  340. ('name', '=', 'base_onboarding_company_state')
  341. ], limit=1)
  342. selection_data = [{
  343. 'model_id': self.company_model.id,
  344. 'model_name': self.company_model.name,
  345. 'model': self.company_model_name,
  346. 'type': field.ttype,
  347. 'id': field.id,
  348. 'description': 'State of the onboarding company step',
  349. 'table_alias': 't1',
  350. 'row': 0,
  351. 'column': 0,
  352. 'list': 1,
  353. 'measure': 0
  354. }]
  355. vals = {
  356. 'state': 'draft',
  357. 'data': json.dumps(self.data + selection_data)
  358. }
  359. vals.update({'name': 'Test View6'})
  360. bi_view1 = self.env['bve.view'].create(vals)
  361. bi_view1.action_create()
  362. self.assertEqual(len(bi_view1.line_ids), 4)