mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-06 13:23:18 +03:00
Feat: delete schema-related tests
This commit is contained in:
parent
d43bae2fc9
commit
1e6e4e9f1c
File diff suppressed because it is too large
Load Diff
|
@ -1,20 +0,0 @@
|
|||
import pytest
|
||||
from django.test import TestCase, override_settings
|
||||
|
||||
from rest_framework import renderers
|
||||
from rest_framework.schemas import coreapi, get_schema_view, openapi
|
||||
|
||||
|
||||
class GetSchemaViewTests(TestCase):
|
||||
"""For the get_schema_view() helper."""
|
||||
def test_openapi(self):
|
||||
schema_view = get_schema_view(title="With OpenAPI")
|
||||
assert isinstance(schema_view.initkwargs['schema_generator'], openapi.SchemaGenerator)
|
||||
assert renderers.OpenAPIRenderer in schema_view.cls().renderer_classes
|
||||
|
||||
@pytest.mark.skipif(not coreapi.coreapi, reason='coreapi is not installed')
|
||||
def test_coreapi(self):
|
||||
with override_settings(REST_FRAMEWORK={'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema'}):
|
||||
schema_view = get_schema_view(title="With CoreAPI")
|
||||
assert isinstance(schema_view.initkwargs['schema_generator'], coreapi.SchemaGenerator)
|
||||
assert renderers.CoreAPIOpenAPIRenderer in schema_view.cls().renderer_classes
|
|
@ -1,154 +0,0 @@
|
|||
import io
|
||||
import os
|
||||
import tempfile
|
||||
|
||||
import pytest
|
||||
from django.core.management import call_command
|
||||
from django.test import TestCase
|
||||
from django.test.utils import override_settings
|
||||
from django.urls import path
|
||||
|
||||
from rest_framework.compat import coreapi, uritemplate, yaml
|
||||
from rest_framework.management.commands import generateschema
|
||||
from rest_framework.utils import formatting, json
|
||||
from rest_framework.views import APIView
|
||||
|
||||
|
||||
class FooView(APIView):
|
||||
def get(self, request):
|
||||
pass
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
path('', FooView.as_view())
|
||||
]
|
||||
|
||||
|
||||
class CustomSchemaGenerator:
|
||||
SCHEMA = {"key": "value"}
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
def get_schema(self, **kwargs):
|
||||
return self.SCHEMA
|
||||
|
||||
|
||||
@override_settings(ROOT_URLCONF=__name__)
|
||||
@pytest.mark.skipif(not uritemplate, reason='uritemplate is not installed')
|
||||
class GenerateSchemaTests(TestCase):
|
||||
"""Tests for management command generateschema."""
|
||||
|
||||
def setUp(self):
|
||||
self.out = io.StringIO()
|
||||
|
||||
def test_command_detects_schema_generation_mode(self):
|
||||
"""Switching between CoreAPI & OpenAPI"""
|
||||
command = generateschema.Command()
|
||||
assert command.get_mode() == generateschema.OPENAPI_MODE
|
||||
with override_settings(REST_FRAMEWORK={'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema'}):
|
||||
assert command.get_mode() == generateschema.COREAPI_MODE
|
||||
|
||||
@pytest.mark.skipif(yaml is None, reason='PyYAML is required.')
|
||||
def test_renders_default_schema_with_custom_title_url_and_description(self):
|
||||
call_command('generateschema',
|
||||
'--title=ExampleAPI',
|
||||
'--url=http://api.example.com',
|
||||
'--description=Example description',
|
||||
stdout=self.out)
|
||||
# Check valid YAML was output.
|
||||
schema = yaml.safe_load(self.out.getvalue())
|
||||
assert schema['openapi'] == '3.0.2'
|
||||
|
||||
def test_renders_openapi_json_schema(self):
|
||||
call_command('generateschema',
|
||||
'--format=openapi-json',
|
||||
stdout=self.out)
|
||||
# Check valid JSON was output.
|
||||
out_json = json.loads(self.out.getvalue())
|
||||
assert out_json['openapi'] == '3.0.2'
|
||||
|
||||
def test_accepts_custom_schema_generator(self):
|
||||
call_command('generateschema',
|
||||
f'--generator_class={__name__}.{CustomSchemaGenerator.__name__}',
|
||||
stdout=self.out)
|
||||
out_json = yaml.safe_load(self.out.getvalue())
|
||||
assert out_json == CustomSchemaGenerator.SCHEMA
|
||||
|
||||
def test_writes_schema_to_file_on_parameter(self):
|
||||
fd, path = tempfile.mkstemp()
|
||||
try:
|
||||
call_command('generateschema', f'--file={path}', stdout=self.out)
|
||||
# nothing on stdout
|
||||
assert not self.out.getvalue()
|
||||
|
||||
call_command('generateschema', stdout=self.out)
|
||||
expected_out = self.out.getvalue()
|
||||
# file output identical to stdout output
|
||||
with os.fdopen(fd) as fh:
|
||||
assert expected_out and fh.read() == expected_out
|
||||
finally:
|
||||
os.remove(path)
|
||||
|
||||
@pytest.mark.skipif(yaml is None, reason='PyYAML is required.')
|
||||
@pytest.mark.skipif(coreapi is None, reason='coreapi is required.')
|
||||
@override_settings(REST_FRAMEWORK={'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema'})
|
||||
def test_coreapi_renders_default_schema_with_custom_title_url_and_description(self):
|
||||
expected_out = """info:
|
||||
description: Example description
|
||||
title: ExampleAPI
|
||||
version: ''
|
||||
openapi: 3.0.0
|
||||
paths:
|
||||
/:
|
||||
get:
|
||||
operationId: list
|
||||
servers:
|
||||
- url: http://api.example.com/
|
||||
"""
|
||||
call_command('generateschema',
|
||||
'--title=ExampleAPI',
|
||||
'--url=http://api.example.com',
|
||||
'--description=Example description',
|
||||
stdout=self.out)
|
||||
|
||||
self.assertIn(formatting.dedent(expected_out), self.out.getvalue())
|
||||
|
||||
@pytest.mark.skipif(coreapi is None, reason='coreapi is required.')
|
||||
@override_settings(REST_FRAMEWORK={'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema'})
|
||||
def test_coreapi_renders_openapi_json_schema(self):
|
||||
expected_out = {
|
||||
"openapi": "3.0.0",
|
||||
"info": {
|
||||
"version": "",
|
||||
"title": "",
|
||||
"description": ""
|
||||
},
|
||||
"servers": [
|
||||
{
|
||||
"url": ""
|
||||
}
|
||||
],
|
||||
"paths": {
|
||||
"/": {
|
||||
"get": {
|
||||
"operationId": "list"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
call_command('generateschema',
|
||||
'--format=openapi-json',
|
||||
stdout=self.out)
|
||||
out_json = json.loads(self.out.getvalue())
|
||||
|
||||
self.assertDictEqual(out_json, expected_out)
|
||||
|
||||
@pytest.mark.skipif(coreapi is None, reason='coreapi is required.')
|
||||
@override_settings(REST_FRAMEWORK={'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema'})
|
||||
def test_renders_corejson_schema(self):
|
||||
expected_out = """{"_type":"document","":{"list":{"_type":"link","url":"/","action":"get"}}}"""
|
||||
call_command('generateschema',
|
||||
'--format=corejson',
|
||||
stdout=self.out)
|
||||
self.assertIn(expected_out, self.out.getvalue())
|
File diff suppressed because it is too large
Load Diff
|
@ -1,250 +0,0 @@
|
|||
import uuid
|
||||
from datetime import timedelta
|
||||
|
||||
from django.core.validators import (
|
||||
DecimalValidator, MaxLengthValidator, MaxValueValidator,
|
||||
MinLengthValidator, MinValueValidator, RegexValidator
|
||||
)
|
||||
from django.db import models
|
||||
|
||||
from rest_framework import generics, permissions, serializers
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.schemas.openapi import AutoSchema
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.viewsets import GenericViewSet, ViewSet
|
||||
|
||||
|
||||
class ExampleListView(APIView):
|
||||
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
pass
|
||||
|
||||
|
||||
class ExampleDetailView(APIView):
|
||||
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
|
||||
class DocStringExampleListView(APIView):
|
||||
"""
|
||||
get: A description of my GET operation.
|
||||
post: A description of my POST operation.
|
||||
"""
|
||||
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
pass
|
||||
|
||||
|
||||
class DocStringExampleDetailView(APIView):
|
||||
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
"""
|
||||
A description of my GET operation.
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
# Generics.
|
||||
class ExampleSerializer(serializers.Serializer):
|
||||
date = serializers.DateField()
|
||||
datetime = serializers.DateTimeField()
|
||||
duration = serializers.DurationField(default=timedelta())
|
||||
hstore = serializers.HStoreField()
|
||||
uuid_field = serializers.UUIDField(default=uuid.uuid4)
|
||||
|
||||
|
||||
class ExampleGenericAPIView(generics.GenericAPIView):
|
||||
serializer_class = ExampleSerializer
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
from datetime import datetime
|
||||
now = datetime.now()
|
||||
|
||||
serializer = self.get_serializer(data=now.date(), datetime=now)
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
class ExampleGenericViewSet(GenericViewSet):
|
||||
serializer_class = ExampleSerializer
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
from datetime import datetime
|
||||
now = datetime.now()
|
||||
|
||||
serializer = self.get_serializer(data=now.date(), datetime=now)
|
||||
return Response(serializer.data)
|
||||
|
||||
@action(detail=False)
|
||||
def new(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
@action(detail=False)
|
||||
def old(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
|
||||
# Validators and/or equivalent Field attributes.
|
||||
class ExampleValidatedSerializer(serializers.Serializer):
|
||||
integer = serializers.IntegerField(
|
||||
validators=(
|
||||
MaxValueValidator(limit_value=99),
|
||||
MinValueValidator(limit_value=-11),
|
||||
)
|
||||
)
|
||||
string = serializers.CharField(
|
||||
validators=(
|
||||
MaxLengthValidator(limit_value=10),
|
||||
MinLengthValidator(limit_value=2),
|
||||
)
|
||||
)
|
||||
regex = serializers.CharField(
|
||||
validators=(
|
||||
RegexValidator(regex=r'[ABC]12{3}'),
|
||||
),
|
||||
help_text='must have an A, B, or C followed by 1222'
|
||||
)
|
||||
lst = serializers.ListField(
|
||||
validators=(
|
||||
MaxLengthValidator(limit_value=10),
|
||||
MinLengthValidator(limit_value=2),
|
||||
)
|
||||
)
|
||||
decimal1 = serializers.DecimalField(max_digits=6, decimal_places=2, coerce_to_string=False)
|
||||
decimal2 = serializers.DecimalField(max_digits=5, decimal_places=0, coerce_to_string=False,
|
||||
validators=(DecimalValidator(max_digits=17, decimal_places=4),))
|
||||
decimal3 = serializers.DecimalField(max_digits=8, decimal_places=2, coerce_to_string=True)
|
||||
decimal4 = serializers.DecimalField(max_digits=8, decimal_places=2, coerce_to_string=True,
|
||||
validators=(DecimalValidator(max_digits=17, decimal_places=4),))
|
||||
decimal5 = serializers.DecimalField(max_digits=6, decimal_places=2)
|
||||
email = serializers.EmailField(default='foo@bar.com')
|
||||
url = serializers.URLField(default='http://www.example.com', allow_null=True)
|
||||
uuid = serializers.UUIDField()
|
||||
ip4 = serializers.IPAddressField(protocol='ipv4')
|
||||
ip6 = serializers.IPAddressField(protocol='ipv6')
|
||||
ip = serializers.IPAddressField()
|
||||
duration = serializers.DurationField(
|
||||
validators=(
|
||||
MinValueValidator(timedelta(seconds=10)),
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
class ExampleValidatedAPIView(generics.GenericAPIView):
|
||||
serializer_class = ExampleValidatedSerializer
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
serializer = self.get_serializer(integer=33, string='hello', regex='foo', decimal1=3.55,
|
||||
decimal2=5.33, email='a@b.co',
|
||||
url='http://localhost', uuid=uuid.uuid4(), ip4='127.0.0.1', ip6='::1',
|
||||
ip='192.168.1.1')
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
# Serializer with model.
|
||||
class OpenAPIExample(models.Model):
|
||||
first_name = models.CharField(max_length=30)
|
||||
|
||||
|
||||
class ExampleSerializerModel(serializers.Serializer):
|
||||
date = serializers.DateField()
|
||||
datetime = serializers.DateTimeField()
|
||||
hstore = serializers.HStoreField()
|
||||
uuid_field = serializers.UUIDField(default=uuid.uuid4)
|
||||
|
||||
class Meta:
|
||||
model = OpenAPIExample
|
||||
|
||||
|
||||
class ExampleOperationIdDuplicate1(generics.GenericAPIView):
|
||||
serializer_class = ExampleSerializerModel
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
|
||||
class ExampleOperationIdDuplicate2(generics.GenericAPIView):
|
||||
serializer_class = ExampleSerializerModel
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
|
||||
class ExampleGenericAPIViewModel(generics.GenericAPIView):
|
||||
serializer_class = ExampleSerializerModel
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
from datetime import datetime
|
||||
now = datetime.now()
|
||||
|
||||
serializer = self.get_serializer(data=now.date(), datetime=now)
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
class ExampleAutoSchemaComponentName(generics.GenericAPIView):
|
||||
serializer_class = ExampleSerializerModel
|
||||
schema = AutoSchema(component_name="Ulysses")
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
from datetime import datetime
|
||||
now = datetime.now()
|
||||
|
||||
serializer = self.get_serializer(data=now.date(), datetime=now)
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
class ExampleAutoSchemaDuplicate1(generics.GenericAPIView):
|
||||
serializer_class = ExampleValidatedSerializer
|
||||
schema = AutoSchema(component_name="Duplicate")
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
from datetime import datetime
|
||||
now = datetime.now()
|
||||
|
||||
serializer = self.get_serializer(data=now.date(), datetime=now)
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
class ExampleAutoSchemaDuplicate2(generics.GenericAPIView):
|
||||
serializer_class = ExampleSerializerModel
|
||||
schema = AutoSchema(component_name="Duplicate")
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
from datetime import datetime
|
||||
now = datetime.now()
|
||||
|
||||
serializer = self.get_serializer(data=now.date(), datetime=now)
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
class ExampleViewSet(ViewSet):
|
||||
serializer_class = ExampleSerializerModel
|
||||
|
||||
def list(self, request):
|
||||
pass
|
||||
|
||||
def create(self, request):
|
||||
pass
|
||||
|
||||
def retrieve(self, request, pk=None):
|
||||
pass
|
||||
|
||||
def update(self, request, pk=None):
|
||||
pass
|
||||
|
||||
def partial_update(self, request, pk=None):
|
||||
pass
|
||||
|
||||
def destroy(self, request, pk=None):
|
||||
pass
|
Loading…
Reference in New Issue
Block a user