Добавьте модульный тест в проект label-studio django в хранилище azure

Я пытаюсь добавить новый юнит-тест в проект label-studio

Я не могу успешно создать хранилище, загруженное ниже

- name: stage
  request:
    data:
      container: pytest-azure-images
      project: '{project_pk}'
      title: Testing Azure SPI storage (bucket from conftest.py)
      use_blob_urls: true
    method: POST
    url: '{django_live_url}/api/storages/azure_spi'
  response:
    save:
      json:
        storage_pk: id
    status_code: 201

поскольку в результатах я получаю last_sync_count: 0. Как загружается ведро из "conftest.py"?

- name: stage
  request:
    method: POST
    url: '{django_live_url}/api/storages/azure_spi/{storage_pk}/sync'
  response:
    json:
      last_sync_count: 0
    status_code: 200

Вот моя ветка и PR, если вы можете помочь: https://github.com/HumanSignal/label-studio/pull/5926/files

Выполните следующие шаги, чтобы добавить модульный тест в проект Label Studio для загрузки файла в Azure Storage:

Обновите settings.py проект Label Studio, чтобы включить настройки Azure Storage.

# settings.py
AZURE_ACCOUNT_NAME = 'your_account_name'
AZURE_ACCOUNT_KEY = 'your_account_key'
AZURE_CONTAINER = 'azure-images'
  • Подключите Label Studio к Azure Blob Storage, используя эту ссылку

  • Я использовал эту ссылку для написания модульных тестов в приложении Django и запуска тестов с помощью django.test.

  • Создайте файл юнит-тестов test_azure_storage.py в каталоге tests.

# tests/test_azure_storage.py

import pytest
from django.conf import settings
from rest_framework.test import APIClient

@pytest.fixture
def api_client():
    return APIClient()

@pytest.mark.django_db
def test_azure_storage_upload(api_client):
    # Create a storage
    response = api_client.post(
        f'{settings.DJANGO_LIVE_URL}/api/storages/azure_spi',
        data={
            'container': settings.AZURE_CONTAINER,
            'project': '{project_pk}',
            'title': 'Testing Azure SPI storage (bucket from conftest.py)',
            'use_blob_urls': True,
        }
    )
    assert response.status_code == 201
    storage_pk = response.json().get('id')

    # Sync the storage
    response = api_client.post(
        f'{settings.DJANGO_LIVE_URL}/api/storages/azure_spi/{storage_pk}/sync'
    )
    assert response.status_code == 200
    assert response.json().get('last_sync_count') > 0

    def test_upload_blob(self):
        container_client = self.blob_service_client.get_container_client(self.container_name)
        blob_client = container_client.get_blob_client("test_blob.txt")
        blob_client.upload_blob("This is a test blob")
      

enter image description here

Мне удалось это исправить. Проблема заключалась в том, что класс учетной записи хранилища не был правильно исправлен, и три файла не возвращались имитатором. Это решило проблему:

class DummyAzureContainer:
         def __init__(self, container_name, **kwargs):
             self.name = container_name

         def list_blobs(self, name_starts_with):
             return [File('abc'), File('def'), File('ghi')]

         def get_blob_client(self, key):
             return DummyAzureBlob(self.name, key)

         def get_container_properties(self, **kwargs):
             return SimpleNamespace(
                 name='test-container',
                 last_modified='2022-01-01 01:01:01',
                 etag='test-etag',
                 lease='test-lease',
                 public_access='public',
                 has_immutability_policy=True,
                 has_legal_hold=True,
                 immutable_storage_with_versioning_enabled=True,
                 metadata={'key': 'value'},
                 encryption_scope='test-scope',
                 deleted=False,
                 version='1.0.0',
             )

         def download_blob(self, key):
             return DummyAzureBlob(self.name, key)

     class DummyBlobServiceClient:
         def __init__(self, *args, **kwargs):
             pass

         def get_container_client(self, container_name):
             return DummyAzureContainer(container_name)

     class DummyClientSecretCredential:
         def __init__(self, *args, **kwargs):
             pass

         def get_token(self):
             return 'token'

     with mock.patch.object(models, 'ClientSecretCredential' , DummyClientSecretCredential):
         with mock.patch.object(models, 'BlobServiceClient' , DummyBlobServiceClient):
             with mock.patch.object(models, 'generate_blob_sas', return_value='token'):
                 yield
Вернуться на верх