Skip to content

Commit

Permalink
add health check endpoint and unit test
Browse files Browse the repository at this point in the history
  • Loading branch information
hernansaa committed Sep 7, 2024
1 parent 59314ea commit 5bd7dc1
Show file tree
Hide file tree
Showing 12 changed files with 71 additions and 6 deletions.
Binary file added api/__pycache__/tests.cpython-311.pyc
Binary file not shown.
Binary file modified api/__pycache__/urls.cpython-311.pyc
Binary file not shown.
Binary file modified api/__pycache__/views.cpython-311.pyc
Binary file not shown.
22 changes: 21 additions & 1 deletion api/tests.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,23 @@
from django.test import TestCase
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APIClient

# Create your tests here.
class HealthCheckTests(TestCase):
def setUp(self):
# Configura el cliente API para hacer peticiones
self.client = APIClient()

def test_health_check(self):
# Llama al endpoint de health check
url = reverse('health-check')
response = self.client.get(url)

# Verifica que la respuesta sea HTTP 200 OK
self.assertEqual(response.status_code, status.HTTP_200_OK)

# Verifica que el contenido de la respuesta sea correcto
self.assertEqual(response.data['status'], 'Healthy')

# Verifica que los checks individuales están bien
self.assertEqual(response.data['database'], 'Healthy')
8 changes: 6 additions & 2 deletions api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
path('api/api-auth/', include('rest_framework.urls', namespace='rest_framework')),
path('api/', views.api_root), # Custom API root view
path('api/health/', views.health_check, name='health-check'),
path('api/', include(router.urls)),
path('api/api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
]


45 changes: 43 additions & 2 deletions api/views.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,23 @@
from django.shortcuts import render
from django.contrib.auth.models import Group, User
from django.db import connection

from portfolios.models import Portfolio, PortfolioTransaction
from market_data.models import Asset

from rest_framework import permissions, viewsets
from rest_framework.decorators import api_view, permission_classes
from rest_framework.response import Response
from rest_framework.reverse import reverse

from .serializers import GroupSerializer, UserSerializer, AssetSerializer, PortfolioSerializer, PortfolioTrasactionSerializer

from .serializers import (
GroupSerializer,
UserSerializer,
AssetSerializer,
PortfolioSerializer,
PortfolioTrasactionSerializer
)


class UserViewSet(viewsets.ModelViewSet):
Expand Down Expand Up @@ -52,4 +63,34 @@ class PorfolioTransactionViewSet(viewsets.ModelViewSet):
"""
queryset = PortfolioTransaction.objects.all().order_by('-transaction_date')
serializer_class = PortfolioTrasactionSerializer
permission_classes = [permissions.IsAuthenticated]
permission_classes = [permissions.IsAuthenticated]


@api_view(['GET'])
@permission_classes([permissions.AllowAny])
def health_check(request):

# Check database connection
try:
connection.ensure_connection()
db_status = "Healthy"
except Exception as e:
db_status = f"Unhealthy: {str(e)}"

return Response({
"status": "Healthy" if db_status == "Healthy" else "Unhealthy",
"database": db_status,
})


@api_view(['GET'])
@permission_classes([permissions.AllowAny])
def api_root(request, format=None):
return Response({
'health': reverse('health-check', request=request, format=format),
'users': reverse('user-list', request=request, format=format),
'groups': reverse('group-list', request=request, format=format),
'portfolios': reverse('portfolio-list', request=request, format=format),
'assets': reverse('asset-list', request=request, format=format),
'portfolio_transactions': reverse('portfoliotransaction-list', request=request, format=format),
})
Empty file added bak.db.sqlite3
Empty file.
Binary file modified db.sqlite3
Binary file not shown.
Binary file added market_data/__pycache__/tests.cpython-311.pyc
Binary file not shown.
Binary file modified portfolios/__pycache__/admin.cpython-311.pyc
Binary file not shown.
Binary file added portfolios/__pycache__/tests.cpython-311.pyc
Binary file not shown.
2 changes: 1 addition & 1 deletion portfolios/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class PortfolioTransactionAdmin(admin.ModelAdmin):
search_fields = ('portfolio__name', 'asset__symbol', 'transaction_type')
list_filter = ('transaction_type', 'transaction_date', 'portfolio')
ordering = ('-transaction_date',)
readonly_fields = ('portfolio', 'asset', 'transaction_type', 'quantity', 'price_at_transaction', 'transaction_date', 'fees', 'total_value',)
readonly_fields = ('total_value',)
autocomplete_fields = ['portfolio', 'asset']
list_per_page = 50
# list_editable = ('quantity', 'price_at_transaction', 'transaction_date')
Expand Down

0 comments on commit 5bd7dc1

Please sign in to comment.