drf-yasg/tests/conftest.py

84 lines
2.2 KiB
Python

import copy
import json
import os
from collections import OrderedDict
import pytest
from django.contrib.auth.models import User
from rest_framework.test import APIRequestFactory
from rest_framework.views import APIView
from drf_yasg import openapi, codecs
from drf_yasg.codecs import yaml_sane_load
from drf_yasg.generators import OpenAPISchemaGenerator
@pytest.fixture
def mock_schema_request(db):
from rest_framework.test import force_authenticate
factory = APIRequestFactory()
user = User.objects.create_user(username='admin', is_staff=True, is_superuser=True)
request = factory.get('/swagger.json')
force_authenticate(request, user=user)
request = APIView().initialize_request(request)
return request
@pytest.fixture
def codec_json():
return codecs.OpenAPICodecJson(['flex', 'ssv'])
@pytest.fixture
def codec_yaml():
return codecs.OpenAPICodecYaml(['ssv', 'flex'])
@pytest.fixture
def swagger(mock_schema_request):
generator = OpenAPISchemaGenerator(
info=openapi.Info(title="Test generator", default_version="v1"),
version="v2",
)
return generator.get_schema(mock_schema_request, True)
@pytest.fixture
def swagger_dict(swagger):
json_bytes = codec_json().encode(swagger)
return json.loads(json_bytes.decode('utf-8'), object_pairs_hook=OrderedDict)
@pytest.fixture
def validate_schema(db):
def validate_schema(swagger):
from flex.core import parse as validate_flex
from swagger_spec_validator.validator20 import validate_spec as validate_ssv
validate_flex(copy.deepcopy(swagger))
validate_ssv(copy.deepcopy(swagger))
return validate_schema
@pytest.fixture
def swagger_settings(settings):
swagger_settings = copy.deepcopy(settings.SWAGGER_SETTINGS)
settings.SWAGGER_SETTINGS = swagger_settings
return swagger_settings
@pytest.fixture
def redoc_settings(settings):
redoc_settings = copy.deepcopy(settings.REDOC_SETTINGS)
settings.REDOC_SETTINGS = redoc_settings
return redoc_settings
@pytest.fixture
def reference_schema():
with open(os.path.join(os.path.dirname(__file__), 'reference.yaml')) as reference:
return yaml_sane_load(reference)