def test_creates_readonly_session(monkeypatch): session_obj = pretend.stub(execute=pretend.call_recorder(lambda sql: None)) session_cls = pretend.call_recorder(lambda bind: session_obj) monkeypatch.setattr(db, "Session", session_cls) engine = pretend.stub() request = pretend.stub( registry={"sqlalchemy.engine": engine}, tm=pretend.stub(), matched_route=pretend.stub( predicates=[db.ReadOnlyPredicate(True, None)], ), add_finished_callback=pretend.call_recorder(lambda callback: None), ) request2 = pretend.stub(db=pretend.stub( close=pretend.call_recorder(lambda: None), ), ) register = pretend.call_recorder(lambda session, transaction_manager: None) monkeypatch.setattr(zope.sqlalchemy, "register", register) assert _create_session(request) is session_obj assert session_cls.calls == [pretend.call(bind=engine)] assert register.calls == [ pretend.call(session_obj, transaction_manager=request.tm), ] assert session_obj.execute.calls == [ pretend.call(""" SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE """), ] assert request.add_finished_callback.calls == [pretend.call(mock.ANY)] request.add_finished_callback.calls[0].args[0](request2) assert request2.db.close.calls == [pretend.call()]
def test_readonly_predicate(): assert db.ReadOnlyPredicate(False, None)(pretend.stub(), pretend.stub()) assert db.ReadOnlyPredicate(True, None)(pretend.stub(), pretend.stub())
tm=pretend.stub(doom=pretend.call_recorder(lambda: None)), read_only=False, add_finished_callback=lambda callback: None, user=pretend.stub(is_superuser=is_superuser), ) assert _create_session(request) is session_obj assert get.calls == [pretend.call("read-only")] assert request.tm.doom.calls == doom_calls @pytest.mark.parametrize( ("predicates", "expected"), [ ([], False), ([db.ReadOnlyPredicate(False, None)], False), ([object()], False), ([db.ReadOnlyPredicate(True, None)], True), ], ) def test_readonly(predicates, expected): request = pretend.stub(matched_route=pretend.stub(predicates=predicates)) assert _readonly(request) == expected def test_readonly_no_matched_route(): request = pretend.stub(matched_route=None) assert not _readonly(request) def test_readonly_predicate():
registry=pretend.stub(settings={"database.url": pretend.stub()}), ) alembic_config = _configure_alembic(config) assert alembic_config is config_obj assert alembic_config.set_main_option.calls == [ pretend.call("script_location", "warehouse:migrations"), pretend.call("url", config.registry.settings["database.url"]), ] @pytest.mark.parametrize( "predicates", [ [], [db.ReadOnlyPredicate(False, None)], [object()], ], ) def test_create_session(monkeypatch, predicates): session_obj = pretend.stub() session_cls = pretend.call_recorder(lambda bind: session_obj) monkeypatch.setattr(db, "Session", session_cls) engine = pretend.stub() request = pretend.stub( registry={"sqlalchemy.engine": engine}, tm=pretend.stub(), matched_route=pretend.stub(predicates=predicates), add_finished_callback=pretend.call_recorder(lambda callback: None), )