2023-03-21 13:21:03 +00:00
|
|
|
from __future__ import annotations
|
|
|
|
|
|
2016-11-23 23:49:53 +00:00
|
|
|
from django.test import TestCase
|
2023-03-16 20:46:15 +00:00
|
|
|
from django.utils.connection import ConnectionDoesNotExist
|
2016-11-23 23:49:53 +00:00
|
|
|
|
2017-02-15 23:00:10 +00:00
|
|
|
from tests.models import SoftDeletable
|
2016-11-23 23:49:53 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class SoftDeletableModelTests(TestCase):
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_can_only_see_not_removed_entries(self) -> None:
|
2025-12-15 16:23:36 +00:00
|
|
|
SoftDeletable.available_objects.create(name='a', is_removed=True) # type: ignore[misc]
|
|
|
|
|
SoftDeletable.available_objects.create(name='b', is_removed=False) # type: ignore[misc]
|
2016-11-23 23:49:53 +00:00
|
|
|
|
2020-08-12 10:25:34 +00:00
|
|
|
queryset = SoftDeletable.available_objects.all()
|
2016-11-23 23:49:53 +00:00
|
|
|
|
|
|
|
|
self.assertEqual(queryset.count(), 1)
|
2025-12-15 16:23:36 +00:00
|
|
|
self.assertEqual(queryset[0].name, 'b') # type: ignore[attr-defined]
|
2016-11-23 23:49:53 +00:00
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_instance_cannot_be_fully_deleted(self) -> None:
|
2025-12-15 16:23:36 +00:00
|
|
|
instance = SoftDeletable.available_objects.create(name='a') # type: ignore[misc]
|
2016-11-23 23:49:53 +00:00
|
|
|
|
|
|
|
|
instance.delete()
|
|
|
|
|
|
2020-08-12 10:25:34 +00:00
|
|
|
self.assertEqual(SoftDeletable.available_objects.count(), 0)
|
2016-11-23 23:49:53 +00:00
|
|
|
self.assertEqual(SoftDeletable.all_objects.count(), 1)
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_instance_cannot_be_fully_deleted_via_queryset(self) -> None:
|
2025-12-15 16:23:36 +00:00
|
|
|
SoftDeletable.available_objects.create(name='a') # type: ignore[misc]
|
2016-11-23 23:49:53 +00:00
|
|
|
|
2020-08-12 10:25:34 +00:00
|
|
|
SoftDeletable.available_objects.all().delete()
|
2016-11-23 23:49:53 +00:00
|
|
|
|
2020-08-12 10:25:34 +00:00
|
|
|
self.assertEqual(SoftDeletable.available_objects.count(), 0)
|
2016-11-23 23:49:53 +00:00
|
|
|
self.assertEqual(SoftDeletable.all_objects.count(), 1)
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_delete_instance_no_connection(self) -> None:
|
2025-12-15 16:23:36 +00:00
|
|
|
obj = SoftDeletable.available_objects.create(name='a') # type: ignore[misc]
|
2016-11-23 23:49:53 +00:00
|
|
|
|
|
|
|
|
self.assertRaises(ConnectionDoesNotExist, obj.delete, using='other')
|
2016-11-28 23:31:16 +00:00
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_instance_purge(self) -> None:
|
2025-12-15 16:23:36 +00:00
|
|
|
instance = SoftDeletable.available_objects.create(name='a') # type: ignore[misc]
|
2016-11-28 23:31:16 +00:00
|
|
|
|
2016-11-28 23:45:48 +00:00
|
|
|
instance.delete(soft=False)
|
2016-11-28 23:31:16 +00:00
|
|
|
|
2020-08-12 10:25:34 +00:00
|
|
|
self.assertEqual(SoftDeletable.available_objects.count(), 0)
|
2016-11-28 23:31:16 +00:00
|
|
|
self.assertEqual(SoftDeletable.all_objects.count(), 0)
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_instance_purge_no_connection(self) -> None:
|
2025-12-15 16:23:36 +00:00
|
|
|
instance = SoftDeletable.available_objects.create(name='a') # type: ignore[misc]
|
2016-11-28 23:31:16 +00:00
|
|
|
|
2016-11-28 23:45:48 +00:00
|
|
|
self.assertRaises(ConnectionDoesNotExist, instance.delete,
|
|
|
|
|
using='other', soft=False)
|
2020-08-12 10:25:34 +00:00
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_deprecation_warning(self) -> None:
|
2020-08-12 10:25:34 +00:00
|
|
|
self.assertWarns(DeprecationWarning, SoftDeletable.objects.all)
|
2024-06-06 17:38:10 +00:00
|
|
|
|
|
|
|
|
def test_delete_queryset_return(self) -> None:
|
2025-12-15 16:23:36 +00:00
|
|
|
SoftDeletable.available_objects.create(name='a') # type: ignore[misc]
|
|
|
|
|
SoftDeletable.available_objects.create(name='b') # type: ignore[misc]
|
2024-06-06 17:38:10 +00:00
|
|
|
|
2025-12-15 16:23:36 +00:00
|
|
|
result = SoftDeletable.available_objects.filter(name="a").delete() # type: ignore[misc]
|
2024-06-06 17:38:10 +00:00
|
|
|
|
|
|
|
|
assert result == (
|
|
|
|
|
1, {SoftDeletable._meta.label: 1}
|
|
|
|
|
)
|