import logging from label_studio.core.utils import db as db_utils class _BrokenConnection: vendor = 'testdb' @property def settings_dict(self): # Simulate an unexpected error when accessing connection.settings_dict raise RuntimeError('boom') def test_current_db_key_exception_path(monkeypatch, caplog): # Arrange: replace connection with a broken one to trigger the except path monkeypatch.setattr(db_utils, 'connection', _BrokenConnection()) # Act: call current_db_key and capture error logs with caplog.at_level(logging.ERROR, logger='label_studio.core.utils.db'): key = db_utils.current_db_key() # Assert: name fallback used and error message logged assert key == 'testdb:unknown' assert any('Error getting current DB key' in rec.message for rec in caplog.records) """This module contains tests for database utility functions in core/utils/db.py""" import pytest from core.utils.db import batch_delete from django.db import transaction from users.models import User from users.tests.factories import UserFactory class TestBatchDelete: """Test suite for the batch_delete utility function""" @pytest.mark.django_db def test_batch_delete_empty_queryset(self): """Test batch deletion with an empty queryset. This test verifies that: - Function handles empty querysets gracefully - Returns 0 for total deleted items - No errors are raised """ # Setup: Empty queryset queryset = User.objects.filter(email='nonexistent@example.com') # Action: Attempt to delete empty queryset total_deleted = batch_delete(queryset) # Assert: No items were deleted assert total_deleted == 0 @pytest.mark.django_db def test_batch_delete_single_batch(self): """Test batch deletion when all items fit in a single batch. This test verifies that: - All items are deleted when count < batch_size - Items are actually removed from database """ # Setup: Create 5 users [UserFactory() for _ in range(5)] initial_count = User.objects.count() assert initial_count == 5 # Verify setup queryset = User.objects.all() # Action: Delete with batch size larger than number of items batch_delete(queryset, batch_size=10) # Assert: All users were deleted assert User.objects.count() == 0 @pytest.mark.django_db def test_batch_delete_multiple_batches(self): """Test batch deletion when items span multiple batches. This test verifies that: - All items are deleted when count > batch_size - Items are deleted in correct batches - All items are removed from database """ # Setup: Create 25 users (will require 3 batches with batch_size=10) [UserFactory() for _ in range(25)] initial_count = User.objects.count() assert initial_count == 25 # Verify setup queryset = User.objects.all() # Action: Delete with batch size smaller than number of items batch_delete(queryset, batch_size=10) # Assert: All users were deleted assert User.objects.count() == 0 @pytest.mark.django_db def test_batch_delete_with_transaction(self): """Test batch deletion within a transaction. This test verifies that: - Batch deletion works correctly inside a transaction - Changes are committed properly - No errors occur with nested transactions """ # Setup: Create 15 users [UserFactory() for _ in range(15)] initial_count = User.objects.count() assert initial_count == 15 # Verify setup queryset = User.objects.all() # Action: Delete within a transaction with transaction.atomic(): batch_delete(queryset, batch_size=10) # Assert: All users were deleted assert User.objects.count() == 0 @pytest.mark.django_db def test_batch_delete_exact_batch_size(self): """Test batch deletion when item count matches batch size exactly. This test verifies that: - All items are deleted when count == batch_size - No extra queries are made after the last batch """ # Setup: Create exactly 10 users [UserFactory() for _ in range(10)] initial_count = User.objects.count() assert initial_count == 10 # Verify setup queryset = User.objects.all() # Action: Delete with batch size equal to number of items batch_delete(queryset, batch_size=10) # Assert: All users were deleted assert User.objects.count() == 0