From b6b2c4bb5b4eb3e3e48d8f43b6a62858e6683771 Mon Sep 17 00:00:00 2001 From: Artem Muterko Date: Sun, 8 Jan 2017 18:33:43 +0200 Subject: [PATCH] Renderer tests (#4791) --- rest_framework/renderers.py | 2 +- tests/test_renderers.py | 82 ++++++++++++++++++++++++++++++++++++- 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 97dab8741..a2e658d57 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -228,7 +228,7 @@ class StaticHTMLRenderer(TemplateHTMLRenderer): def render(self, data, accepted_media_type=None, renderer_context=None): renderer_context = renderer_context or {} - response = renderer_context['response'] + response = renderer_context.get('response') if response and response.exception: request = renderer_context['request'] diff --git a/tests/test_renderers.py b/tests/test_renderers.py index a2620e93c..eba5b8104 100644 --- a/tests/test_renderers.py +++ b/tests/test_renderers.py @@ -5,9 +5,11 @@ import json import re from collections import MutableMapping, OrderedDict +import pytest from django.conf.urls import include, url from django.core.cache import cache from django.db import models +from django.http.request import HttpRequest from django.test import TestCase, override_settings from django.utils import six from django.utils.safestring import SafeText @@ -15,8 +17,10 @@ from django.utils.translation import ugettext_lazy as _ from rest_framework import permissions, serializers, status from rest_framework.renderers import ( - BaseRenderer, BrowsableAPIRenderer, HTMLFormRenderer, JSONRenderer + AdminRenderer, BaseRenderer, BrowsableAPIRenderer, + HTMLFormRenderer, JSONRenderer, StaticHTMLRenderer ) +from rest_framework.request import Request from rest_framework.response import Response from rest_framework.settings import api_settings from rest_framework.test import APIRequestFactory @@ -269,6 +273,18 @@ def strip_trailing_whitespace(content): return re.sub(' +\n', '\n', content) +class BaseRendererTests(TestCase): + """ + Tests BaseRenderer + """ + def test_render_raise_error(self): + """ + BaseRenderer.render should raise NotImplementedError + """ + with pytest.raises(NotImplementedError): + BaseRenderer().render('test') + + class JSONRendererTests(TestCase): """ Tests specific to the JSON Renderer @@ -568,3 +584,67 @@ class TestMultipleChoiceFieldHTMLFormRenderer(TestCase): result) self.assertInHTML('', result) self.assertInHTML('', result) + + +class StaticHTMLRendererTests(TestCase): + """ + Tests specific for Static HTML Renderer + """ + def setUp(self): + self.renderer = StaticHTMLRenderer() + + def test_static_renderer(self): + data = 'text' + result = self.renderer.render(data) + assert result == data + + def test_static_renderer_with_exception(self): + context = { + 'response': Response(status=500, exception=True), + 'request': Request(HttpRequest()) + } + result = self.renderer.render({}, renderer_context=context) + assert result == '500 Internal Server Error' + + +class BrowsableAPIRendererTests(TestCase): + + def setUp(self): + self.renderer = BrowsableAPIRenderer() + + def test_get_description_returns_empty_string_for_401_and_403_statuses(self): + assert self.renderer.get_description({}, status_code=401) == '' + assert self.renderer.get_description({}, status_code=403) == '' + + def test_get_filter_form_returns_none_if_data_is_not_list_instance(self): + class DummyView(object): + get_queryset = None + filter_backends = None + + result = self.renderer.get_filter_form(data='not list', + view=DummyView(), request={}) + assert result is None + + +class AdminRendererTests(TestCase): + + def setUp(self): + self.renderer = AdminRenderer() + + def test_render_when_resource_created(self): + class DummyView(APIView): + renderer_classes = (AdminRenderer, ) + request = Request(HttpRequest()) + request.build_absolute_uri = lambda: 'http://example.com' + response = Response(status=201, headers={'Location': '/test'}) + context = { + 'view': DummyView(), + 'request': request, + 'response': response + } + + result = self.renderer.render(data={'test': 'test'}, + renderer_context=context) + assert result == '' + assert response.status_code == status.HTTP_303_SEE_OTHER + assert response['Location'] == 'http://example.com'