You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
5.4 KiB
Python
160 lines
5.4 KiB
Python
"""
|
|
Test migration endpoints
|
|
"""
|
|
|
|
import pytest
|
|
from fastapi.testclient import TestClient
|
|
|
|
def test_migrate_data_without_api_key(client: TestClient):
|
|
"""Test migration endpoint without API key"""
|
|
migration_request = {
|
|
"source_url": "http://test-source.com",
|
|
"api_key": "test-key",
|
|
"tickers": ["AAPL", "MSFT"]
|
|
}
|
|
|
|
response = client.post("/api/v1/admin/migrate", json=migration_request)
|
|
|
|
assert response.status_code == 401
|
|
data = response.json()
|
|
assert "detail" in data
|
|
assert "error_type" in data["detail"]
|
|
assert data["detail"]["error_type"] == "AUTHENTICATION_ERROR"
|
|
|
|
def test_migrate_data_with_invalid_api_key(client: TestClient):
|
|
"""Test migration endpoint with invalid API key"""
|
|
migration_request = {
|
|
"source_url": "http://test-source.com",
|
|
"api_key": "test-key",
|
|
"tickers": ["AAPL", "MSFT"]
|
|
}
|
|
|
|
headers = {"X-API-Key": "invalid-key"}
|
|
response = client.post("/api/v1/admin/migrate", json=migration_request, headers=headers)
|
|
|
|
assert response.status_code == 401
|
|
data = response.json()
|
|
assert "detail" in data
|
|
assert "error_type" in data["detail"]
|
|
assert data["detail"]["error_type"] == "AUTHENTICATION_ERROR"
|
|
|
|
def test_migrate_data_with_valid_api_key(client: TestClient, valid_migration_key):
|
|
"""Test migration endpoint with valid API key"""
|
|
migration_request = {
|
|
"source_url": "http://test-source.com",
|
|
"api_key": "test-key",
|
|
"tickers": ["AAPL"]
|
|
}
|
|
|
|
headers = {"X-API-Key": valid_migration_key}
|
|
response = client.post("/api/v1/admin/migrate", json=migration_request, headers=headers)
|
|
|
|
# Should proceed with migration attempt (will likely fail due to invalid source URL)
|
|
assert response.status_code in [200, 500]
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
# Check response structure
|
|
assert "status" in data
|
|
assert "total_records" in data
|
|
assert "migrated_records" in data
|
|
assert "failed_records" in data
|
|
assert "errors" in data
|
|
assert "duration_seconds" in data
|
|
|
|
def test_migration_request_validation(client: TestClient, valid_migration_key):
|
|
"""Test migration request validation"""
|
|
headers = {"X-API-Key": valid_migration_key}
|
|
|
|
# Missing required fields
|
|
invalid_requests = [
|
|
{
|
|
# Missing source_url
|
|
"api_key": "test-key"
|
|
},
|
|
{
|
|
# Missing api_key
|
|
"source_url": "http://test.com"
|
|
},
|
|
{
|
|
# Invalid URL format
|
|
"source_url": "not-a-url",
|
|
"api_key": "test-key"
|
|
}
|
|
]
|
|
|
|
for invalid_request in invalid_requests:
|
|
response = client.post("/api/v1/admin/migrate", json=invalid_request, headers=headers)
|
|
assert response.status_code == 422
|
|
|
|
def test_migration_with_optional_parameters(client: TestClient, valid_migration_key):
|
|
"""Test migration with optional parameters"""
|
|
migration_request = {
|
|
"source_url": "http://test-source.com",
|
|
"api_key": "test-key",
|
|
"tickers": ["AAPL", "MSFT"],
|
|
"start_date": "2023-01-01T00:00:00",
|
|
"end_date": "2023-12-31T23:59:59"
|
|
}
|
|
|
|
headers = {"X-API-Key": valid_migration_key}
|
|
response = client.post("/api/v1/admin/migrate", json=migration_request, headers=headers)
|
|
|
|
# Should not fail on validation
|
|
assert response.status_code != 422
|
|
|
|
def test_export_data_without_api_key(client: TestClient):
|
|
"""Test export endpoint without API key"""
|
|
response = client.get("/api/v1/admin/migration/export/AAPL")
|
|
|
|
assert response.status_code == 401
|
|
data = response.json()
|
|
assert "detail" in data
|
|
assert "error_type" in data["detail"]
|
|
assert data["detail"]["error_type"] == "AUTHENTICATION_ERROR"
|
|
|
|
def test_export_data_with_valid_api_key(client: TestClient, valid_migration_key):
|
|
"""Test export endpoint with valid API key"""
|
|
headers = {"X-API-Key": valid_migration_key}
|
|
response = client.get("/api/v1/admin/migration/export/AAPL", headers=headers)
|
|
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
|
|
# Check response structure
|
|
assert "ticker" in data
|
|
assert data["ticker"] == "AAPL"
|
|
assert "message" in data
|
|
|
|
def test_export_data_with_parameters(client: TestClient, valid_migration_key):
|
|
"""Test export endpoint with query parameters"""
|
|
params = {
|
|
"start_date": "2023-01-01T00:00:00",
|
|
"end_date": "2023-12-31T23:59:59"
|
|
}
|
|
|
|
headers = {"X-API-Key": valid_migration_key}
|
|
response = client.get("/api/v1/admin/migration/export/AAPL", params=params, headers=headers)
|
|
|
|
assert response.status_code == 200
|
|
|
|
def test_migration_disabled_setting(client: TestClient, monkeypatch):
|
|
"""Test migration endpoints when migration is disabled"""
|
|
# Mock settings to disable migration
|
|
from app.core.config import settings
|
|
monkeypatch.setattr(settings, "ALLOW_MIGRATION", False)
|
|
|
|
migration_request = {
|
|
"source_url": "http://test-source.com",
|
|
"api_key": "test-key"
|
|
}
|
|
|
|
headers = {"X-API-Key": "any-key"}
|
|
response = client.post("/api/v1/admin/migrate", json=migration_request, headers=headers)
|
|
|
|
assert response.status_code == 403
|
|
data = response.json()
|
|
assert "detail" in data
|
|
assert "error_type" in data["detail"]
|
|
assert data["detail"]["error_type"] == "AUTHENTICATION_ERROR"
|
|
assert "disabled" in data["detail"]["message"] |