mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-11-04 09:57:55 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			102 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from django.test import TestCase
 | 
						|
 | 
						|
from rest_framework import serializers, status
 | 
						|
from rest_framework.decorators import api_view
 | 
						|
from rest_framework.response import Response
 | 
						|
from rest_framework.settings import api_settings
 | 
						|
from rest_framework.test import APIRequestFactory
 | 
						|
from rest_framework.views import APIView
 | 
						|
 | 
						|
factory = APIRequestFactory()
 | 
						|
 | 
						|
 | 
						|
class ExampleSerializer(serializers.Serializer):
 | 
						|
    char = serializers.CharField()
 | 
						|
    integer = serializers.IntegerField()
 | 
						|
 | 
						|
 | 
						|
class ErrorView(APIView):
 | 
						|
    def get(self, request, *args, **kwargs):
 | 
						|
        ExampleSerializer(data={}).is_valid(raise_exception=True)
 | 
						|
 | 
						|
 | 
						|
@api_view(['GET'])
 | 
						|
def error_view(request):
 | 
						|
    ExampleSerializer(data={}).is_valid(raise_exception=True)
 | 
						|
 | 
						|
 | 
						|
class TestValidationErrorWithFullDetails(TestCase):
 | 
						|
    def setUp(self):
 | 
						|
        self.DEFAULT_HANDLER = api_settings.EXCEPTION_HANDLER
 | 
						|
 | 
						|
        def exception_handler(exc, request):
 | 
						|
            data = exc.get_full_details()
 | 
						|
            return Response(data, status=status.HTTP_400_BAD_REQUEST)
 | 
						|
 | 
						|
        api_settings.EXCEPTION_HANDLER = exception_handler
 | 
						|
 | 
						|
        self.expected_response_data = {
 | 
						|
            'char': [{
 | 
						|
                'message': 'This field is required.',
 | 
						|
                'code': 'required',
 | 
						|
            }],
 | 
						|
            'integer': [{
 | 
						|
                'message': 'This field is required.',
 | 
						|
                'code': 'required'
 | 
						|
            }],
 | 
						|
        }
 | 
						|
 | 
						|
    def tearDown(self):
 | 
						|
        api_settings.EXCEPTION_HANDLER = self.DEFAULT_HANDLER
 | 
						|
 | 
						|
    def test_class_based_view_exception_handler(self):
 | 
						|
        view = ErrorView.as_view()
 | 
						|
 | 
						|
        request = factory.get('/', content_type='application/json')
 | 
						|
        response = view(request)
 | 
						|
        assert response.status_code == status.HTTP_400_BAD_REQUEST
 | 
						|
        assert response.data == self.expected_response_data
 | 
						|
 | 
						|
    def test_function_based_view_exception_handler(self):
 | 
						|
        view = error_view
 | 
						|
 | 
						|
        request = factory.get('/', content_type='application/json')
 | 
						|
        response = view(request)
 | 
						|
        assert response.status_code == status.HTTP_400_BAD_REQUEST
 | 
						|
        assert response.data == self.expected_response_data
 | 
						|
 | 
						|
 | 
						|
class TestValidationErrorWithCodes(TestCase):
 | 
						|
    def setUp(self):
 | 
						|
        self.DEFAULT_HANDLER = api_settings.EXCEPTION_HANDLER
 | 
						|
 | 
						|
        def exception_handler(exc, request):
 | 
						|
            data = exc.get_codes()
 | 
						|
            return Response(data, status=status.HTTP_400_BAD_REQUEST)
 | 
						|
 | 
						|
        api_settings.EXCEPTION_HANDLER = exception_handler
 | 
						|
 | 
						|
        self.expected_response_data = {
 | 
						|
            'char': ['required'],
 | 
						|
            'integer': ['required'],
 | 
						|
        }
 | 
						|
 | 
						|
    def tearDown(self):
 | 
						|
        api_settings.EXCEPTION_HANDLER = self.DEFAULT_HANDLER
 | 
						|
 | 
						|
    def test_class_based_view_exception_handler(self):
 | 
						|
        view = ErrorView.as_view()
 | 
						|
 | 
						|
        request = factory.get('/', content_type='application/json')
 | 
						|
        response = view(request)
 | 
						|
        assert response.status_code == status.HTTP_400_BAD_REQUEST
 | 
						|
        assert response.data == self.expected_response_data
 | 
						|
 | 
						|
    def test_function_based_view_exception_handler(self):
 | 
						|
        view = error_view
 | 
						|
 | 
						|
        request = factory.get('/', content_type='application/json')
 | 
						|
        response = view(request)
 | 
						|
        assert response.status_code == status.HTTP_400_BAD_REQUEST
 | 
						|
        assert response.data == self.expected_response_data
 |