1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
"""Test OpenAPI specs examples."""
__author__ = "Jens Finkhaeuser"
__copyright__ = "Copyright (c) 2018 Jens Finkhaeuser"
__license__ = "MIT"
__all__ = ()
import pytest
from prance import ResolvingParser
from prance import ValidationError
from prance.util.fs import FileNotFoundError
def make_name(path, parser, backend, version, file_format, entry):
import os.path
basename = os.path.splitext(entry)[0]
basename = basename.replace("-", "_")
version = version.replace(".", "")
backend = backend.replace("-", "_")
name = "_".join(["test", parser, backend, version, file_format, basename])
return name
# Generate test cases at import.
# One case per combination of:
# - parser (base, resolving)
# - validation backend (flex, swagger-spec-validator) (skip ssv if importing it fails)
# - spec version
# - file format
# - file
# That gives >50 test cases
import os, os.path
base = os.path.join("tests", "examples")
def iter_entries(parser, backend, version, file_format, path):
if version == "v3.0" and backend != "openapi-spec-validator":
return
for entry in os.listdir(path):
full = os.path.join(path, entry)
testcase_name = None
if os.path.isfile(full):
testcase_name = make_name(
full, parser, backend, version, file_format, entry
)
elif os.path.isdir(full):
if parser == "BaseParser":
continue # skip separate files for the BaseParser
full = os.path.join(full, "spec", "swagger.%s" % (file_format))
if os.path.isfile(full):
testcase_name = make_name(
full, parser, backend, version, file_format, entry
)
if testcase_name:
dirname = os.path.dirname(full)
dirname = dirname.replace("\\", "\\\\")
from prance.util import url
absurl = url.absurl(os.path.abspath(full)).geturl()
code = f"""
@pytest.mark.xfail()
def {testcase_name}():
import os
cur = os.getcwd()
os.chdir('{dirname}')
from prance import {parser}
try:
parser = {parser}('{absurl}', backend = '{backend}')
finally:
os.chdir(cur)
"""
print(code)
exec(code, globals())
for parser in ("BaseParser", "ResolvingParser"):
from prance.util import validation_backends
for backend in validation_backends():
for version in os.listdir(base):
version_dir = os.path.join(base, version)
for file_format in os.listdir(version_dir):
format_dir = os.path.join(version_dir, file_format)
if not os.path.isdir(format_dir): # Assume YAML
iter_entries(parser, backend, version, "yaml", version_dir)
else:
for entry in os.listdir(format_dir):
iter_entries(parser, backend, version, file_format, format_dir)
|