devtools/repotest.py
brancholdstable
changeset 6665 90f2f20367bc
parent 6414 6003dc203567
child 6427 c8a5ac2d1eaa
equal deleted inserted replaced
6018:f4d1d5d9ccbb 6665:90f2f20367bc
    16 # You should have received a copy of the GNU Lesser General Public License along
    16 # You should have received a copy of the GNU Lesser General Public License along
    17 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
    17 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
    18 """some utilities to ease repository testing
    18 """some utilities to ease repository testing
    19 
    19 
    20 This module contains functions to initialize a new repository.
    20 This module contains functions to initialize a new repository.
    21 
       
    22 """
    21 """
       
    22 
    23 __docformat__ = "restructuredtext en"
    23 __docformat__ = "restructuredtext en"
    24 
    24 
    25 from pprint import pprint
    25 from pprint import pprint
    26 
    26 
    27 from logilab.common.decorators import clear_cache
    27 from logilab.common.decorators import clear_cache
    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]