ФУНКЦИИ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: retention cleanup файлового хранилища

This commit is contained in:
DCCONSTRUCTIONS
2026-04-27 13:47:46 +03:00
parent 3e328531ec
commit a7606f2e9a
3 changed files with 81 additions and 2 deletions
@@ -5,8 +5,10 @@
from unittest.mock import patch
import pytest
from django.utils import timezone
from plane.db.models import FileAsset, StoredBlob
from plane.bgtasks.file_asset_task import delete_expired_file_asset
from plane.utils.file_dedup import attach_existing_blob_to_file_asset, finalize_uploaded_file_asset, release_file_asset_blob
@@ -150,3 +152,26 @@ def test_attach_existing_blob_reuses_canonical_object_without_copy(workspace, pr
assert target_asset.asset.name == "workspace/a.txt"
assert blob.ref_count == 2
assert fake_storage.deleted == []
@pytest.mark.django_db
def test_delete_expired_file_asset_releases_blob_and_hard_deletes_rows(workspace, project, fake_storage):
first_asset = create_asset(workspace, project, "workspace/a.txt")
duplicate_asset = create_asset(workspace, project, "workspace/b.txt")
with patch("plane.utils.file_dedup.S3Storage", return_value=fake_storage):
finalize_uploaded_file_asset(first_asset)
finalize_uploaded_file_asset(duplicate_asset)
deleted_at = timezone.now() - timezone.timedelta(days=90)
FileAsset.all_objects.filter(pk__in=[first_asset.pk, duplicate_asset.pk]).update(deleted_at=deleted_at)
with (
patch("plane.utils.file_dedup.S3Storage", return_value=fake_storage),
patch("plane.bgtasks.file_asset_task.S3Storage", return_value=fake_storage),
):
delete_expired_file_asset()
assert FileAsset.all_objects.filter(pk__in=[first_asset.pk, duplicate_asset.pk]).count() == 0
assert StoredBlob.all_objects.count() == 0
assert fake_storage.deleted == ["workspace/b.txt", "workspace/a.txt"]