cubicweb/server/test/unittest_rql2sql.py
changeset 11237 f32134dd0067
parent 11077 09be48c01fa4
child 11269 73ac69970047
equal deleted inserted replaced
11232:25ec9be5f305 11237:f32134dd0067
  1233         super(PostgresSQLGeneratorTC, self).setUp()
  1233         super(PostgresSQLGeneratorTC, self).setUp()
  1234 
  1234 
  1235     def _norm_sql(self, sql):
  1235     def _norm_sql(self, sql):
  1236         return sql.strip()
  1236         return sql.strip()
  1237 
  1237 
  1238     def _check(self, rql, sql, varmap=None, args=None):
  1238     def _check(self, rql, sql, args=None):
  1239         if args is None:
  1239         if args is None:
  1240             args = {'text': 'hip hop momo', 'eid': 12345}
  1240             args = {'text': 'hip hop momo', 'eid': 12345}
  1241         try:
  1241         try:
  1242             union = self._prepare(rql)
  1242             union = self._prepare(rql)
  1243             r, nargs, cbs = self.o.generate(union, args,
  1243             r, nargs, cbs = self.o.generate(union, args)
  1244                                             varmap=varmap)
       
  1245             args.update(nargs)
  1244             args.update(nargs)
  1246             self.assertMultiLineEqual(strip(r % args), self._norm_sql(sql))
  1245             self.assertMultiLineEqual(strip(r % args), self._norm_sql(sql))
  1247         except Exception as ex:
  1246         except Exception as ex:
  1248             if 'r' in locals():
  1247             if 'r' in locals():
  1249                 try:
  1248                 try:
  1300 
  1299 
  1301         self._check('Any X WHERE X in_basket B, B eid 12',
  1300         self._check('Any X WHERE X in_basket B, B eid 12',
  1302                     '''SELECT rel_in_basket0.eid_from
  1301                     '''SELECT rel_in_basket0.eid_from
  1303 FROM in_basket_relation AS rel_in_basket0
  1302 FROM in_basket_relation AS rel_in_basket0
  1304 WHERE rel_in_basket0.eid_to=12''')
  1303 WHERE rel_in_basket0.eid_to=12''')
  1305 
       
  1306     def test_varmap1(self):
       
  1307         self._check('Any X,L WHERE X is CWUser, X in_group G, X login L, G name "users"',
       
  1308                     '''SELECT T00.x, T00.l
       
  1309 FROM T00, cw_CWGroup AS _G, in_group_relation AS rel_in_group0
       
  1310 WHERE rel_in_group0.eid_from=T00.x AND rel_in_group0.eid_to=_G.cw_eid AND _G.cw_name=users''',
       
  1311                     varmap={'X': 'T00.x', 'X.login': 'T00.l'})
       
  1312 
       
  1313     def test_varmap2(self):
       
  1314         self._check('Any X,L,GN WHERE X is CWUser, X in_group G, X login L, G name GN',
       
  1315                     '''SELECT T00.x, T00.l, _G.cw_name
       
  1316 FROM T00, cw_CWGroup AS _G, in_group_relation AS rel_in_group0
       
  1317 WHERE rel_in_group0.eid_from=T00.x AND rel_in_group0.eid_to=_G.cw_eid''',
       
  1318                     varmap={'X': 'T00.x', 'X.login': 'T00.l'})
       
  1319 
       
  1320     def test_varmap3(self):
       
  1321         self._check('Any %(x)s,D WHERE F data D, F is File',
       
  1322                     'SELECT 728, _TDF0.C0\nFROM _TDF0',
       
  1323                     args={'x': 728},
       
  1324                     varmap={'F.data': '_TDF0.C0', 'D': '_TDF0.C0'})
       
  1325 
  1304 
  1326     def test_is_null_transform(self):
  1305     def test_is_null_transform(self):
  1327         union = self._prepare('Any X WHERE X login %(login)s')
  1306         union = self._prepare('Any X WHERE X login %(login)s')
  1328         r, args, cbs = self.o.generate(union, {'login': None})
  1307         r, args, cbs = self.o.generate(union, {'login': None})
  1329         self.assertMultiLineEqual((r % args).strip(),
  1308         self.assertMultiLineEqual((r % args).strip(),
  2229     def test_invariant_not_varying(self):
  2208     def test_invariant_not_varying(self):
  2230         rqlst = mock_object(defined_vars={})
  2209         rqlst = mock_object(defined_vars={})
  2231         rqlst.defined_vars['A'] = mock_object(scope=rqlst, stinfo={}, _q_invariant=True)
  2210         rqlst.defined_vars['A'] = mock_object(scope=rqlst, stinfo={}, _q_invariant=True)
  2232         rqlst.defined_vars['B'] = mock_object(scope=rqlst, stinfo={}, _q_invariant=False)
  2211         rqlst.defined_vars['B'] = mock_object(scope=rqlst, stinfo={}, _q_invariant=False)
  2233         self.assertEqual(remove_unused_solutions(rqlst, [{'A': 'RugbyGroup', 'B': 'RugbyTeam'},
  2212         self.assertEqual(remove_unused_solutions(rqlst, [{'A': 'RugbyGroup', 'B': 'RugbyTeam'},
  2234                                                           {'A': 'FootGroup', 'B': 'FootTeam'}], {}, None),
  2213                                                           {'A': 'FootGroup', 'B': 'FootTeam'}], None),
  2235                           ([{'A': 'RugbyGroup', 'B': 'RugbyTeam'},
  2214                           ([{'A': 'RugbyGroup', 'B': 'RugbyTeam'},
  2236                             {'A': 'FootGroup', 'B': 'FootTeam'}],
  2215                             {'A': 'FootGroup', 'B': 'FootTeam'}],
  2237                            {}, set('B'))
  2216                            {}, set('B'))
  2238                           )
  2217                           )
  2239 
  2218 
  2240     def test_invariant_varying(self):
  2219     def test_invariant_varying(self):
  2241         rqlst = mock_object(defined_vars={})
  2220         rqlst = mock_object(defined_vars={})
  2242         rqlst.defined_vars['A'] = mock_object(scope=rqlst, stinfo={}, _q_invariant=True)
  2221         rqlst.defined_vars['A'] = mock_object(scope=rqlst, stinfo={}, _q_invariant=True)
  2243         rqlst.defined_vars['B'] = mock_object(scope=rqlst, stinfo={}, _q_invariant=False)
  2222         rqlst.defined_vars['B'] = mock_object(scope=rqlst, stinfo={}, _q_invariant=False)
  2244         self.assertEqual(remove_unused_solutions(rqlst, [{'A': 'RugbyGroup', 'B': 'RugbyTeam'},
  2223         self.assertEqual(remove_unused_solutions(rqlst, [{'A': 'RugbyGroup', 'B': 'RugbyTeam'},
  2245                                                           {'A': 'FootGroup', 'B': 'RugbyTeam'}], {}, None),
  2224                                                           {'A': 'FootGroup', 'B': 'RugbyTeam'}], None),
  2246                           ([{'A': 'RugbyGroup', 'B': 'RugbyTeam'}], {}, set())
  2225                           ([{'A': 'RugbyGroup', 'B': 'RugbyTeam'}], {}, set())
  2247                           )
  2226                           )
  2248 
  2227 
  2249 
  2228 
  2250 if __name__ == '__main__':
  2229 if __name__ == '__main__':