Browse Source

Merge branch 'newlodel' of git.labocleo.org:lodel2 into newlodel

prieto 9 years ago
parent
commit
0154d7bdc4

+ 3
- 3
lodel/leapi/query.py View File

@@ -528,7 +528,7 @@ target to LeUpdateQuery constructor"
528 528
     #@returns the number of updated items
529 529
     #@todo change stategy for instance update. Datas should be allowed 
530 530
     #for execute method (and query)
531
-    def _query(self, filters, rel_filters, datas):
531
+    def _query(self, datas):
532 532
         uid_name = self._target_class._uid[0]
533 533
         if self.__leobject_instance is not None:
534 534
             #Instance update
@@ -629,7 +629,7 @@ class LeGetQuery(LeFilteredQuery):
629 629
         if 'group' in kwargs:
630 630
             #check kwargs['group']
631 631
             self.__group = kwargs['group']
632
-        if 'limit' in kwargs:
632
+        if 'limit' in kwargs and kwargs['limit'] is not None:
633 633
             try:
634 634
                 self.__limit = int(kwargs['limit'])
635 635
                 if self.__limit <= 0:
@@ -670,7 +670,7 @@ class LeGetQuery(LeFilteredQuery):
670 670
 
671 671
     ##@brief Implements select query operations
672 672
     # @returns a list containing the item(s)
673
-    def _query(self):
673
+    def _query(self, datas = None):
674 674
         # select datas corresponding to query_filter
675 675
         l_datas=self._ro_datasource.select(  self._target_class,
676 676
                                     list(self.field_list),

+ 9
- 6
plugins/mongodb_datasource/migration_handler.py View File

@@ -6,6 +6,7 @@ from lodel.editorial_model.model import EditorialModel
6 6
 from .utils import get_connection_args, connect, collection_prefix, object_collection_name, mongo_fieldname
7 7
 from lodel.leapi.datahandlers.base_classes import DataHandler
8 8
 from lodel.plugin import LodelHook
9
+from leapi_dyncode import *
9 10
 
10 11
 
11 12
 class MigrationHandlerChangeError(Exception):
@@ -32,11 +33,14 @@ class MongoDbMigrationHandler(object):
32 33
     ## @brief Constructs a MongoDbMigrationHandler
33 34
     # @param conn_args dict : a dictionary containing the connection options
34 35
     # @param **kwargs : extra arguments
35
-    def __init__(self, editorial_model, conn_args=None, **kwargs):
36
+    def __init__(self, editorial_model=None, conn_args=None, **kwargs):
36 37
         self.editorial_model = editorial_model
37 38
 
38 39
         conn_args = get_connection_args() if conn_args is None else conn_args
39 40
 
41
+        if editorial_model is None:
42
+            raise MongoDbMigrationHandler("Missing editorial model")
43
+
40 44
         if len(conn_args.keys()) == 0:
41 45
             raise MigrationHandlerError("No connection arguments were given")
42 46
 
@@ -61,11 +65,10 @@ class MongoDbMigrationHandler(object):
61 65
         #self._install_collections()
62 66
 
63 67
     def _set_init_collection_names(self):
64
-        collection_names = []
65
-        init_collections = self.editorial_model.all_classes()
66
-        for init_collection in init_collections.items():
67
-            if init_collection.abstract:
68
-                collection_names.append(init_collection.uid)
68
+        collection_names = ['relation']
69
+        for dynclass in dynclasses:
70
+            if dynclass._abstract:
71
+                collection_names.append(dynclass.__name__)
69 72
         return collection_names
70 73
 
71 74
     ## @brief Installs the basis collections of the database

+ 0
- 1
runtest View File

@@ -54,7 +54,6 @@ cp -R tests $testdir
54 54
 cd $testdir
55 55
 rm -R conf.d && mv tests/tests_conf.d conf.d
56 56
 make
57
-#python3 -W ignore -m unittest $@
58 57
 python3 loader.py $@
59 58
 
60 59
 rm -Rf $testdir

+ 2
- 2
scripts/admin.py View File

@@ -23,7 +23,7 @@ def refresh_dyncode(model_file, translator, output_filename):
23 23
         out_fd.write(dyncode)
24 24
     out_fd.close()
25 25
 
26
-def init_db(conn_args):
27
-    migration_handler = MongoDbMigrationHandler(conn_args=conn_args)
26
+def init_db(conn_args, editorial_model):
27
+    migration_handler = MongoDbMigrationHandler(editorial_model, conn_args)
28 28
     migration_handler._install_collections()
29 29
     migration_handler.database.close()

+ 104
- 0
tests/leapi/query/test_datasource.py View File

@@ -0,0 +1,104 @@
1
+import unittest
2
+from unittest import mock
3
+from unittest.mock import patch
4
+
5
+import tests.loader_utils
6
+from tests.leapi.query.utils import dyncode_module as dyncode
7
+from lodel.leapi.query import LeDeleteQuery, LeUpdateQuery, LeGetQuery, \
8
+    LeInsertQuery
9
+
10
+class LeQueryDatasourceTestCase(unittest.TestCase):
11
+    """ Testing LeQuery objects connection with datasource """
12
+
13
+    mockread = mock.MagicMock()
14
+    mockwrite = mock.MagicMock()
15
+    dyncode = None
16
+
17
+    @classmethod
18
+    def setUpClass(cls):
19
+        """ Mocking read & write datasource of dyncode """
20
+        cls.dyncode = dict()
21
+        for dyncls in dyncode.dynclasses:
22
+            dyncls._ro_datasource = cls.mockread
23
+            dyncls._rw_datasource = cls.mockwrite
24
+            cls.dyncode[dyncls.__name__] = dyncls
25
+
26
+    def setUp(self):
27
+        """ Reseting all mock calls before test """
28
+        self.mockread.reset_mock()
29
+        self.mockwrite.reset_mock()
30
+
31
+    def check_nocall(self, read = True, exclude = None):
32
+        """ Utility function to check if a datasource mock method has been
33
+            called during test """
34
+        exclude = [] if exclude is None else exclude
35
+        if read:
36
+            mockds = self.mockread
37
+        else:
38
+            mockds = self.mockwrite
39
+
40
+        if 'select' not in exclude:
41
+            self.assertFalse(
42
+                mockds.select.called,
43
+                "select method was not expected to be called")
44
+        if 'delete' not in exclude:
45
+            self.assertFalse(
46
+                mockds.delete.called,
47
+                "delete method was not expected to be called")
48
+        if 'update' not in exclude:
49
+            self.assertFalse(
50
+                mockds.update.called,
51
+                "update method was not expected to be called")
52
+        if 'insert' not in exclude:
53
+            self.assertFalse(
54
+                mockds.insert.called,
55
+                "insert method was not expected to be called")
56
+
57
+    def test_delete_simple_filter(self):
58
+        """ Testing delete query mocking datasource using simple query
59
+            filters """
60
+        cls = self.dyncode['Person']
61
+        query = LeDeleteQuery(
62
+            target_class = cls,
63
+            query_filter = ['lodel_id = 1', 'alias.lodel_id = 2'])
64
+        query.execute()
65
+        # Cannot check with assert_called_once_with because of the array
66
+        # that is not in a deterministic order
67
+        call_args = self.mockwrite.delete.call_args[0]
68
+        self.assertEqual(call_args[0], cls)
69
+        self.assertEqual(
70
+            sorted(call_args[1]),
71
+            sorted([('lodel_id', '=', '1'), ('alias', '=', '2')]))
72
+        self.assertEqual(call_args[2], [])
73
+        self.check_nocall(read = False, exclude = ['delete'])
74
+        self.check_nocall(read = True)
75
+
76
+
77
+    def test_delete_simple_rel_filters(self):
78
+        """ Testing delete query mocking datasource using simple filters
79
+            and relationnal filters"""
80
+        cls = self.dyncode['Person']
81
+        query = LeDeleteQuery(
82
+            target_class = cls,
83
+            query_filter = ['lodel_id = 1', 'alias.firstname = foo'])
84
+        query.execute()
85
+        self.mockwrite.delete.assert_called_once_with(
86
+            cls,
87
+            [('lodel_id', '=', '1')],
88
+            [(('alias', {cls: 'firstname'}), '=', 'foo')])
89
+        self.check_nocall(read = False, exclude = ['delete'])
90
+        self.check_nocall(read = True)
91
+
92
+    def test_delete_rel_filters(self):
93
+        """ Testing delete query mocking datasource """
94
+        cls = self.dyncode['Person']
95
+        query = LeDeleteQuery(
96
+            target_class = cls,
97
+            query_filter = ['alias.firstname = foo'])
98
+        query.execute()
99
+        self.mockwrite.delete.assert_called_once_with(
100
+            cls,
101
+            [],
102
+            [(('alias', {cls: 'firstname'}), '=', 'foo')])
103
+        self.check_nocall(read = False, exclude = ['delete'])
104
+        self.check_nocall(read = True)

+ 1
- 1
tests/leapi/query/test_filtered.py View File

@@ -3,7 +3,7 @@ import unittest
3 3
 import tests.loader_utils
4 4
 from tests.leapi.query.utils import dyncode_module as dyncode
5 5
 
6
-from lodel.leapi.leobject import LeApiDataCheckError
6
+from lodel.leapi.exceptions import LeApiDataCheckError
7 7
 from lodel.leapi.query import LeDeleteQuery, LeUpdateQuery, LeGetQuery
8 8
 
9 9
 class LeFilteredQueryTestCase(unittest.TestCase):

+ 25
- 0
tests/leapi/test_leobject.py View File

@@ -243,3 +243,28 @@ class LeObjectQueryMockTestCase(unittest.TestCase):
243 243
             self.assertEqual(res.d.lodel_id, 1)
244 244
             self.assertEqual(res.d.firstname, 'foo')
245 245
             self.assertEqual(res.d.lastname, 'bar')
246
+
247
+    def test_get_mini(self):
248
+        """ Checking that LeObject.get method calls LeGetQuery correctly
249
+            when called with minimum args """
250
+            
251
+        with patch.object(
252
+            LeGetQuery, '__init__', return_value = None) as mock_init:
253
+        
254
+            try:
255
+                dyncode.Person.get(['lodel_id = 1'])
256
+            except AttributeError:
257
+                pass
258
+            
259
+            mock_init.assert_called_once_with(
260
+                dyncode.Person,
261
+                query_filters = ['lodel_id = 1'],
262
+                field_list = dyncode.Person.fieldnames(True),
263
+                order = None, group = None, limit = None, offset = 0)
264
+
265
+        with patch.object(
266
+            LeGetQuery, 'execute', return_value = []) as mock_exec:
267
+            
268
+            dyncode.Person.get(['lodel_id = 1'])
269
+            mock_exec.assert_called_once_with()
270
+

Loading…
Cancel
Save