diff --git a/src/migrations/env.py b/src/migrations/env.py index 58a89af..0d0adce 100644 --- a/src/migrations/env.py +++ b/src/migrations/env.py @@ -1,13 +1,13 @@ from logging.config import fileConfig +from alembic import context +from sqlalchemy import create_engine, pool from src.models.database_models import Model from src.models.database_models.model import engine -from sqlalchemy import engine_from_config -from sqlalchemy import pool - -from alembic import context +sync_url = engine.url.render_as_string(hide_password=False).replace("+aiosqlite", "") +sync_engine = create_engine(sync_url, poolclass=pool.NullPool) # this is the Alembic Config object, which provides # access to the values within the .ini file in use. @@ -23,7 +23,7 @@ if config.config_file_name is not None: # from myapp import mymodel # target_metadata = mymodel.Base.metadata target_metadata = Model.metadata -config.set_main_option("sqlalchemy.url", engine.url.render_as_string(hide_password=False)) +config.set_main_option("sqlalchemy.url", sync_url) # other values from the config, defined by the needs of env.py, # can be acquired: @@ -62,13 +62,8 @@ def run_migrations_online() -> None: and associate a connection with the context. """ - connectable = engine_from_config( - config.get_section(config.config_ini_section, {}), - prefix="sqlalchemy.", - poolclass=pool.NullPool, - ) - with connectable.connect() as connection: + with sync_engine.connect() as connection: context.configure( connection=connection, target_metadata=target_metadata, render_as_batch=True ) diff --git a/src/migrations/versions/ebe80cd28822_.py b/src/migrations/versions/ebe80cd28822_.py new file mode 100644 index 0000000..9ec7bdd --- /dev/null +++ b/src/migrations/versions/ebe80cd28822_.py @@ -0,0 +1,46 @@ +"""empty message + +Revision ID: ebe80cd28822 +Revises: 74814eb1b7f8 +Create Date: 2026-08-21 13:52:49.788041 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'ebe80cd28822' +down_revision: Union[str, Sequence[str], None] = '74814eb1b7f8' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('user_direct_permissions', schema=None) as batch_op: + batch_op.drop_constraint(batch_op.f('fk_user_direct_permissions_user_id_users'), type_='foreignkey') + batch_op.create_foreign_key(batch_op.f('fk_user_direct_permissions_user_id_users'), 'users', ['user_id'], ['id'], ondelete='CASCADE') + + with op.batch_alter_table('user_group', schema=None) as batch_op: + batch_op.drop_constraint(batch_op.f('fk_user_group_user_id_users'), type_='foreignkey') + batch_op.create_foreign_key(batch_op.f('fk_user_group_user_id_users'), 'users', ['user_id'], ['id'], ondelete='CASCADE') + + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('user_group', schema=None) as batch_op: + batch_op.drop_constraint(batch_op.f('fk_user_group_user_id_users'), type_='foreignkey') + batch_op.create_foreign_key(batch_op.f('fk_user_group_user_id_users'), 'users', ['user_id'], ['id']) + + with op.batch_alter_table('user_direct_permissions', schema=None) as batch_op: + batch_op.drop_constraint(batch_op.f('fk_user_direct_permissions_user_id_users'), type_='foreignkey') + batch_op.create_foreign_key(batch_op.f('fk_user_direct_permissions_user_id_users'), 'users', ['user_id'], ['id']) + + # ### end Alembic commands ### diff --git a/src/models/database_models/model.py b/src/models/database_models/model.py index 0bca485..ddd0e19 100644 --- a/src/models/database_models/model.py +++ b/src/models/database_models/model.py @@ -75,14 +75,14 @@ class Permissions(Model): user_group_of_permissions=Table( "user_group", Model.metadata, - Column("user_id", ForeignKey("users.id"), primary_key=True), + Column("user_id", ForeignKey("users.id", ondelete="CASCADE"), primary_key=True), Column("permission_group_id", ForeignKey("groups_of_permissions.id"), primary_key=True) ) user_permission=Table( "user_direct_permissions", Model.metadata, - Column("user_id",ForeignKey("users.id"), primary_key=True), + Column("user_id",ForeignKey("users.id", ondelete="CASCADE"), primary_key=True), Column("permission_id", ForeignKey("permissions.id"), primary_key=True) ) diff --git a/tests/e2e/test_users_crud.py b/tests/e2e/test_users_crud.py index 84b436e..6491bab 100644 --- a/tests/e2e/test_users_crud.py +++ b/tests/e2e/test_users_crud.py @@ -241,7 +241,7 @@ class TestCrud: @pytest.mark.parametrize("test_user_fixture", [ - ([], []) + (["admin"], ["admin_group"]) ], indirect=True) @pytest.mark.parametrize("user_record_to_update, expected_exception, expected_status",[ pytest.param({"plain_password": "Wrong_pass"},HTTPStatusError,422,id="Wrong_password"), diff --git a/tests/integrated/test_auth.py b/tests/integrated/test_auth.py index 46ec0a5..7424d1e 100644 --- a/tests/integrated/test_auth.py +++ b/tests/integrated/test_auth.py @@ -48,7 +48,7 @@ class TestAuth: @pytest.mark.parametrize("user_data, uuid, expected_exception,expected_status",[ pytest.param(SimpleNamespace(first_name="test",last_name="test",middle_name="test",email="d@d.d",direct_permissions=[],group=[],status=False), uuid4(), HTTPException,401, id="false_status"), pytest.param(SimpleNamespace(first_name="test",last_name="test",middle_name="test",email="d@d.d",direct_permissions=[],group=[],status=True),1234, HTTPException,401, id="wrong_id"), - pytest.param(SimpleNamespace(status=True),uuid4(), ValidationError,None,id="empty_model_data") + pytest.param(SimpleNamespace(status=True,direct_permissions=[],group=[]),uuid4(), ValidationError,None,id="empty_model_data") ]) async def test_get_current_user_negative(self,current_user_service:CurrentUserService, jwt_service:JwtService, monkeypatch, user_data:SimpleNamespace,expected_exception, expected_status:int, uuid)->None: diff --git a/tests/integrated/test_crud.py b/tests/integrated/test_users_crud.py similarity index 100% rename from tests/integrated/test_crud.py rename to tests/integrated/test_users_crud.py