def db(request): """ Require a Mongo test database. Provides a Mongo test database named after the requesting test function. Mongo databases are created/destroyed based on the URI provided with the --mongo-uri option and tear-down behavior is modified by the --keep-db option. """ from girder.models import _dbClients, getDbConnection, pymongo from girder.models import model_base from girder.models.user import User from girder.external import mongodb_proxy mockDb = request.config.getoption('--mock-db') dbUri = request.config.getoption('--mongo-uri') dbName = 'girder_test_%s' % hashlib.md5(_uid( request.node).encode('utf8')).hexdigest() keepDb = request.config.getoption('--keep-db') executable_methods = mongodb_proxy.EXECUTABLE_MONGO_METHODS realMongoClient = pymongo.MongoClient if mockDb: mongodb_proxy.EXECUTABLE_MONGO_METHODS = set() pymongo.MongoClient = mongomock.MongoClient connection = getDbConnection(uri='%s/%s' % (dbUri, dbName), quiet=False) # Force getDbConnection from models to return our connection _dbClients[(None, None)] = connection connection.drop_database(dbName) # Since models store a local reference to the current database, we need to force them all to # reconnect for model in model_base._modelSingletons: model.reconnect() # Use faster password hashing to avoid unnecessary testing bottlenecks. Any test case # that creates a user goes through the password hashing process, so we avoid actual bcrypt. originalCryptContext = User()._cryptContext User()._cryptContext = originalCryptContext.copy(schemes=['plaintext']) yield connection User()._cryptContext = originalCryptContext if not keepDb: connection.drop_database(dbName) connection.close() # Clear connection cache and model singletons _dbClients.clear() for model in model_base._modelSingletons: model.__class__._instance = None if mockDb: mongodb_proxy.EXECUTABLE_MONGO_METHODS = executable_methods pymongo.MongoClient = realMongoClient
def fastCrypt(): """ Use faster password hashing to avoid unnecessary testing bottlenecks. """ from girder.models.user import User # CryptContext.update could be used to mutate the existing instance, but if this fixture's scope # is ever made more limited (so that the teardown matters), this approach is more maintainable originalCryptContext = User()._cryptContext User()._cryptContext = originalCryptContext.copy(schemes=['plaintext']) yield User()._cryptContext = originalCryptContext