feat(registry): add new endpoints for registers, exchange, and backups; update routing and configurations
Some checks failed
CI/CD Pipeline / Code Quality Checks (push) Failing after 3m10s
CI/CD Pipeline / Run Tests (push) Successful in 3m35s
CI/CD Pipeline / Telegram Notify Success (push) Has been skipped
CI/CD Pipeline / Code Quality Checks (pull_request) Failing after 2m26s
CI/CD Pipeline / Run Tests (pull_request) Successful in 2m46s
CI/CD Pipeline / Telegram Notify Success (pull_request) Has been skipped

This commit is contained in:
2026-03-04 15:36:57 +01:00
parent 052389d921
commit a91ed1f1ae
90 changed files with 5488 additions and 622 deletions

View File

@@ -3,13 +3,13 @@
from datetime import timedelta
from unittest.mock import patch
from apps.core.admin import BackgroundJobAdmin
from apps.core.models import BackgroundJob
from django.contrib.admin.sites import AdminSite
from django.contrib.messages.storage.fallback import FallbackStorage
from django.test import RequestFactory, TestCase
from django.utils import timezone
from apps.core.admin import BackgroundJobAdmin
from apps.core.models import BackgroundJob
from tests.apps.user.factories import UserFactory
from tests.utils.fixtures import fake

View File

@@ -253,6 +253,7 @@ class BackgroundJobServiceTest(TestCase):
def test_cleanup_old_jobs(self):
from datetime import timedelta
from django.utils import timezone
old_job = BackgroundJobService.create_job(

View File

@@ -3,12 +3,13 @@
from apps.core.cache import (
CacheManager,
_build_cache_key,
invalidate_cache,
cache_method,
cache_result,
invalidate_cache,
)
from django.core.cache import cache
from django.test import TestCase
from tests.utils.fixtures import fake
@@ -262,6 +263,7 @@ class BuildCacheKeyTest(TestCase):
def test_build_cache_key_handles_circular(self):
"""Test circular references fallback to str."""
def my_function():
pass

View File

@@ -1,13 +1,12 @@
"""Tests for custom exception handler."""
from apps.core.exception_handler import custom_exception_handler
from apps.core.exceptions import BaseAPIException
from django.core.exceptions import PermissionDenied
from django.http import Http404
from django.test import SimpleTestCase
from rest_framework.exceptions import APIException, ValidationError
from apps.core.exception_handler import custom_exception_handler
from apps.core.exceptions import BaseAPIException
class CustomExceptionHandlerTest(SimpleTestCase):
def _context(self):

View File

@@ -12,8 +12,7 @@ from apps.core.logging import (
)
from apps.core.middleware import RequestIDMiddleware, get_request_id
from django.http import HttpResponse
from django.test import RequestFactory
from django.test import TestCase
from django.test import RequestFactory, TestCase
class JSONFormatterTest(TestCase):

View File

@@ -148,9 +148,7 @@ class BaseAppCommandTest(TestCase):
from apps.core.models import BackgroundJob
self.assertTrue(
BackgroundJob.objects.filter(task_id="persist-task").exists()
)
self.assertTrue(BackgroundJob.objects.filter(task_id="persist-task").exists())
def test_progress_iter_without_total(self):
cmd = BaseAppCommand()

View File

@@ -3,7 +3,11 @@
import logging
from io import StringIO
from apps.core.middleware import RequestIDMiddleware, RequestLoggingMiddleware, get_request_id
from apps.core.middleware import (
RequestIDMiddleware,
RequestLoggingMiddleware,
get_request_id,
)
from django.http import HttpResponse
from django.test import RequestFactory
from django.urls import reverse

View File

@@ -1,9 +1,5 @@
"""Тесты для Model Mixins."""
from django.db import connection, models
from django.test import TestCase, TransactionTestCase
from django.test.utils import isolate_apps
from apps.core.mixins import (
AuditMixin,
OrderableMixin,
@@ -12,6 +8,10 @@ from apps.core.mixins import (
StatusMixin,
TimestampMixin,
)
from django.db import connection, models
from django.test import TestCase, TransactionTestCase
from django.test.utils import isolate_apps
from tests.apps.user.factories import UserFactory

View File

@@ -2,12 +2,11 @@
from __future__ import annotations
from apps.core.openapi import _get_status_description, api_docs, swagger_tag
from django.test import SimpleTestCase, override_settings
from drf_yasg import openapi
from rest_framework import serializers
from apps.core.openapi import _get_status_description, api_docs, swagger_tag
class DummySerializer(serializers.Serializer):
name = serializers.CharField()

View File

@@ -2,10 +2,6 @@
from __future__ import annotations
from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.test import TestCase
from apps.core.signals import (
SignalDispatcher,
on_post_delete,
@@ -14,6 +10,10 @@ from apps.core.signals import (
on_pre_save,
signal_dispatcher,
)
from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.test import TestCase
from tests.utils.fixtures import fake

View File

@@ -37,6 +37,7 @@ def idempotent_task(self, marker: str):
BackgroundJob.objects.create(task_id=marker, task_name="test.idem")
return marker
@celery_app.task(base=TimedTask, bind=True)
def timed_task(self, marker: str):
return marker

View File

@@ -1,17 +1,18 @@
"""Tests for core views (health checks)"""
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase, APIRequestFactory
import sys
import types
from datetime import timedelta
from apps.core import views as core_views
from apps.core.views import HealthCheckView
from django.urls import reverse
from django.utils import timezone
from rest_framework import status
from rest_framework.test import APIRequestFactory, APITestCase
from tests.apps.user.factories import UserFactory
from tests.utils.fixtures import fake
from django.utils import timezone
from apps.core.views import HealthCheckView
from apps.core import views as core_views
import sys
import types
class HealthCheckViewTest(APITestCase):
@@ -51,7 +52,9 @@ class HealthCheckViewTest(APITestCase):
url = reverse("core:health")
response = self.client.get(url)
self.assertIn("redis", response.data["checks"])
self.assertIn(response.data["checks"]["redis"]["status"], ["up", "down", "skipped"])
self.assertIn(
response.data["checks"]["redis"]["status"], ["up", "down", "skipped"]
)
class HealthCheckStatusCombinationsTest(APITestCase):
@@ -322,7 +325,9 @@ class BackgroundJobsViewTest(APITestCase):
)
def test_job_status_for_owner(self):
job = self._create_job(task_id="job-owner", user_id=self.user.id, status="success")
job = self._create_job(
task_id="job-owner", user_id=self.user.id, status="success"
)
self.client.force_authenticate(self.user)
url = reverse("api_v1:jobs:job-status", kwargs={"task_id": job.task_id})
response = self.client.get(url)
@@ -330,14 +335,18 @@ class BackgroundJobsViewTest(APITestCase):
self.assertEqual(response.data["task_id"], job.task_id)
def test_job_status_forbidden_for_other_user(self):
job = self._create_job(task_id="job-forbidden", user_id=self.user.id, status="success")
job = self._create_job(
task_id="job-forbidden", user_id=self.user.id, status="success"
)
self.client.force_authenticate(self.other)
url = reverse("api_v1:jobs:job-status", kwargs={"task_id": job.task_id})
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_job_status_for_admin(self):
job = self._create_job(task_id="job-admin", user_id=self.user.id, status="success")
job = self._create_job(
task_id="job-admin", user_id=self.user.id, status="success"
)
self.client.force_authenticate(self.admin)
url = reverse("api_v1:jobs:job-status", kwargs={"task_id": job.task_id})
response = self.client.get(url)
@@ -364,3 +373,10 @@ class BackgroundJobsViewTest(APITestCase):
response = self.client.get(url, {"limit": 2})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertLessEqual(len(response.data), 2)
def test_job_list_invalid_limit_returns_400(self):
self._create_job(task_id="job-invalid-limit", user_id=self.user.id, status="success")
self.client.force_authenticate(self.user)
url = reverse("api_v1:jobs:job-list")
response = self.client.get(url, {"limit": "abc"})
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

View File

@@ -189,7 +189,9 @@ router.register(
basename="profile-owner-public",
)
router.register("bulk-proxies", BulkProxyViewSet, basename="bulk-proxy")
router.register("bulk-proxies-write", BulkWritableProxyViewSet, basename="bulk-proxy-write")
router.register(
"bulk-proxies-write", BulkWritableProxyViewSet, basename="bulk-proxy-write"
)
urlpatterns = [path("", include(router.urls))]
@@ -283,9 +285,7 @@ class BaseViewSetIntegrationTest(APITestCase):
self.assertTrue(response.data["success"])
self.assertEqual(len(response.data["data"]), 2)
self.assertIn("pagination", response.data["meta"])
self.assertSetEqual(
set(response.data["data"][0].keys()), {"id", "address"}
)
self.assertSetEqual(set(response.data["data"][0].keys()), {"id", "address"})
def test_list_without_pagination(self):
ProxyFactory.create_batch(2)
@@ -451,7 +451,9 @@ class BulkMixinIntegrationTest(APITestCase):
self.assertEqual(response.data["errors"][0]["code"], "missing_ids")
def test_bulk_update_empty_items(self):
response = self.client.patch("/bulk-proxies-write/bulk_update/", {}, format="json")
response = self.client.patch(
"/bulk-proxies-write/bulk_update/", {}, format="json"
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertFalse(response.data["success"])