def test_sanity_fail_if_table_definition_is_missing(ini_settings, dbsession): """See database sanity check raises a RuntimeError if table definition is missing.""" engine = engine_from_config(ini_settings, 'sqlalchemy.') conn = engine.connect() conn.begin() Session = sessionmaker(bind=engine) session = Session() Base, DeclarativeTestModel = gen_declarative() try: Base.metadata.drop_all(engine, tables=[DeclarativeTestModel.__table__]) except sqlalchemy.exc.NoSuchTableError: pass Base.metadata.create_all(engine, tables=[DeclarativeTestModel.__table__]) # Delete __tablename__ and __table__ attributes to force a table definition missing error. del (DeclarativeTestModel.__tablename__) del (DeclarativeTestModel.__table__) with pytest.raises(RuntimeError) as exc: is_sane_database(Base, session) assert exc.value.args[ 0] == "Table definition missing for DeclarativeTestModel" Base.metadata.drop_all(engine)
def sanity_check(self): """Perform post-initialization sanity checks. This is run on every startup to check that the database table schema matches our model definitions. If there are un-run migrations this will bail out and do not let the problem to escalate later. See also: :ref:`websauna.sanity_check`. """ import sqlalchemy.exc from websauna.system.model import sanitycheck from websauna.system.model.meta import Base from websauna.system.model.meta import create_dbsession from websauna.system.core import redis dbsession = create_dbsession(self.config.registry) db_connection_string = self.config.registry.settings.get( "sqlalchemy.url") try: if not sanitycheck.is_sane_database(Base, dbsession): raise SanityCheckFailed( "The database sanity check failed. Check log for details.") except sqlalchemy.exc.OperationalError as e: raise SanityCheckFailed( "The database {} is not responding.\nMake sure the database is running on your local computer or correctly configured in settings INI file.\nFor more information see https://websauna.org/docs/tutorials/gettingstarted/tutorial_02.html." .format(db_connection_string)) from e dbsession.close() if self._has_redis_sessions: if not redis.is_sane_redis(self.config): raise SanityCheckFailed( "Could not connect to Redis server.\nWebsauna is configured to use Redis server for session data.\nIt cannot start up without a running Redis server.\nPlease consult your operating system community how to install and start a Redis server." )
def sanity_check(self): """Perform post-initialization sanity checks. This is run on every startup to check that the database table schema matches our model definitions. If there are un-run migrations this will bail out and do not let the problem to escalate later. See also: :ref:`websauna.sanity_check`. """ from websauna.system.model import sanitycheck from websauna.system.model.meta import Base from websauna.system.model.meta import create_dbsession from websauna.system.core import redis dbsession = create_dbsession(self.config.registry) if not sanitycheck.is_sane_database(Base, dbsession): raise SanityCheckFailed( "The database sanity check failed. Check log for details.") dbsession.close() if self._has_redis_sessions: if not redis.is_sane_redis(self.config): raise SanityCheckFailed( "Could not connect to Redis server.\nWebsauna is configured to use Redis server for session data.\nIt cannot start up without a running Redis server.\nPlease consult your operating system community how to install and start a Redis server." )
def sanity_check(self): """Perform post-initialization sanity checks. This is run on every startup to check that the database table schema matches our model definitions. If there are un-run migrations this will bail out and do not let the problem to escalate later. See also: :ref:`websauna.sanity_check`. """ import sqlalchemy.exc from websauna.system.model import sanitycheck from websauna.system.model.meta import Base from websauna.system.model.meta import create_dbsession from websauna.system.core import redis dbsession = create_dbsession(self.config.registry) db_connection_string = self.config.registry.settings.get("sqlalchemy.url") try: if not sanitycheck.is_sane_database(Base, dbsession): raise SanityCheckFailed("The database sanity check failed. Check log for details.") except sqlalchemy.exc.OperationalError as e: raise SanityCheckFailed("The database {} is not responding. Make sure the database is running on your local computer or correctly configured in settings INI file. For more information see https://websauna.org/docs/tutorials/gettingstarted/tutorial_02.html.".format(db_connection_stringg)) from e dbsession.close() if self._has_redis_sessions: if not redis.is_sane_redis(self.config): raise SanityCheckFailed("Could not connect to Redis server.\nWebsauna is configured to use Redis server for session data.\nIt cannot start up without a running Redis server.\nPlease consult your operating system community how to install and start a Redis server.")
def test_sanity_pass_relationship(ini_settings, dbsession): """See database sanity check understands about relationships and don't deem them as missing column.""" engine = engine_from_config(ini_settings, 'sqlalchemy.') conn = engine.connect() conn.begin() Session = sessionmaker(bind=engine) session = Session() Base, RelationTestModel, RelationTestModel2 = gen_relation_models() try: Base.metadata.drop_all( engine, tables=[RelationTestModel.__table__, RelationTestModel2.__table__]) except sqlalchemy.exc.NoSuchTableError: pass Base.metadata.create_all( engine, tables=[RelationTestModel.__table__, RelationTestModel2.__table__]) try: assert is_sane_database(Base, session) is True finally: Base.metadata.drop_all(engine)
def test_sanity_column_missing(ini_settings, dbsession): """See check fails when there is a missing table""" engine = engine_from_config(ini_settings, 'sqlalchemy.') conn = engine.connect() conn.begin() Session = sessionmaker(bind=engine) session = Session() Base, SaneTestModel = gen_test_model() try: Base.metadata.drop_all(engine, tables=[SaneTestModel.__table__]) except sqlalchemy.exc.NoSuchTableError: pass Base.metadata.create_all(engine, tables=[SaneTestModel.__table__]) # Delete one of the columns if engine.dialect.name == "sqlite": # SQLite doesn't support alter table # TODO: Add some sort of py.test marker return else: engine.execute("ALTER TABLE sanity_check_test DROP COLUMN id") assert is_sane_database(Base, session) is False
def test_sanity_table_missing(ini_settings, dbsession): """See check fails when there is a missing table""" engine = engine_from_config(ini_settings, 'sqlalchemy.') conn = engine.connect() conn.begin() Base, SaneTestModel = gen_test_model() Session = sessionmaker(bind=engine) session = Session() try: Base.metadata.drop_all(engine, tables=[SaneTestModel.__table__]) except sqlalchemy.exc.NoSuchTableError: pass assert is_sane_database(Base, session) is False
def test_sanity_table_missing(ini_settings, dbsession): """See check fails when there is a missing table""" engine = engine_from_config(ini_settings, 'sqlalchemy.') conn = engine.connect() trans = conn.begin() Base, SaneTestModel = gen_test_model() Session = sessionmaker(bind=engine) session = Session() try: Base.metadata.drop_all(engine, tables=[SaneTestModel.__table__]) except sqlalchemy.exc.NoSuchTableError: pass assert is_sane_database(Base, session) is False
def sanity_check(self): """Perform post-initialization sanity checks. This is run on every startup to check that the database table schema matches our model definitions. If there are un-run migrations this will bail out and do not let the problem to escalate later. """ from websauna.system.model import sanitycheck from websauna.system.model.meta import Base from websauna.system.model.meta import create_dbsession from websauna.system.core import redis dbsession = create_dbsession(self.config.registry) if not sanitycheck.is_sane_database(Base, dbsession): raise SanityCheckFailed("The database sanity check failed. Check log for details.") dbsession.close() if self._has_redis_sessions: if not redis.is_sane_redis(self.config): raise SanityCheckFailed("Could not connect to Redis server.\nWebsauna is configured to use Redis server for session data.\nIt cannot start up without a running Redis server.\nPlease consult your operating system community how to install and start a Redis server.")
def test_sanity_pass(ini_settings, dbsession): """See database sanity check completes when tables and columns are created.""" engine = engine_from_config(ini_settings, 'sqlalchemy.') conn = engine.connect() conn.begin() Base, SaneTestModel = gen_test_model() Session = sessionmaker(bind=engine) session = Session() try: Base.metadata.drop_all(engine, tables=[SaneTestModel.__table__]) except sqlalchemy.exc.NoSuchTableError: pass Base.metadata.create_all(engine, tables=[SaneTestModel.__table__]) try: assert is_sane_database(Base, session) is True finally: Base.metadata.drop_all(engine)
def test_sanity_column_missing(ini_settings, dbsession): """See check fails when there is a missing table""" engine = engine_from_config(ini_settings, 'sqlalchemy.') conn = engine.connect() conn.begin() Session = sessionmaker(bind=engine) session = Session() Base, SaneTestModel = gen_test_model() try: Base.metadata.drop_all(engine, tables=[SaneTestModel.__table__]) except sqlalchemy.exc.NoSuchTableError: pass Base.metadata.create_all(engine, tables=[SaneTestModel.__table__]) # Delete one of the columns engine.execute("ALTER TABLE sanity_check_test DROP COLUMN id") assert is_sane_database(Base, session) is False
def test_sanity_column_missing(ini_settings, dbsession): """See check fails when there is a missing table""" engine = engine_from_config(ini_settings, 'sqlalchemy.') conn = engine.connect() trans = conn.begin() Session = sessionmaker(bind=engine) session = Session() Base, SaneTestModel = gen_test_model() try: Base.metadata.drop_all(engine, tables=[SaneTestModel.__table__]) except sqlalchemy.exc.NoSuchTableError: pass Base.metadata.create_all(engine, tables=[SaneTestModel.__table__]) # Delete one of the columns engine.execute("ALTER TABLE sanity_check_test DROP COLUMN id") assert is_sane_database(Base, session) is False
def test_sanity_pass(ini_settings, dbsession): """See database sanity check completes when tables and columns are created.""" engine = engine_from_config(ini_settings, 'sqlalchemy.') conn = engine.connect() trans = conn.begin() Base, SaneTestModel = gen_test_model() Session = sessionmaker(bind=engine) session = Session() try: Base.metadata.drop_all(engine, tables=[SaneTestModel.__table__]) except sqlalchemy.exc.NoSuchTableError: pass Base.metadata.create_all(engine, tables=[SaneTestModel.__table__]) try: assert is_sane_database(Base, session) is True finally: Base.metadata.drop_all(engine)
def test_sanity_pass_declarative(ini_settings, dbsession): """See database sanity check understands about relationships and don't deem them as missing column.""" engine = engine_from_config(ini_settings, 'sqlalchemy.') conn = engine.connect() trans = conn.begin() Session = sessionmaker(bind=engine) session = Session() Base, DeclarativeTestModel = gen_declarative() try: Base.metadata.drop_all(engine, tables=[DeclarativeTestModel.__table__]) except sqlalchemy.exc.NoSuchTableError: pass Base.metadata.create_all(engine, tables=[DeclarativeTestModel.__table__]) try: assert is_sane_database(Base, session) is True finally: Base.metadata.drop_all(engine)
def test_sanity_pass_with_non_declarative_objects(ini_settings, dbsession): """See database sanity check does not complain about non declarative objects.""" engine = engine_from_config(ini_settings, 'sqlalchemy.') conn = engine.connect() conn.begin() Session = sessionmaker(bind=engine) session = Session() Base, tables = gen_non_declarative_table() try: Base.metadata.drop_all(engine, tables=tables) except sqlalchemy.exc.NoSuchTableError: pass Base.metadata.create_all(engine, tables=tables) try: assert is_sane_database(Base, session) is True finally: Base.metadata.drop_all(engine, tables=tables)