goa/testlib.py
branchtls-sprint
changeset 1802 d628defebc17
parent 1398 5fe84a5f7035
child 1977 606923dff11b
equal deleted inserted replaced
1801:672acc730ce5 1802:d628defebc17
       
     1 """
       
     2 :organization: Logilab
       
     3 :copyright: 2008-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
       
     4 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
       
     5 """
       
     6 __docformat__ = "restructuredtext en"
       
     7 
     1 from logilab.common.testlib import TestCase
     8 from logilab.common.testlib import TestCase
     2 
     9 
     3 import os, os.path as osp
    10 import os, os.path as osp
     4 import time
    11 import time
     5 from shutil import copy
    12 from shutil import copy
    16     from google.appengine.ext import db as gdb
    23     from google.appengine.ext import db as gdb
    17     from cubicweb.goa import db, do_monkey_patch
    24     from cubicweb.goa import db, do_monkey_patch
    18     import_appengine_failed = None
    25     import_appengine_failed = None
    19 except ImportError, exc:
    26 except ImportError, exc:
    20     # XXX necessary ?
    27     # XXX necessary ?
    21     class db: 
    28     class db:
    22         class Model:
    29         class Model:
    23             pass
    30             pass
    24         class DummyProperty:
    31         class DummyProperty:
    25             def __init__(self, *args, **kwargs):
    32             def __init__(self, *args, **kwargs):
    26                 pass
    33                 pass
    29         BlobProperty = DummyProperty
    36         BlobProperty = DummyProperty
    30         DateProperty = DummyProperty
    37         DateProperty = DummyProperty
    31         ReferenceProperty = DummyProperty
    38         ReferenceProperty = DummyProperty
    32         SelfReferenceProperty = DummyProperty
    39         SelfReferenceProperty = DummyProperty
    33     import_appengine_failed = 'cannot import appengine: %s' % exc
    40     import_appengine_failed = 'cannot import appengine: %s' % exc
    34     
    41 
    35 
    42 
    36 from cubicweb.devtools.fake import FakeRequest
    43 from cubicweb.devtools.fake import FakeRequest
    37 from cubicweb.goa.goavreg import GAERegistry
    44 from cubicweb.goa.goavreg import GAERegistry
    38 from cubicweb.goa.goaconfig import GAEConfiguration
    45 from cubicweb.goa.goaconfig import GAEConfiguration
    39 from cubicweb.goa.dbinit import (create_user, create_groups, fix_entities,
    46 from cubicweb.goa.dbinit import (create_user, create_groups, fix_entities,
    54     config = None
    61     config = None
    55     _DS_TEMPL_FILE = 'tmpdb-template'
    62     _DS_TEMPL_FILE = 'tmpdb-template'
    56 
    63 
    57     def load_schema_hook(self, loader):
    64     def load_schema_hook(self, loader):
    58         loader.import_yams_cube_schema('data')
    65         loader.import_yams_cube_schema('data')
    59     
    66 
    60     @property
    67     @property
    61     def DS_FILE(self):
    68     def DS_FILE(self):
    62         return self.DS_TEMPL_FILE.replace('-template', '')
    69         return self.DS_TEMPL_FILE.replace('-template', '')
    63     
    70 
    64     @property
    71     @property
    65     def DS_TEMPL_FILE(self):
    72     def DS_TEMPL_FILE(self):
    66         return self._DS_TEMPL_FILE + '_'.join(sorted(cls.__name__ for cls in self.MODEL_CLASSES))
    73         return self._DS_TEMPL_FILE + '_'.join(sorted(cls.__name__ for cls in self.MODEL_CLASSES))
    67 
    74 
    68     def _set_ds_file(self, dsfile):
    75     def _set_ds_file(self, dsfile):
    70         apiproxy_stub_map.apiproxy = apiproxy_stub_map.APIProxyStubMap()
    77         apiproxy_stub_map.apiproxy = apiproxy_stub_map.APIProxyStubMap()
    71         # Use a fresh stub datastore.
    78         # Use a fresh stub datastore.
    72         stub = datastore_file_stub.DatastoreFileStub(self.APP_ID, dsfile,
    79         stub = datastore_file_stub.DatastoreFileStub(self.APP_ID, dsfile,
    73                                                      dsfile+'.history')
    80                                                      dsfile+'.history')
    74         apiproxy_stub_map.apiproxy.RegisterStub('datastore_v3', stub)
    81         apiproxy_stub_map.apiproxy.RegisterStub('datastore_v3', stub)
    75         
    82 
    76     def setUp(self):
    83     def setUp(self):
    77         if import_appengine_failed:
    84         if import_appengine_failed:
    78             self.skip(import_appengine_failed)
    85             self.skip(import_appengine_failed)
    79         # Ensure we're in UTC.
    86         # Ensure we're in UTC.
    80         os.environ['TZ'] = 'UTC'
    87         os.environ['TZ'] = 'UTC'
    86         else:
    93         else:
    87             need_ds_init = True
    94             need_ds_init = True
    88             self._set_ds_file(self.DS_TEMPL_FILE)
    95             self._set_ds_file(self.DS_TEMPL_FILE)
    89 #         from google.appengine.api import mail_stub
    96 #         from google.appengine.api import mail_stub
    90 #         from google3.apphosting.api import urlfetch_stub
    97 #         from google3.apphosting.api import urlfetch_stub
    91 #         from google3.apphosting.api import user_service_stub        
    98 #         from google3.apphosting.api import user_service_stub
    92 #         # Use a fresh stub UserService.
    99 #         # Use a fresh stub UserService.
    93 #         apiproxy_stub_map.apiproxy.RegisterStub(
   100 #         apiproxy_stub_map.apiproxy.RegisterStub(
    94 #             'user', user_service_stub.UserServiceStub())
   101 #             'user', user_service_stub.UserServiceStub())
    95         os.environ['AUTH_DOMAIN'] = self.AUTH_DOMAIN
   102         os.environ['AUTH_DOMAIN'] = self.AUTH_DOMAIN
    96         os.environ['USER_EMAIL'] = self.LOGGED_IN_USER
   103         os.environ['USER_EMAIL'] = self.LOGGED_IN_USER
   147                 self.session = self.login(self.LOGGED_IN_USER, 'toto')
   154                 self.session = self.login(self.LOGGED_IN_USER, 'toto')
   148             else:
   155             else:
   149                 req = FakeRequest(vreg=self.vreg)
   156                 req = FakeRequest(vreg=self.vreg)
   150                 self.session = self.session_manager.open_session(req)
   157                 self.session = self.session_manager.open_session(req)
   151             self.user = self.session.user()
   158             self.user = self.session.user()
   152             
   159 
   153     def tearDown(self):
   160     def tearDown(self):
   154         self.session.close()
   161         self.session.close()
   155         
   162 
   156     def request(self):
   163     def request(self):
   157         req = FakeRequest(vreg=self.vreg)
   164         req = FakeRequest(vreg=self.vreg)
   158         req.set_connection(self.session, self.user)
   165         req.set_connection(self.session, self.user)
   159         return req
   166         return req
   160     
   167 
   161     def add_entity(self, etype, **kwargs):
   168     def add_entity(self, etype, **kwargs):
   162         cu = self.session.cursor()
   169         cu = self.session.cursor()
   163         rql = 'INSERT %s X' % etype
   170         rql = 'INSERT %s X' % etype
   164         if kwargs:
   171         if kwargs:
   165             rql += ': %s' % ', '.join('X %s %%(%s)s' % (key, key) for key in kwargs)
   172             rql += ': %s' % ', '.join('X %s %%(%s)s' % (key, key) for key in kwargs)
   172     def commit(self):
   179     def commit(self):
   173         self.session.commit()
   180         self.session.commit()
   174 
   181 
   175     def rollback(self):
   182     def rollback(self):
   176         self.session.rollback()
   183         self.session.rollback()
   177         
   184 
   178     def create_user(self, login, groups=('users',), req=None):
   185     def create_user(self, login, groups=('users',), req=None):
   179         assert not self.config['use-google-auth']
   186         assert not self.config['use-google-auth']
   180         user = self.add_entity('CWUser', upassword=str(login), login=unicode(login))
   187         user = self.add_entity('CWUser', upassword=str(login), login=unicode(login))
   181         cu = self.session.cursor()
   188         cu = self.session.cursor()
   182         cu.execute('SET X in_group G WHERE X eid %%(x)s, G name IN(%s)'
   189         cu.execute('SET X in_group G WHERE X eid %%(x)s, G name IN(%s)'
   188         assert not self.config['use-google-auth']
   195         assert not self.config['use-google-auth']
   189         req = FakeRequest(vreg=self.vreg)
   196         req = FakeRequest(vreg=self.vreg)
   190         req.form['__login'] = login
   197         req.form['__login'] = login
   191         req.form['__password'] = password or login
   198         req.form['__password'] = password or login
   192         return self.session_manager.open_session(req)
   199         return self.session_manager.open_session(req)
   193