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 9.4KB

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