goa/testlib.py
changeset 1808 aa09e20dd8c0
parent 1802 d628defebc17
child 1977 606923dff11b
equal deleted inserted replaced
1693:49075f57cf2c 1808:aa09e20dd8c0
     1 from logilab.common.testlib import TestCase, mock_object
     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 
       
     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
     6 
    13 
    13 try:
    20 try:
    14     from google.appengine.api import apiproxy_stub_map
    21     from google.appengine.api import apiproxy_stub_map
    15     from google.appengine.api import datastore_file_stub
    22     from google.appengine.api import datastore_file_stub
    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     from cubicweb.goa.dbmyams import load_schema
       
    19     import_appengine_failed = None
    25     import_appengine_failed = None
    20 except ImportError, exc:
    26 except ImportError, exc:
    21     raise
    27     # XXX necessary ?
    22     class db:
    28     class db:
    23         class Model:
    29         class Model:
    24             pass
    30             pass
    25         class DummyProperty:
    31         class DummyProperty:
    26             def __init__(self, *args, **kwargs):
    32             def __init__(self, *args, **kwargs):
    30         BlobProperty = DummyProperty
    36         BlobProperty = DummyProperty
    31         DateProperty = DummyProperty
    37         DateProperty = DummyProperty
    32         ReferenceProperty = DummyProperty
    38         ReferenceProperty = DummyProperty
    33         SelfReferenceProperty = DummyProperty
    39         SelfReferenceProperty = DummyProperty
    34     import_appengine_failed = 'cannot import appengine: %s' % exc
    40     import_appengine_failed = 'cannot import appengine: %s' % exc
    35     
       
    36 
    41 
    37 from cubicweb import CW_SOFTWARE_ROOT
    42 
    38 from cubicweb.server.utils import crypt_password
       
    39 from cubicweb.devtools.fake import FakeRequest
    43 from cubicweb.devtools.fake import FakeRequest
    40 from cubicweb.goa.goavreg import GAERegistry
    44 from cubicweb.goa.goavreg import GAERegistry
    41 from cubicweb.goa.goaconfig import GAEConfiguration
    45 from cubicweb.goa.goaconfig import GAEConfiguration
    42 from cubicweb.goa.dbinit import (create_user, create_groups, fix_entities,
    46 from cubicweb.goa.dbinit import (create_user, create_groups, fix_entities,
    43                               init_persistent_schema, insert_versions)
    47                               init_persistent_schema, insert_versions)
    57     config = None
    61     config = None
    58     _DS_TEMPL_FILE = 'tmpdb-template'
    62     _DS_TEMPL_FILE = 'tmpdb-template'
    59 
    63 
    60     def load_schema_hook(self, loader):
    64     def load_schema_hook(self, loader):
    61         loader.import_yams_cube_schema('data')
    65         loader.import_yams_cube_schema('data')
    62     
    66 
    63     @property
    67     @property
    64     def DS_FILE(self):
    68     def DS_FILE(self):
    65         return self.DS_TEMPL_FILE.replace('-template', '')
    69         return self.DS_TEMPL_FILE.replace('-template', '')
    66     
    70 
    67     @property
    71     @property
    68     def DS_TEMPL_FILE(self):
    72     def DS_TEMPL_FILE(self):
    69         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))
    70 
    74 
    71     def _set_ds_file(self, dsfile):
    75     def _set_ds_file(self, dsfile):
    73         apiproxy_stub_map.apiproxy = apiproxy_stub_map.APIProxyStubMap()
    77         apiproxy_stub_map.apiproxy = apiproxy_stub_map.APIProxyStubMap()
    74         # Use a fresh stub datastore.
    78         # Use a fresh stub datastore.
    75         stub = datastore_file_stub.DatastoreFileStub(self.APP_ID, dsfile,
    79         stub = datastore_file_stub.DatastoreFileStub(self.APP_ID, dsfile,
    76                                                      dsfile+'.history')
    80                                                      dsfile+'.history')
    77         apiproxy_stub_map.apiproxy.RegisterStub('datastore_v3', stub)
    81         apiproxy_stub_map.apiproxy.RegisterStub('datastore_v3', stub)
    78         
    82 
    79     def setUp(self):
    83     def setUp(self):
    80         if import_appengine_failed:
    84         if import_appengine_failed:
    81             self.skip(import_appengine_failed)
    85             self.skip(import_appengine_failed)
    82         # Ensure we're in UTC.
    86         # Ensure we're in UTC.
    83         os.environ['TZ'] = 'UTC'
    87         os.environ['TZ'] = 'UTC'
    89         else:
    93         else:
    90             need_ds_init = True
    94             need_ds_init = True
    91             self._set_ds_file(self.DS_TEMPL_FILE)
    95             self._set_ds_file(self.DS_TEMPL_FILE)
    92 #         from google.appengine.api import mail_stub
    96 #         from google.appengine.api import mail_stub
    93 #         from google3.apphosting.api import urlfetch_stub
    97 #         from google3.apphosting.api import urlfetch_stub
    94 #         from google3.apphosting.api import user_service_stub        
    98 #         from google3.apphosting.api import user_service_stub
    95 #         # Use a fresh stub UserService.
    99 #         # Use a fresh stub UserService.
    96 #         apiproxy_stub_map.apiproxy.RegisterStub(
   100 #         apiproxy_stub_map.apiproxy.RegisterStub(
    97 #             'user', user_service_stub.UserServiceStub())
   101 #             'user', user_service_stub.UserServiceStub())
    98         os.environ['AUTH_DOMAIN'] = self.AUTH_DOMAIN
   102         os.environ['AUTH_DOMAIN'] = self.AUTH_DOMAIN
    99         os.environ['USER_EMAIL'] = self.LOGGED_IN_USER
   103         os.environ['USER_EMAIL'] = self.LOGGED_IN_USER
   150                 self.session = self.login(self.LOGGED_IN_USER, 'toto')
   154                 self.session = self.login(self.LOGGED_IN_USER, 'toto')
   151             else:
   155             else:
   152                 req = FakeRequest(vreg=self.vreg)
   156                 req = FakeRequest(vreg=self.vreg)
   153                 self.session = self.session_manager.open_session(req)
   157                 self.session = self.session_manager.open_session(req)
   154             self.user = self.session.user()
   158             self.user = self.session.user()
   155             
   159 
   156     def tearDown(self):
   160     def tearDown(self):
   157         self.session.close()
   161         self.session.close()
   158         
   162 
   159     def request(self):
   163     def request(self):
   160         req = FakeRequest(vreg=self.vreg)
   164         req = FakeRequest(vreg=self.vreg)
   161         req.set_connection(self.session, self.user)
   165         req.set_connection(self.session, self.user)
   162         return req
   166         return req
   163     
   167 
   164     def add_entity(self, etype, **kwargs):
   168     def add_entity(self, etype, **kwargs):
   165         cu = self.session.cursor()
   169         cu = self.session.cursor()
   166         rql = 'INSERT %s X' % etype
   170         rql = 'INSERT %s X' % etype
   167         if kwargs:
   171         if kwargs:
   168             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)
   175     def commit(self):
   179     def commit(self):
   176         self.session.commit()
   180         self.session.commit()
   177 
   181 
   178     def rollback(self):
   182     def rollback(self):
   179         self.session.rollback()
   183         self.session.rollback()
   180         
   184 
   181     def create_user(self, login, groups=('users',), req=None):
   185     def create_user(self, login, groups=('users',), req=None):
   182         assert not self.config['use-google-auth']
   186         assert not self.config['use-google-auth']
   183         user = self.add_entity('EUser', upassword=str(login), login=unicode(login))
   187         user = self.add_entity('CWUser', upassword=str(login), login=unicode(login))
   184         cu = self.session.cursor()
   188         cu = self.session.cursor()
   185         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)'
   186                     % ','.join(repr(g) for g in groups),
   190                     % ','.join(repr(g) for g in groups),
   187                     {'x': user.eid}, 'x')
   191                     {'x': user.eid}, 'x')
   188         return user
   192         return user
   191         assert not self.config['use-google-auth']
   195         assert not self.config['use-google-auth']
   192         req = FakeRequest(vreg=self.vreg)
   196         req = FakeRequest(vreg=self.vreg)
   193         req.form['__login'] = login
   197         req.form['__login'] = login
   194         req.form['__password'] = password or login
   198         req.form['__password'] = password or login
   195         return self.session_manager.open_session(req)
   199         return self.session_manager.open_session(req)
   196