- Add Model Mixins: TimestampMixin, SoftDeleteMixin, AuditMixin, etc. - Add Base Services: BaseService, BulkOperationsMixin, QueryOptimizerMixin - Add Base ViewSets with bulk operations - Add BackgroundJob model for Celery task tracking - Add BaseAppCommand for management commands - Add permissions, pagination, filters, cache, logging - Migrate tests to factory_boy + faker - Add CHANGELOG.md - 297 tests passing
102 lines
3.6 KiB
Python
102 lines
3.6 KiB
Python
"""Tests for core views (health checks)"""
|
|
|
|
from django.urls import reverse
|
|
from rest_framework import status
|
|
from rest_framework.test import APITestCase
|
|
|
|
|
|
class HealthCheckViewTest(APITestCase):
|
|
"""Tests for HealthCheckView"""
|
|
|
|
def test_health_check_url_reverse(self):
|
|
"""Test reverse URL resolution for health check"""
|
|
url = reverse("core:health")
|
|
self.assertEqual(url, "/health/")
|
|
|
|
def test_health_check_success(self):
|
|
"""Test health check returns healthy status"""
|
|
url = reverse("core:health")
|
|
response = self.client.get(url)
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assertIn("status", response.data)
|
|
self.assertIn("version", response.data)
|
|
self.assertIn("checks", response.data)
|
|
self.assertIn("database", response.data["checks"])
|
|
|
|
def test_health_check_database_up(self):
|
|
"""Test health check reports database as up"""
|
|
url = reverse("core:health")
|
|
response = self.client.get(url)
|
|
|
|
self.assertEqual(response.data["checks"]["database"]["status"], "up")
|
|
self.assertIn("latency_ms", response.data["checks"]["database"])
|
|
|
|
|
|
class LivenessViewTest(APITestCase):
|
|
"""Tests for LivenessView"""
|
|
|
|
def test_liveness_url_reverse(self):
|
|
"""Test reverse URL resolution for liveness"""
|
|
url = reverse("core:liveness")
|
|
self.assertEqual(url, "/health/live/")
|
|
|
|
def test_liveness_returns_alive(self):
|
|
"""Test liveness probe returns alive status"""
|
|
url = reverse("core:liveness")
|
|
response = self.client.get(url)
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assertEqual(response.data["status"], "alive")
|
|
|
|
|
|
class ReadinessViewTest(APITestCase):
|
|
"""Tests for ReadinessView"""
|
|
|
|
def test_readiness_url_reverse(self):
|
|
"""Test reverse URL resolution for readiness"""
|
|
url = reverse("core:readiness")
|
|
self.assertEqual(url, "/health/ready/")
|
|
|
|
def test_readiness_returns_ready(self):
|
|
"""Test readiness probe returns ready when DB is available"""
|
|
url = reverse("core:readiness")
|
|
response = self.client.get(url)
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assertEqual(response.data["status"], "ready")
|
|
|
|
|
|
class APIVersioningURLTest(APITestCase):
|
|
"""Tests for API versioning URL structure"""
|
|
|
|
def test_api_v1_user_register_reverse(self):
|
|
"""Test reverse URL for user registration"""
|
|
url = reverse("api_v1:user:register")
|
|
self.assertEqual(url, "/api/v1/users/register/")
|
|
|
|
def test_api_v1_user_login_reverse(self):
|
|
"""Test reverse URL for user login"""
|
|
url = reverse("api_v1:user:login")
|
|
self.assertEqual(url, "/api/v1/users/login/")
|
|
|
|
def test_api_v1_user_logout_reverse(self):
|
|
"""Test reverse URL for user logout"""
|
|
url = reverse("api_v1:user:logout")
|
|
self.assertEqual(url, "/api/v1/users/logout/")
|
|
|
|
def test_api_v1_user_current_user_reverse(self):
|
|
"""Test reverse URL for current user"""
|
|
url = reverse("api_v1:user:current_user")
|
|
self.assertEqual(url, "/api/v1/users/me/")
|
|
|
|
def test_api_v1_user_token_refresh_reverse(self):
|
|
"""Test reverse URL for token refresh"""
|
|
url = reverse("api_v1:user:token_refresh")
|
|
self.assertEqual(url, "/api/v1/users/token/refresh/")
|
|
|
|
def test_api_v1_user_password_change_reverse(self):
|
|
"""Test reverse URL for password change"""
|
|
url = reverse("api_v1:user:password_change")
|
|
self.assertEqual(url, "/api/v1/users/password/change/")
|