No Description
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.

test_lerelation.py 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. """
  2. Tests for _LeRelation object family
  3. """
  4. import unittest
  5. from unittest import TestCase
  6. from unittest.mock import patch
  7. from collections import OrderedDict
  8. import EditorialModel
  9. import DataSource.dummy
  10. import leapi
  11. import leapi.test.utils
  12. import leapi.lecrud as lecrud
  13. from leapi.lecrud import _LeCrud
  14. class LeRelationTestCase(TestCase):
  15. @classmethod
  16. def setUpClass(cls):
  17. """ Write the generated code in a temporary directory and import it """
  18. cls.tmpdir = leapi.test.utils.tmp_load_factory_code()
  19. @classmethod
  20. def tearDownClass(cls):
  21. """ Remove the temporary directory created at class setup """
  22. leapi.test.utils.cleanup(cls.tmpdir)
  23. def test_prepare_filters(self):
  24. """ Testing the _prepare_filters() method """
  25. from dyncode import Numero, LeObject, LeRelation
  26. filters = [
  27. (
  28. 'rank = 1',
  29. ('rank', '=', '1')
  30. ),
  31. (
  32. 'nature = "parent"',
  33. ('nature', '=', '"parent"')
  34. ),
  35. (
  36. 'lesup = 21',
  37. ('lesup', '=', LeObject(21))
  38. ),
  39. (
  40. 'lesub = 22',
  41. ('lesub', '=', LeObject(22))
  42. ),
  43. (
  44. ('rank', '=', '1'),
  45. ('rank', '=', '1'),
  46. ),
  47. (
  48. ('lesup', '=', LeObject(21)),
  49. ('lesup', '=', LeObject(21)),
  50. ),
  51. (
  52. ('lesub', '=', Numero(42)),
  53. ('lesub', '=', Numero(42)),
  54. ),
  55. ]
  56. for filter_arg, filter_res in filters:
  57. res, rel_res = LeRelation._prepare_filters([filter_arg])
  58. self.assertEqual(len(res), 1)
  59. self.assertEqual(len(rel_res), 0)
  60. res = res[0]
  61. for i in range(3):
  62. self.assertEqual(filter_res[i], res[i], "%s != %s"%(filter_res, res))
  63. @patch('DataSource.dummy.leapidatasource.DummyDatasource.delete')
  64. def test_delete(self, dsmock):
  65. """ Testing LeHierarch insert method """
  66. from dyncode import LeCrud, Publication, Numero, Personnes, LeObject, Rubrique, LeHierarch, LeRelation
  67. LeRelation.delete([LeRelation.sup_filter(Numero(42)), 'nature = "parent"'], 'LeHierarch')
  68. dsmock.assert_called_once_with(LeHierarch, [('lesup', '=', Numero(42)), ('nature','=','"parent"')])
  69. dsmock.reset_mock()
  70. class LeHierarch(LeRelationTestCase):
  71. @patch('DataSource.dummy.leapidatasource.DummyDatasource.select')
  72. def test_get(self, dsmock):
  73. """ Tests the LeHierarch.get() method without limit group order etc."""
  74. from dyncode import LeCrud, Publication, Numero, Personnes, LeObject, Rubrique, LeHierarch, LeRelation
  75. queries = [
  76. (
  77. ['lesup = 42', 'lesub = 24'], #filters
  78. ['lesup', 'lesub', 'nature', 'rank'], #field_l
  79. LeHierarch, #target
  80. ['lesup', 'lesub', 'nature', 'rank'], #field_ds
  81. [('lesup','=',LeObject(42)), ('lesub', '=', LeObject(24))], #filters_ds
  82. [], #rfilters_ds
  83. ),
  84. (
  85. [ LeRelation.sup_filter(Numero(42)) ],
  86. [],
  87. LeHierarch,
  88. [ 'nature', 'rank', 'lesub', 'depth', 'lesup', 'id_relation'],
  89. [('lesup', '=', Numero(42))],
  90. [],
  91. ),
  92. ]
  93. for filters, field_l, target, field_ds, filters_ds, rfilters_ds in queries:
  94. eargs = (filters, field_l, target, field_ds, filters_ds, rfilters_ds)
  95. LeHierarch.get(filters, field_l)
  96. cargs = dsmock.call_args
  97. self.assertEqual(len(cargs), 2)
  98. cargs=cargs[1]
  99. self.assertEqual(cargs['target_cls'], target, "%s != %s"%(cargs, eargs))
  100. self.assertEqual(set(cargs['field_list']), set(field_ds), "%s != %s"%(cargs, eargs))
  101. self.assertEqual(cargs['filters'], filters_ds, "%s != %s"%(cargs, eargs))
  102. self.assertEqual(cargs['rel_filters'], rfilters_ds, "%s != %s"%(cargs, eargs))
  103. dsmock.reset_mock()
  104. @patch('DataSource.dummy.leapidatasource.DummyDatasource.insert')
  105. def test_insert(self, dsmock):
  106. """ Testing LeHierarch insert method """
  107. from dyncode import LeCrud, Publication, Numero, Personnes, LeObject, Rubrique, LeHierarch, LeRelation
  108. queries = [
  109. (
  110. {
  111. 'lesup': Rubrique(7, class_id = Rubrique._class_id, type_id = Rubrique._type_id),
  112. 'lesub': Numero(42, class_id = Numero._class_id, type_id = Numero._type_id),
  113. 'nature': 'parent',
  114. },
  115. {
  116. 'lesup': Rubrique(7),
  117. 'lesub': Numero(42),
  118. 'nature': 'parent',
  119. },
  120. ),
  121. ]
  122. """ # Those tests are not good
  123. (
  124. {
  125. 'lesup': 7,
  126. 'lesub': 42,
  127. 'nature': 'parent',
  128. },
  129. {
  130. 'lesup': LeObject(7),
  131. 'lesub': LeObject(42),
  132. 'nature': 'parent',
  133. }
  134. ),
  135. (
  136. {
  137. 'lesup': LeObject(7),
  138. 'lesub': LeObject(42),
  139. 'nature': 'parent',
  140. },
  141. {
  142. 'lesup': LeObject(7),
  143. 'lesub': LeObject(42),
  144. 'nature': 'parent',
  145. }
  146. ),
  147. (
  148. {
  149. 'lesup': LeObject(7),
  150. 'lesub': 42,
  151. 'nature': 'parent',
  152. },
  153. {
  154. 'lesup': LeObject(7),
  155. 'lesub': LeObject(42),
  156. 'nature': 'parent',
  157. }
  158. )
  159. ]
  160. """
  161. for query, equery in queries:
  162. LeHierarch.insert(query)
  163. dsmock.assert_called_once_with(LeHierarch, **equery)
  164. dsmock.reset_mock()
  165. LeRelation.insert(query, 'LeHierarch')
  166. dsmock.assert_called_once_with(LeHierarch, **equery)
  167. dsmock.reset_mock()
  168. @patch('DataSource.dummy.leapidatasource.DummyDatasource.delete')
  169. def test_delete(self, dsmock):
  170. """ Testing LeHierarch delete method """
  171. from dyncode import LeCrud, Publication, Numero, Personnes, LeObject, Rubrique, LeHierarch, LeRelation
  172. rel = LeHierarch(10)
  173. rel.delete()
  174. dsmock.assert_called_once_with(LeHierarch, [(LeHierarch.uidname(), '=', 10)], [])
  175. @unittest.skip("Wait for LeRelation.update() to unskip")
  176. @patch('DataSource.dummy.leapidatasource.DummyDatasource.update')
  177. def test_update(self, dsmock):
  178. """ test LeHierach update method"""
  179. from dyncode import LeHierarch
  180. with self.assertRaises(NotImplementedError):
  181. LeHierarch.update({})
  182. class LeRel2TypeTestCase(LeRelationTestCase):
  183. @patch('DataSource.dummy.leapidatasource.DummyDatasource.insert')
  184. def test_insert(self, dsmock):
  185. """ test LeHierach update method"""
  186. from dyncode import LeObject, Article, Textes, Personne, Personnes, LeHierarch, LeRel2Type, Rel_Textes2Personne
  187. queries = [
  188. {
  189. 'lesup': Article(42),
  190. 'lesub': Personne(24),
  191. 'adresse': None,
  192. },
  193. {
  194. 'lesup': Textes(42),
  195. 'lesub': Personne(24),
  196. 'adresse': None,
  197. },
  198. {
  199. 'lesup': Article(42),
  200. 'lesub': Personne(24),
  201. 'adresse': "bar",
  202. },
  203. {
  204. 'lesup': Textes(42),
  205. 'lesub': Personne(24),
  206. 'adresse': "foo",
  207. },
  208. ]
  209. for query in queries:
  210. Rel_Textes2Personne.insert(query)
  211. eres = {'nature': None}
  212. eres.update(query)
  213. for fname in ('lesup', 'lesub'):
  214. if isinstance(eres[fname], int):
  215. eres[fname] = LeObject(eres[fname])
  216. dsmock.assert_called_once_with(Rel_Textes2Personne, **eres)
  217. dsmock.reset_mock()
  218. LeRel2Type.insert(query, "Rel_Textes2Personne")
  219. dsmock.assert_called_once_with(Rel_Textes2Personne, **eres)
  220. dsmock.reset_mock()
  221. @patch('DataSource.dummy.leapidatasource.DummyDatasource.insert')
  222. def test_insert_fails(self, dsmock):
  223. """ test LeHierach update method"""
  224. from dyncode import LeObject, Rubrique, Numero, Article, Textes, Personne, Personnes, LeHierarch, LeRel2Type, Rel_Textes2Personne
  225. queries = [
  226. {
  227. 'lesup': Rubrique(42),
  228. 'lesub': Personne(24),
  229. 'adresse': None,
  230. },
  231. {
  232. 'adresse': None,
  233. },
  234. {
  235. 'lesup': Rubrique(42),
  236. 'lesub': Rubrique(24),
  237. 'adresse': None,
  238. },
  239. {
  240. 'lesup': Article(42),
  241. 'lesub': Numero(24),
  242. 'adresse': 'foo',
  243. },
  244. {
  245. 'id_relation': 1337,
  246. 'lesup': Article(42),
  247. 'lesub': Numero(24),
  248. 'adresse': 'foo',
  249. },
  250. ]
  251. for query in queries:
  252. try:
  253. LeRel2Type.insert(query, 'Rel_textes2personne')
  254. self.fail("No exception raised")
  255. except Exception as e:
  256. if not isinstance(e, lecrud.LeApiErrors) and not isinstance(e, lecrud.LeApiDataCheckError):
  257. self.fail("Bad exception raised : ", e)
  258. try:
  259. Rel_Textes2Personne.insert(query)
  260. self.fail("No exception raised")
  261. except Exception as e:
  262. if not isinstance(e, lecrud.LeApiErrors) and not isinstance(e, lecrud.LeApiDataCheckError):
  263. self.fail("Bad exception raised : ", e)