|
4 | 4 |
|
5 | 5 | import pytest
|
6 | 6 | from h_matchers import Any
|
7 |
| -from sqlalchemy import Select, func, select |
| 7 | +from sqlalchemy import Select, func, inspect, select |
8 | 8 |
|
9 | 9 | from h.models import (
|
10 | 10 | Annotation,
|
|
13 | 13 | Flag,
|
14 | 14 | Group,
|
15 | 15 | GroupMembership,
|
| 16 | + GroupMembershipRoles, |
16 | 17 | Job,
|
17 | 18 | Token,
|
18 | 19 | User,
|
@@ -302,51 +303,74 @@ def test_delete_annotations(
|
302 | 303 | ).only()
|
303 | 304 | )
|
304 | 305 |
|
305 |
| - def test_delete_groups(self, user, db_session, worker, factories, purger): |
306 |
| - factories.Group(creator=user) |
307 |
| - |
308 |
| - purger.delete_groups(user) |
| 306 | + def test_delete_groups(self, user, worker, factories, purger): |
| 307 | + def make_group(name, owner=user): |
| 308 | + """Create and return a group that `owner` is the only owner of.""" |
| 309 | + return factories.Group( |
| 310 | + name=name, |
| 311 | + memberships=[ |
| 312 | + GroupMembership(user=owner, roles=[GroupMembershipRoles.OWNER]) |
| 313 | + ], |
| 314 | + ) |
309 | 315 |
|
310 |
| - worker.delete.assert_called_once_with(Group, Any.instance_of(Select)) |
311 |
| - assert ( |
312 |
| - db_session.scalars(select(Group).where(Group.creator == user)).all() == [] |
313 |
| - ) |
| 316 | + # A list of groups that should be deleted when `user` is deleted. |
| 317 | + should_be_deleted = [] |
| 318 | + |
| 319 | + # A group that `user` is the only owner of, this group should be |
| 320 | + # deleted when `user` is deleted. |
| 321 | + should_be_deleted.append(make_group("only_owner")) |
| 322 | + |
| 323 | + # A group that `user` is the only owner of but that has other non-owner |
| 324 | + # members. This group should still be deleted. |
| 325 | + group = make_group("other_members") |
| 326 | + for role in GroupMembershipRoles: |
| 327 | + if role == GroupMembershipRoles.OWNER: |
| 328 | + continue |
| 329 | + group.memberships.append( |
| 330 | + GroupMembership(user=factories.User(), roles=[role]) |
| 331 | + ) |
| 332 | + should_be_deleted.append(group) |
314 | 333 |
|
315 |
| - def test_delete_groups_still_deletes_groups_if_they_have_deleted_annotations( |
316 |
| - self, user, db_session, factories, purger |
317 |
| - ): |
318 |
| - group = factories.Group(creator=user) |
319 |
| - # An annotation in the group, but the annotation has already been |
320 |
| - # marked as deleted (meaning it'll soon be purged from the DB) so this |
321 |
| - # shouldn't prevent the group from being deleted. |
| 334 | + # A group that `user` is the only owner of but that contains a |
| 335 | + # deleted annotation by another user. This group should still be |
| 336 | + # deleted. |
| 337 | + group = make_group("deleted_annotation") |
322 | 338 | factories.Annotation(group=group, deleted=True)
|
323 |
| - |
324 |
| - purger.delete_groups(user) |
325 |
| - |
326 |
| - assert ( |
327 |
| - db_session.scalars(select(Group).where(Group.creator == user)).all() == [] |
| 339 | + should_be_deleted.append(group) |
| 340 | + |
| 341 | + # A list of groups that should *not* be deleted when `user` is deleted. |
| 342 | + should_not_be_deleted = [] |
| 343 | + |
| 344 | + # A group that has one owner, but `user` isn't a member of this group. |
| 345 | + should_not_be_deleted.append(make_group("other_owner", owner=factories.User())) |
| 346 | + |
| 347 | + # Some groups that have one owner but `user` is a non-owner member. |
| 348 | + for role in GroupMembershipRoles: |
| 349 | + if role == GroupMembershipRoles.OWNER: |
| 350 | + continue |
| 351 | + group = make_group(role, owner=factories.User()) |
| 352 | + group.memberships.append(GroupMembership(user=user, roles=[role])) |
| 353 | + should_not_be_deleted.append(group) |
| 354 | + |
| 355 | + # A group that `user` is an owner of but that also has another owner. |
| 356 | + group = make_group("another_owner") |
| 357 | + group.memberships.append( |
| 358 | + GroupMembership(user=factories.User(), roles=[GroupMembershipRoles.OWNER]) |
328 | 359 | )
|
| 360 | + should_not_be_deleted.append(group) |
329 | 361 |
|
330 |
| - def test_delete_groups_doesnt_delete_groups_created_by_other_users( |
331 |
| - self, user, db_session, factories, purger |
332 |
| - ): |
333 |
| - group = factories.Group() |
334 |
| - |
335 |
| - purger.delete_groups(user) |
336 |
| - |
337 |
| - assert group in db_session.scalars(select(Group)).all() |
338 |
| - |
339 |
| - def test_delete_groups_doesnt_delete_groups_with_annotations( |
340 |
| - self, user, db_session, factories, purger |
341 |
| - ): |
342 |
| - group = factories.Group(creator=user) |
343 |
| - # The group contains an annotation by another user. |
344 |
| - # This should prevent the group from being deleted. |
345 |
| - factories.Annotation(group=group) |
| 362 | + # A group that `user` is the only owner of but that contains an annotation from another user. |
| 363 | + group = make_group("annotation") |
| 364 | + factories.Annotation(group=group, deleted=False) |
| 365 | + should_not_be_deleted.append(group) |
346 | 366 |
|
347 | 367 | purger.delete_groups(user)
|
348 | 368 |
|
349 |
| - assert group in db_session.scalars(select(Group)).all() |
| 369 | + worker.delete.assert_called_once_with(Group, Any.instance_of(Select)) |
| 370 | + for group in should_not_be_deleted: |
| 371 | + assert not inspect(group).deleted |
| 372 | + for group in should_be_deleted: |
| 373 | + assert inspect(group).deleted |
350 | 374 |
|
351 | 375 | def test_delete_group_memberships(
|
352 | 376 | self, user, factories, purger, worker, db_session
|
|
0 commit comments