Добавьте модульный тест в проект 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")
Мне удалось это исправить. Проблема заключалась в том, что класс учетной записи хранилища не был правильно исправлен, и три файла не возвращались имитатором. Это решило проблему:
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