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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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. from leapi.lecrud import _LeCrud
  11. class LeRelationTestCase(TestCase):
  12. @classmethod
  13. def setUpClass(cls):
  14. """ Write the generated code in a temporary directory and import it """
  15. cls.tmpdir = leapi.test.utils.tmp_load_factory_code()
  16. @classmethod
  17. def tearDownClass(cls):
  18. """ Remove the temporary directory created at class setup """
  19. leapi.test.utils.cleanup(cls.tmpdir)
  20. @unittest.skip("Wating LeRelation._prepare_filters() to unskip")
  21. def test_prepare_filters(self):
  22. """ Testing the _prepare_filters() method """
  23. from dyncode import Numero, LeObject, LeRelation
  24. filters = [
  25. (
  26. 'rank = 1',
  27. ('rank', '=', '1')
  28. ),
  29. (
  30. 'nature = "parent"',
  31. ('nature', '=', '"parent"')
  32. ),
  33. (
  34. 'lesup = 21',
  35. ('lesup', '=', LeObject(21))
  36. ),
  37. (
  38. 'lesub = 22',
  39. ('lesub', '=', LeObject(22))
  40. ),
  41. (
  42. ('rank', '=', '1'),
  43. ('rank', '=', '1'),
  44. ),
  45. (
  46. ('lesup', '=', LeObject(21)),
  47. ('lesup', '=', LeObject(21)),
  48. ),
  49. (
  50. ('lesub', '=', Numero(42)),
  51. ('lesub', '=', Numero(42)),
  52. ),
  53. ]
  54. for filter_arg, filter_res in filters:
  55. res, rel_res = LeRelation._prepare_filters([filter_arg])
  56. self.assertEqual(len(res), 1)
  57. self.assertEqual(len(rel_res), 0)
  58. res = res[0]
  59. for i in range(3):
  60. self.assertEqual(filter_res[i], res[i], "%s != %s"%(filter_res, res))
  61. @unittest.skip("Wait LeRelation._prepare_filters() and LeRelation.delete() to unskip")
  62. @patch('leapi.datasources.dummy.DummyDatasource.delete')
  63. def test_delete(self, dsmock):
  64. """ Testing LeHierarch insert method """
  65. from dyncode import LeCrud, Publication, Numero, Personnes, LeObject, Rubrique, LeHierarch, LeRelation
  66. LeRelation.delete([LeRelation.sup_filter(Numero(42)), 'nature = "parent"'], 'LeHierarch')
  67. dsmock.assert_called_once_with(LeHierarch, [('lesup', '=', Numero(42)), ('nature','=','parent')])
  68. dsmock.reset_mock()
  69. class LeHierarch(LeRelationTestCase):
  70. @unittest.skip("Wait for LeRelation._prepare_filters() to unskip")
  71. @patch('leapi.datasources.dummy.DummyDatasource.select')
  72. def test_get(self, dsmock):
  73. """ Tests the LeHierarch.get() method """
  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'],
  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[0]
  99. self.assertEqual(cargs[0], target, "%s != %s"%(cargs, eargs))
  100. self.assertEqual(set(cargs[1]), set(field_ds), "%s != %s"%(cargs, eargs))
  101. self.assertEqual(cargs[2], filters_ds, "%s != %s"%(cargs, eargs))
  102. self.assertEqual(cargs[3], rfilters_ds, "%s != %s"%(cargs, eargs))
  103. dsmock.reset_mock()
  104. @unittest.skip("Wait for LeRelation._prepare_filters() to unskip")
  105. @patch('leapi.datasources.dummy.DummyDatasource.insert')
  106. def test_insert(self, dsmock):
  107. """ Testing LeHierarch insert method """
  108. from dyncode import LeCrud, Publication, Numero, Personnes, LeObject, Rubrique, LeHierarch, LeRelation
  109. queries = [
  110. {
  111. 'lesup': Rubrique(7),
  112. 'lesub': Numero(42),
  113. 'nature': 'parent',
  114. },
  115. {
  116. 'lesup': 7,
  117. 'lesub': 42,
  118. 'nature': 'parent',
  119. },
  120. {
  121. 'lesup': LeObject(7),
  122. 'lesub': LeObject(42),
  123. 'nature': 'parent',
  124. },
  125. {
  126. 'lesup': LeObject(7),
  127. 'lesub': 42,
  128. 'nature': 'parent',
  129. }
  130. ]
  131. for query in queries:
  132. LeHierarch.insert(query)
  133. dsmock.assert_called_once_with(LeHierarch, **query)
  134. dsmock.reset_mock()
  135. LeRelation.insert(query, 'LeHierarch')
  136. dsmock.assert_called_once_with(LeHierarch, **query)
  137. dsmock.reset_mock()
  138. @unittest.skip("Wait for LeRelation.delete()")
  139. @patch('leapi.datasources.dummy.DummyDatasource.delete')
  140. def test_delete(self, dsmock):
  141. """ Testing LeHierarch insert method """
  142. from dyncode import LeCrud, Publication, Numero, Personnes, LeObject, Rubrique, LeHierarch, LeRelation
  143. rel = LeHierarch(10)
  144. rel.delete()
  145. dsmock.assert_called_once_with(LeHierarch, [(LeHierarch.uidname(), '=', 10)], [])
  146. @unittest.skip("Wait for LeRelation.update() to unskip")
  147. @patch('leapi.datasources.dummy.DummyDatasource.update')
  148. def test_update(self, dsmock):
  149. """ test LeHierach update method"""
  150. from dyncode import LeHierarch
  151. with self.assertRaises(NotImplementedError):
  152. LeHierarch.update({})
  153. class LeRel2TypeTestCase(LeRelationTestCase):
  154. @unittest.skip("Wait implementation to unskip")
  155. @patch('leapi.datasources.dummy.DummyDatasource.insert')
  156. def test_insert(self, dsmock):
  157. """ test LeHierach update method"""
  158. from dyncode import LeObject, Article, Textes, Personne, Personnes, LeHierarch, LeRel2Type, Rel_textes2personne
  159. queries = [
  160. {
  161. 'lesup': Article(42),
  162. 'lesub': Personne(24),
  163. 'adresse': None,
  164. },
  165. {
  166. 'lesup': Textes(42),
  167. 'lesub': Personne(24),
  168. 'adresse': None,
  169. },
  170. {
  171. 'lesup': 42,
  172. 'lesub': Personne(24),
  173. 'adresse': None,
  174. },
  175. {
  176. 'lesup': Article(42),
  177. 'lesub': Personnes(24),
  178. 'adresse': "bar",
  179. },
  180. {
  181. 'lesup': Textes(42),
  182. 'lesub': Personnes(24),
  183. 'adresse': "foo",
  184. },
  185. ]
  186. for query in queries:
  187. Rel_textes2personne.insert(query)
  188. eres = {'nature': None}
  189. eres.uopdate(query)
  190. dsmock.assert_called_once_with(Rel_textes2personne, **eres)