39 |
39 |
40 def test_plan(self, rql, expected, kwargs=None): |
40 def test_plan(self, rql, expected, kwargs=None): |
41 plan = self._prepare_plan(rql, kwargs) |
41 plan = self._prepare_plan(rql, kwargs) |
42 self.planner.build_plan(plan) |
42 self.planner.build_plan(plan) |
43 try: |
43 try: |
44 self.assertEquals(len(plan.steps), len(expected), |
44 self.assertEqual(len(plan.steps), len(expected), |
45 'expected %s steps, got %s' % (len(expected), len(plan.steps))) |
45 'expected %s steps, got %s' % (len(expected), len(plan.steps))) |
46 # step order is important |
46 # step order is important |
47 for i, step in enumerate(plan.steps): |
47 for i, step in enumerate(plan.steps): |
48 compare_steps(self, step.test_repr(), expected[i]) |
48 compare_steps(self, step.test_repr(), expected[i]) |
49 except AssertionError: |
49 except AssertionError: |
50 pprint([step.test_repr() for step in plan.steps]) |
50 pprint([step.test_repr() for step in plan.steps]) |
51 raise |
51 raise |
52 |
52 |
53 def compare_steps(self, step, expected): |
53 def compare_steps(self, step, expected): |
54 try: |
54 try: |
55 self.assertEquals(step[0], expected[0], 'expected step type %s, got %s' % (expected[0], step[0])) |
55 self.assertEqual(step[0], expected[0], 'expected step type %s, got %s' % (expected[0], step[0])) |
56 if len(step) > 2 and isinstance(step[1], list) and isinstance(expected[1], list): |
56 if len(step) > 2 and isinstance(step[1], list) and isinstance(expected[1], list): |
57 queries, equeries = step[1], expected[1] |
57 queries, equeries = step[1], expected[1] |
58 self.assertEquals(len(queries), len(equeries), |
58 self.assertEqual(len(queries), len(equeries), |
59 'expected %s queries, got %s' % (len(equeries), len(queries))) |
59 'expected %s queries, got %s' % (len(equeries), len(queries))) |
60 for i, (rql, sol) in enumerate(queries): |
60 for i, (rql, sol) in enumerate(queries): |
61 self.assertEquals(rql, equeries[i][0]) |
61 self.assertEqual(rql, equeries[i][0]) |
62 self.assertEquals(sorted(sol), sorted(equeries[i][1])) |
62 self.assertEqual(sorted(sol), sorted(equeries[i][1])) |
63 idx = 2 |
63 idx = 2 |
64 else: |
64 else: |
65 idx = 1 |
65 idx = 1 |
66 self.assertEquals(step[idx:-1], expected[idx:-1], |
66 self.assertEqual(step[idx:-1], expected[idx:-1], |
67 'expected step characteristic \n%s\n, got\n%s' % (expected[1:-1], step[1:-1])) |
67 'expected step characteristic \n%s\n, got\n%s' % (expected[1:-1], step[1:-1])) |
68 self.assertEquals(len(step[-1]), len(expected[-1]), |
68 self.assertEqual(len(step[-1]), len(expected[-1]), |
69 'got %s child steps, expected %s' % (len(step[-1]), len(expected[-1]))) |
69 'got %s child steps, expected %s' % (len(step[-1]), len(expected[-1]))) |
70 except AssertionError: |
70 except AssertionError: |
71 print 'error on step ', |
71 print 'error on step ', |
72 pprint(step[:-1]) |
72 pprint(step[:-1]) |
73 raise |
73 raise |
132 for rdef in x.rdefs.itervalues(): |
132 for rdef in x.rdefs.itervalues(): |
133 rdef.eid = schema_eids[(rdef.subject, rdef.rtype, rdef.object)] |
133 rdef.eid = schema_eids[(rdef.subject, rdef.rtype, rdef.object)] |
134 schema._eid_index[rdef.eid] = rdef |
134 schema._eid_index[rdef.eid] = rdef |
135 |
135 |
136 |
136 |
137 from logilab.common.testlib import TestCase |
137 from logilab.common.testlib import TestCase, mock_object |
|
138 from logilab.database import get_db_helper |
|
139 |
138 from rql import RQLHelper |
140 from rql import RQLHelper |
|
141 |
139 from cubicweb.devtools.fake import FakeRepo, FakeSession |
142 from cubicweb.devtools.fake import FakeRepo, FakeSession |
140 from cubicweb.server import set_debug |
143 from cubicweb.server import set_debug |
141 from cubicweb.server.querier import QuerierHelper |
144 from cubicweb.server.querier import QuerierHelper |
142 from cubicweb.server.session import Session |
145 from cubicweb.server.session import Session |
143 from cubicweb.server.sources.rql2sql import remove_unused_solutions |
146 from cubicweb.server.sources.rql2sql import SQLGenerator, remove_unused_solutions |
144 |
147 |
145 class RQLGeneratorTC(TestCase): |
148 class RQLGeneratorTC(TestCase): |
146 schema = None # set this in concret test |
149 schema = backend = None # set this in concret test |
147 |
150 |
148 def setUp(self): |
151 def setUp(self): |
149 self.repo = FakeRepo(self.schema) |
152 self.repo = FakeRepo(self.schema) |
|
153 self.repo.system_source = mock_object(dbdriver=self.backend) |
150 self.rqlhelper = RQLHelper(self.schema, special_relations={'eid': 'uid', |
154 self.rqlhelper = RQLHelper(self.schema, special_relations={'eid': 'uid', |
151 'has_text': 'fti'}) |
155 'has_text': 'fti'}, |
|
156 backend=self.backend) |
152 self.qhelper = QuerierHelper(self.repo, self.schema) |
157 self.qhelper = QuerierHelper(self.repo, self.schema) |
153 ExecutionPlan._check_permissions = _dummy_check_permissions |
158 ExecutionPlan._check_permissions = _dummy_check_permissions |
154 rqlannotation._select_principal = _select_principal |
159 rqlannotation._select_principal = _select_principal |
|
160 if self.backend is not None: |
|
161 try: |
|
162 dbhelper = get_db_helper(self.backend) |
|
163 except ImportError, ex: |
|
164 self.skipTest(str(ex)) |
|
165 self.o = SQLGenerator(self.schema, dbhelper) |
155 |
166 |
156 def tearDown(self): |
167 def tearDown(self): |
157 ExecutionPlan._check_permissions = _orig_check_permissions |
168 ExecutionPlan._check_permissions = _orig_check_permissions |
158 rqlannotation._select_principal = _orig_select_principal |
169 rqlannotation._select_principal = _orig_select_principal |
159 |
170 |
268 self.schema = self.o.schema |
279 self.schema = self.o.schema |
269 self.sources = self.o._repo.sources |
280 self.sources = self.o._repo.sources |
270 self.system = self.sources[-1] |
281 self.system = self.sources[-1] |
271 do_monkey_patch() |
282 do_monkey_patch() |
272 self._dumb_sessions = [] # by hi-jacked parent setup |
283 self._dumb_sessions = [] # by hi-jacked parent setup |
|
284 self.repo.vreg.rqlhelper.backend = 'postgres' # so FTIRANK is considered |
273 |
285 |
274 def add_source(self, sourcecls, uri): |
286 def add_source(self, sourcecls, uri): |
275 self.sources.append(sourcecls(self.repo, self.o.schema, |
287 self.sources.append(sourcecls(self.repo, self.o.schema, |
276 {'uri': uri})) |
288 {'uri': uri})) |
277 self.repo.sources_by_uri[uri] = self.sources[-1] |
289 self.repo.sources_by_uri[uri] = self.sources[-1] |