Skip to content

Commit e1079a2

Browse files
author
maxim-lixakov
committed
[BREAKING] - remove is_deleted for Connection model
1 parent 5178354 commit e1079a2

File tree

6 files changed

+60
-48
lines changed

6 files changed

+60
-48
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add deletion of **connections** records instead of marking them as deleted

syncmaster/db/migrations/versions/2023-11-23_0004_create_connection_table.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ def upgrade():
3333
sa.Column("name", sa.String(length=128), nullable=False),
3434
sa.Column("description", sa.String(length=512), nullable=False),
3535
sa.Column("data", sa.JSON(), nullable=False),
36-
sa.Column("is_deleted", sa.Boolean(), nullable=False),
3736
sa.Column("created_at", sa.DateTime(), server_default=sa.text("now()"), nullable=False),
3837
sa.Column("updated_at", sa.DateTime(), server_default=sa.text("now()"), nullable=False),
3938
sa.Column("search_vector", postgresql.TSVECTOR(), sa.Computed(sql_expression, persisted=True), nullable=False),

syncmaster/db/models/connection.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
from sqlalchemy.dialects.postgresql import TSVECTOR
99
from sqlalchemy.orm import Mapped, declared_attr, mapped_column, relationship
1010

11-
from syncmaster.db.mixins import DeletableMixin, ResourceMixin, TimestampMixin
11+
from syncmaster.db.mixins import ResourceMixin, TimestampMixin
1212
from syncmaster.db.models.base import Base
1313
from syncmaster.db.models.group import Group
1414

1515

16-
class Connection(Base, ResourceMixin, DeletableMixin, TimestampMixin):
16+
class Connection(Base, ResourceMixin, TimestampMixin):
1717
data: Mapped[dict[str, Any]] = mapped_column(JSON, nullable=False, default={})
1818

1919
group: Mapped[Group] = relationship("Group")

syncmaster/db/repositories/connection.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ async def paginate(
3232
connection_type: list[str] | None = None,
3333
) -> Pagination:
3434
stmt = select(Connection).where(
35-
Connection.is_deleted.is_(False),
3635
Connection.group_id == group_id,
3736
)
3837
if search_query:
@@ -53,7 +52,7 @@ async def read_by_id(
5352
self,
5453
connection_id: int,
5554
) -> Connection:
56-
stmt = select(Connection).where(Connection.id == connection_id, Connection.is_deleted.is_(False))
55+
stmt = select(Connection).where(Connection.id == connection_id)
5756
result: ScalarResult[Connection] = await self._session.scalars(stmt)
5857
try:
5958
return result.one()
@@ -99,7 +98,6 @@ async def update(
9998

10099
return await self._update(
101100
Connection.id == connection_id,
102-
Connection.is_deleted.is_(False),
103101
name=name or connection.name,
104102
description=description or connection.description,
105103
data=data,

tests/test_unit/test_connections/test_copy_connection.py

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ async def test_maintainer_plus_can_copy_connection_with_delete_source(
4444
"user": "user",
4545
"password": "password",
4646
}
47-
assert not current.is_deleted
47+
assert current is not None
4848

4949
query_copy_not_exist = select(Connection).filter(
5050
Connection.group_id == empty_group.id,
@@ -73,14 +73,13 @@ async def test_maintainer_plus_can_copy_connection_with_delete_source(
7373
}
7474
assert result.status_code == 200
7575

76-
await session.refresh(group_connection.connection)
7776
query_prev_row = select(Connection).where(Connection.id == curr_id)
7877
result_prev_row = await session.scalars(query_prev_row)
79-
origin = result_prev_row.one()
78+
origin = result_prev_row.first()
8079

8180
q_creds_origin = select(AuthData).where(AuthData.connection_id == curr_id)
8281
creds_origin = await session.scalars(q_creds_origin)
83-
creds_origin = creds_origin.one()
82+
creds_origin = creds_origin.first()
8483

8584
query_new_row = select(Connection).filter(
8685
Connection.group_id == empty_group.id,
@@ -94,14 +93,25 @@ async def test_maintainer_plus_can_copy_connection_with_delete_source(
9493
creds_new = creds_new.one_or_none()
9594

9695
# Assert
97-
assert origin.id == curr_id
98-
assert decrypt_auth_data(creds_origin.value, settings) == {
99-
"type": "postgres",
100-
"user": "user",
101-
"password": "password",
102-
}
103-
assert origin.is_deleted == is_delete_source
104-
assert not new.is_deleted
96+
97+
if not is_delete_source:
98+
assert origin.id == curr_id
99+
assert decrypt_auth_data(creds_origin.value, settings) == {
100+
"type": "postgres",
101+
"user": "user",
102+
"password": "password",
103+
}
104+
105+
session.expunge(current)
106+
origin = await session.get(Connection, current.id)
107+
if is_delete_source:
108+
# Assert that origin connection was deleted
109+
assert origin is None
110+
else:
111+
# Assert that origin connection was not deleted
112+
assert origin is not None
113+
114+
assert new is not None
105115
assert not creds_new
106116

107117

@@ -132,7 +142,7 @@ async def test_superuser_can_copy_connection(
132142
"user": "user",
133143
"password": "password",
134144
}
135-
assert not current.is_deleted
145+
assert current is not None
136146

137147
query_copy_not_exist = select(Connection).filter(
138148
Connection.group_id == empty_group.id,
@@ -161,37 +171,36 @@ async def test_superuser_can_copy_connection(
161171
}
162172
assert result.status_code == 200
163173

164-
query_prev_row = select(Connection).where(Connection.id == curr_id)
165-
result_prev_row = await session.scalars(query_prev_row)
166-
origin = result_prev_row.one()
167174
query_new_row = select(Connection).filter(
168175
Connection.group_id == empty_group.id,
169176
Connection.name == group_connection.name,
170177
)
171178
result_new_row = await session.scalars(query_new_row)
172179
new = result_new_row.one() # copied
173180

174-
# Assert
175-
await session.refresh(group_connection.connection)
176-
177-
q_creds_origin = select(AuthData).where(AuthData.connection_id == origin.id)
181+
q_creds_origin = select(AuthData).where(AuthData.connection_id == current.id)
178182
creds_origin = await session.scalars(q_creds_origin)
179-
creds_origin = creds_origin.one()
183+
creds_origin = creds_origin.first()
180184

181185
q_creds_new = select(AuthData).where(AuthData.connection_id == new.id)
182186
creds_new = await session.scalars(q_creds_new)
183187
creds_new = creds_new.one_or_none()
184188

185-
assert origin.id == curr_id
186-
assert origin.group_id == curr_group_id
187-
assert decrypt_auth_data(creds_origin.value, settings) == {
188-
"type": "postgres",
189-
"user": "user",
190-
"password": "password",
191-
}
192-
assert origin.is_deleted == is_delete_source
193-
assert not new.is_deleted
194-
assert not creds_new
189+
# Assert
190+
session.expunge(current)
191+
origin = await session.get(Connection, current.id)
192+
if is_delete_source:
193+
# Assert that origin connection was deleted
194+
assert origin is None
195+
else:
196+
assert origin.id == curr_id
197+
assert origin.group_id == curr_group_id
198+
assert decrypt_auth_data(creds_origin.value, settings) == {
199+
"type": "postgres",
200+
"user": "user",
201+
"password": "password",
202+
}
203+
assert not creds_new
195204

196205

197206
async def test_unauthorized_user_cannot_copy_connection(
@@ -291,7 +300,7 @@ async def test_not_in_both_groups_user_can_not_copy_connection(
291300
"user": "user",
292301
"password": "password",
293302
}
294-
assert not current.is_deleted
303+
assert current is not None
295304

296305
query_copy_not_exist = select(Connection).filter(
297306
Connection.group_id == empty_group.id,
@@ -349,7 +358,7 @@ async def test_groupless_user_can_not_copy_connection(
349358
"user": "user",
350359
"password": "password",
351360
}
352-
assert not current.is_deleted
361+
assert current is not None
353362

354363
query_copy_not_exist = select(Connection).filter(
355364
Connection.group_id == empty_group.id,

tests/test_unit/test_connections/test_delete_connection.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ async def test_maintainer_plus_can_delete_connection(
1414
role_maintainer_plus: UserTestRoles,
1515
session: AsyncSession,
1616
):
17-
# Arraange
17+
# Arrange
1818
user = group_connection.owner_group.get_member_of_role(role_maintainer_plus)
1919
connection_id = group_connection.connection.id
2020
connection = await session.get(Connection, connection_id)
21-
assert not connection.is_deleted
21+
assert connection is not None
2222

2323
# Act
2424
result = await client.delete(
@@ -33,9 +33,10 @@ async def test_maintainer_plus_can_delete_connection(
3333
"message": "Connection was deleted",
3434
}
3535
assert result.status_code == 200
36-
deleted_connection = await session.get(Connection, connection_id)
37-
await session.refresh(deleted_connection)
38-
assert deleted_connection.is_deleted
36+
37+
session.expunge(connection)
38+
connection = await session.get(Connection, connection_id)
39+
assert connection is None
3940

4041

4142
async def test_groupless_user_cannot_delete_connection(
@@ -59,8 +60,10 @@ async def test_groupless_user_cannot_delete_connection(
5960
"details": None,
6061
},
6162
}
62-
await session.refresh(group_connection.connection)
63-
assert not group_connection.connection.is_deleted
63+
64+
session.expunge(group_connection)
65+
connection = await session.get(Connection, group_connection.id)
66+
assert connection is not None
6467

6568

6669
async def test_maintainer_plus_cannot_delete_connection_with_linked_transfer(
@@ -87,8 +90,10 @@ async def test_maintainer_plus_cannot_delete_connection_with_linked_transfer(
8790
},
8891
}
8992
assert result.status_code == 409
90-
await session.refresh(group_transfer.source_connection)
91-
assert not group_transfer.source_connection.is_deleted
93+
94+
session.expunge(group_transfer.source_connection)
95+
connection = await session.get(Connection, group_transfer.source_connection.id)
96+
assert connection is not None
9297

9398

9499
async def test_other_group_member_cannot_delete_group_connection(

0 commit comments

Comments
 (0)