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.

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