feat: migrate parser data to source records
Some checks failed
CI/CD Pipeline / Quality Gate (push) Failing after 14s
CI/CD Pipeline / Build and Push Images (push) Has been skipped
CI/CD Pipeline / Deploy Dev in Dokploy (push) Has been skipped
CI/CD Pipeline / Internal Notify (push) Successful in 0s

This commit is contained in:
2026-05-19 20:21:31 +02:00
parent 1c7c7238be
commit b8a18d6da4
46 changed files with 2689 additions and 6179 deletions

View File

@@ -1,7 +1,6 @@
"""Tests for exchange API views."""
import json
from types import SimpleNamespace
from unittest.mock import patch
from apps.exchange.models import ExchangeConnection
@@ -154,39 +153,17 @@ class ExchangeViewsTest(APITestCase):
old_active.refresh_from_db()
self.assertTrue(old_active.is_active)
def test_copy_requires_active_connection(self):
def test_copy_endpoint_is_disabled(self):
self.client.force_authenticate(self.admin)
response = self.client.post(self.copy_url, {"mode": "all"}, format="json")
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
@patch("apps.exchange.views.copy_parsers_data_async.delay")
@patch("apps.exchange.services.ExchangeConnectionService.get_active_connection")
def test_copy_all_success(self, get_active_mock, delay_mock):
active_connection = ExchangeConnectionFactory(is_active=True)
get_active_mock.return_value = active_connection
delay_mock.return_value = SimpleNamespace(id="task-123")
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
def test_tables_endpoint_is_disabled(self):
self.client.force_authenticate(self.admin)
response = self.client.post(self.copy_url, {"mode": "all"}, format="json")
response = self.client.get(reverse("api_v1:exchange:tables"))
self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
self.assertEqual(response.data["data"]["status"], "started")
self.assertEqual(response.data["data"]["task_id"], "task-123")
self.assertEqual(response.data["data"]["connection_id"], active_connection.id)
get_active_mock.assert_called_once()
delay_mock.assert_called_once_with(
connection_id=active_connection.id,
payload={"mode": "all", "truncate_before_copy": True},
requested_by_id=self.admin.id,
)
def test_copy_single_requires_table(self):
self.client.force_authenticate(self.admin)
response = self.client.post(self.copy_url, {"mode": "single"}, format="json")
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn("table", str(response.data))
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
def test_periodic_tasks_endpoint_admin_only(self):
response = self.client.get(self.periodic_tasks_url)
@@ -310,7 +287,7 @@ class ExchangeViewsTest(APITestCase):
self.assertTrue(response.data["notify_on_error"])
self.assertFalse(IntervalSchedule.objects.filter(id=interval.id).exists())
def test_periodic_task_detail_returns_404_for_non_exchange_task(self):
def test_periodic_task_detail_get_is_disabled(self):
interval = IntervalSchedule.objects.create(every=1, period="hours")
task = PeriodicTask.objects.create(
name="another-task",
@@ -326,4 +303,23 @@ class ExchangeViewsTest(APITestCase):
self.client.force_authenticate(self.admin)
response = self.client.get(detail_url)
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
def test_periodic_task_detail_delete_is_disabled(self):
interval = IntervalSchedule.objects.create(every=1, period="hours")
task = PeriodicTask.objects.create(
name="exchange-copy-hourly",
task=ExchangePeriodicTaskService.TASK_NAME,
interval=interval,
kwargs="{}",
)
detail_url = reverse(
"api_v1:exchange:periodic-task-detail",
kwargs={"task_id": task.id},
)
self.client.force_authenticate(self.admin)
response = self.client.delete(detail_url)
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
self.assertTrue(PeriodicTask.objects.filter(id=task.id).exists())