devtools/repotest.py
brancholdstable
changeset 7074 e4580e5f0703
parent 6818 5fa425574548
child 6957 ffda12be2e9f
equal deleted inserted replaced
6749:48f468f33704 7074:e4580e5f0703
    20 This module contains functions to initialize a new repository.
    20 This module contains functions to initialize a new repository.
    21 """
    21 """
    22 
    22 
    23 __docformat__ = "restructuredtext en"
    23 __docformat__ = "restructuredtext en"
    24 
    24 
       
    25 from copy import deepcopy
    25 from pprint import pprint
    26 from pprint import pprint
    26 
    27 
    27 from logilab.common.decorators import clear_cache
    28 from logilab.common.decorators import clear_cache
       
    29 from logilab.common.testlib import SkipTest
    28 
    30 
    29 def tuplify(list):
    31 def tuplify(list):
    30     for i in range(len(list)):
    32     for i in range(len(list)):
    31         if type(list[i]) is not type(()):
    33         if type(list[i]) is not type(()):
    32             list[i] = tuple(list[i])
    34             list[i] = tuple(list[i])
   138 from logilab.database import get_db_helper
   140 from logilab.database import get_db_helper
   139 
   141 
   140 from rql import RQLHelper
   142 from rql import RQLHelper
   141 
   143 
   142 from cubicweb.devtools.fake import FakeRepo, FakeSession
   144 from cubicweb.devtools.fake import FakeRepo, FakeSession
   143 from cubicweb.server import set_debug
   145 from cubicweb.server import set_debug, debugged
   144 from cubicweb.server.querier import QuerierHelper
   146 from cubicweb.server.querier import QuerierHelper
   145 from cubicweb.server.session import Session
   147 from cubicweb.server.session import Session
   146 from cubicweb.server.sources.rql2sql import SQLGenerator, remove_unused_solutions
   148 from cubicweb.server.sources.rql2sql import SQLGenerator, remove_unused_solutions
   147 
   149 
   148 class RQLGeneratorTC(TestCase):
   150 class RQLGeneratorTC(TestCase):
   149     schema = backend = None # set this in concret test
   151     schema = backend = None # set this in concret test
       
   152 
       
   153 
       
   154     @classmethod
       
   155     def setUpClass(cls):
       
   156         if cls.backend is not None:
       
   157             try:
       
   158                 cls.dbhelper = get_db_helper(cls.backend)
       
   159             except ImportError, ex:
       
   160                 raise SkipTest(str(ex))
   150 
   161 
   151     def setUp(self):
   162     def setUp(self):
   152         self.repo = FakeRepo(self.schema)
   163         self.repo = FakeRepo(self.schema)
   153         self.repo.system_source = mock_object(dbdriver=self.backend)
   164         self.repo.system_source = mock_object(dbdriver=self.backend)
   154         self.rqlhelper = RQLHelper(self.schema, special_relations={'eid': 'uid',
   165         self.rqlhelper = RQLHelper(self.schema, special_relations={'eid': 'uid',
   156                                    backend=self.backend)
   167                                    backend=self.backend)
   157         self.qhelper = QuerierHelper(self.repo, self.schema)
   168         self.qhelper = QuerierHelper(self.repo, self.schema)
   158         ExecutionPlan._check_permissions = _dummy_check_permissions
   169         ExecutionPlan._check_permissions = _dummy_check_permissions
   159         rqlannotation._select_principal = _select_principal
   170         rqlannotation._select_principal = _select_principal
   160         if self.backend is not None:
   171         if self.backend is not None:
   161             try:
   172             self.o = SQLGenerator(self.schema, self.dbhelper)
   162                 dbhelper = get_db_helper(self.backend)
       
   163             except ImportError, ex:
       
   164                 self.skipTest(str(ex))
       
   165             self.o = SQLGenerator(self.schema, dbhelper)
       
   166 
   173 
   167     def tearDown(self):
   174     def tearDown(self):
   168         ExecutionPlan._check_permissions = _orig_check_permissions
   175         ExecutionPlan._check_permissions = _orig_check_permissions
   169         rqlannotation._select_principal = _orig_select_principal
   176         rqlannotation._select_principal = _orig_select_principal
   170 
   177 
   171     def set_debug(self, debug):
   178     def set_debug(self, debug):
   172         set_debug(debug)
   179         set_debug(debug)
       
   180     def debugged(self, debug):
       
   181         return debugged(debug)
   173 
   182 
   174     def _prepare(self, rql):
   183     def _prepare(self, rql):
   175         #print '******************** prepare', rql
   184         #print '******************** prepare', rql
   176         union = self.rqlhelper.parse(rql)
   185         union = self.rqlhelper.parse(rql)
   177         #print '********* parsed', union.as_string()
   186         #print '********* parsed', union.as_string()
   219         self.repo._free_pool(self.pool)
   228         self.repo._free_pool(self.pool)
   220         assert self.session.user.eid != -1
   229         assert self.session.user.eid != -1
   221 
   230 
   222     def set_debug(self, debug):
   231     def set_debug(self, debug):
   223         set_debug(debug)
   232         set_debug(debug)
       
   233     def debugged(self, debug):
       
   234         return debugged(debug)
   224 
   235 
   225     def _rqlhelper(self):
   236     def _rqlhelper(self):
   226         rqlhelper = self.repo.vreg.rqlhelper
   237         rqlhelper = self.repo.vreg.rqlhelper
   227         # reset uid_func so it don't try to get type from eids
   238         # reset uid_func so it don't try to get type from eids
   228         rqlhelper._analyser.uid_func = None
   239         rqlhelper._analyser.uid_func = None
   282         do_monkey_patch()
   293         do_monkey_patch()
   283         self._dumb_sessions = [] # by hi-jacked parent setup
   294         self._dumb_sessions = [] # by hi-jacked parent setup
   284         self.repo.vreg.rqlhelper.backend = 'postgres' # so FTIRANK is considered
   295         self.repo.vreg.rqlhelper.backend = 'postgres' # so FTIRANK is considered
   285 
   296 
   286     def add_source(self, sourcecls, uri):
   297     def add_source(self, sourcecls, uri):
   287         self.sources.append(sourcecls(self.repo, self.o.schema,
   298         self.sources.append(sourcecls(self.repo, {'uri': uri}))
   288                                       {'uri': uri}))
       
   289         self.repo.sources_by_uri[uri] = self.sources[-1]
   299         self.repo.sources_by_uri[uri] = self.sources[-1]
   290         setattr(self, uri, self.sources[-1])
   300         setattr(self, uri, self.sources[-1])
   291         self.newsources += 1
   301         self.newsources += 1
   292 
   302 
   293     def tearDown(self):
   303     def tearDown(self):
   362 
   372 
   363 try:
   373 try:
   364     from cubicweb.server.msplanner import PartPlanInformation
   374     from cubicweb.server.msplanner import PartPlanInformation
   365 except ImportError:
   375 except ImportError:
   366     class PartPlanInformation(object):
   376     class PartPlanInformation(object):
   367         def merge_input_maps(self, *args):
   377         def merge_input_maps(self, *args, **kwargs):
   368             pass
   378             pass
   369         def _choose_term(self, sourceterms):
   379         def _choose_term(self, sourceterms):
   370             pass
   380             pass
   371 _orig_merge_input_maps = PartPlanInformation.merge_input_maps
   381 _orig_merge_input_maps = PartPlanInformation.merge_input_maps
   372 _orig_choose_term = PartPlanInformation._choose_term
   382 _orig_choose_term = PartPlanInformation._choose_term
   373 
   383 
   374 def _merge_input_maps(*args):
   384 def _merge_input_maps(*args, **kwargs):
   375     return sorted(_orig_merge_input_maps(*args))
   385     return sorted(_orig_merge_input_maps(*args, **kwargs))
   376 
   386 
   377 def _choose_term(self, sourceterms):
   387 def _choose_term(self, source, sourceterms):
   378     # predictable order for test purpose
   388     # predictable order for test purpose
   379     def get_key(x):
   389     def get_key(x):
   380         try:
   390         try:
   381             # variable
   391             # variable
   382             return x.name
   392             return x.name
   385                 # relation
   395                 # relation
   386                 return x.r_type
   396                 return x.r_type
   387             except AttributeError:
   397             except AttributeError:
   388                 # const
   398                 # const
   389                 return x.value
   399                 return x.value
   390     return _orig_choose_term(self, DumbOrderedDict2(sourceterms, get_key))
   400     return _orig_choose_term(self, source, DumbOrderedDict2(sourceterms, get_key))
   391 
   401 
       
   402 from cubicweb.server.sources.pyrorql import PyroRQLSource
       
   403 _orig_syntax_tree_search = PyroRQLSource.syntax_tree_search
       
   404 
       
   405 def _syntax_tree_search(*args, **kwargs):
       
   406     return deepcopy(_orig_syntax_tree_search(*args, **kwargs))
   392 
   407 
   393 def do_monkey_patch():
   408 def do_monkey_patch():
   394     RQLRewriter.insert_snippets = _insert_snippets
   409     RQLRewriter.insert_snippets = _insert_snippets
   395     RQLRewriter.build_variantes = _build_variantes
   410     RQLRewriter.build_variantes = _build_variantes
   396     ExecutionPlan._check_permissions = _check_permissions
   411     ExecutionPlan._check_permissions = _check_permissions
   397     ExecutionPlan.tablesinorder = None
   412     ExecutionPlan.tablesinorder = None
   398     ExecutionPlan.init_temp_table = _init_temp_table
   413     ExecutionPlan.init_temp_table = _init_temp_table
   399     PartPlanInformation.merge_input_maps = _merge_input_maps
   414     PartPlanInformation.merge_input_maps = _merge_input_maps
   400     PartPlanInformation._choose_term = _choose_term
   415     PartPlanInformation._choose_term = _choose_term
       
   416     PyroRQLSource.syntax_tree_search = _syntax_tree_search
   401 
   417 
   402 def undo_monkey_patch():
   418 def undo_monkey_patch():
   403     RQLRewriter.insert_snippets = _orig_insert_snippets
   419     RQLRewriter.insert_snippets = _orig_insert_snippets
   404     RQLRewriter.build_variantes = _orig_build_variantes
   420     RQLRewriter.build_variantes = _orig_build_variantes
   405     ExecutionPlan._check_permissions = _orig_check_permissions
   421     ExecutionPlan._check_permissions = _orig_check_permissions
   406     ExecutionPlan.init_temp_table = _orig_init_temp_table
   422     ExecutionPlan.init_temp_table = _orig_init_temp_table
   407     PartPlanInformation.merge_input_maps = _orig_merge_input_maps
   423     PartPlanInformation.merge_input_maps = _orig_merge_input_maps
   408     PartPlanInformation._choose_term = _orig_choose_term
   424     PartPlanInformation._choose_term = _orig_choose_term
       
   425     PyroRQLSource.syntax_tree_search = _orig_syntax_tree_search