Esempio n. 1
0
def _get_versioned_schema(prefix, client, validate_schema):
    response = client.get(prefix + 'swagger.yaml')
    assert response.status_code == 200
    swagger = yaml_sane_load(response.content.decode('utf-8'))
    validate_schema(swagger)
    assert prefix + 'snippets/' in swagger['paths']
    return swagger
Esempio n. 2
0
    def get(self, request, *args, **kwargs):
        response = super().get(request, *args, **kwargs)

        if not self._is_openapi_v3:
            return response

        # serve the staticically included V3 schema
        SCHEMA_PATH = os.path.join(settings.BASE_DIR, 'src', 'openapi.yaml')
        with open(SCHEMA_PATH, 'r') as infile:
            schema = yaml_sane_load(infile)

        # fix the servers
        for server in schema['servers']:
            split_url = urlsplit(server['url'])
            if split_url.netloc:
                continue

            prefix = settings.FORCE_SCRIPT_NAME or ''
            if prefix.endswith('/'):
                prefix = prefix[:-1]
            server_path = f"{prefix}{server['url']}"
            server['url'] = request.build_absolute_uri(server_path)

        return Response(
            data=schema,
            headers={'X-OAS-Version': schema['openapi']}
        )
Esempio n. 3
0
def test_reference_schema(db, reference_schema):
    User.objects.create_superuser('admin', '*****@*****.**', 'blabla')

    output = call_generate_swagger(format='yaml',
                                   api_url='http://test.local:8002/',
                                   user='******')
    output_schema = yaml_sane_load(output)
    assert output_schema == reference_schema
Esempio n. 4
0
    def get(self, request, version="", *args, **kwargs):
        if self._is_openapi_v2:
            version = request.version or version or ""
            if isinstance(request.accepted_renderer, _SpecRenderer):
                generator = self.generator_class(
                    getattr(self, "info", swagger_settings.DEFAULT_INFO),
                    version,
                    None,
                    patterns,
                    urlconf,
                )
            else:
                generator = self.generator_class(
                    getattr(self, "info", swagger_settings.DEFAULT_INFO),
                    version,
                    None,
                    patterns=[],
                )

            schema = generator.get_schema(request, self.public)
            if schema is None:
                raise exceptions.PermissionDenied()  # pragma: no cover
            return Response(schema)

        # serve the staticically included V3 schema
        SCHEMA_PATH = self.get_schema_path()
        with open(SCHEMA_PATH, "r") as infile:
            schema = yaml_sane_load(infile)

        # fix the servers
        for server in schema["servers"]:
            split_url = urlsplit(server["url"])
            if split_url.netloc:
                continue

            prefix = settings.FORCE_SCRIPT_NAME or ""
            if prefix.endswith("/"):
                prefix = prefix[:-1]
            server_path = f"{prefix}{server['url']}"
            server["url"] = request.build_absolute_uri(server_path)

        return Response(data=schema,
                        headers={"X-OAS-Version": schema["openapi"]})
Esempio n. 5
0
def test_file_output(db):
    prefix = os.path.join(tempfile.gettempdir(), tempfile.gettempprefix())
    name = ''.join(
        random.choice(string.ascii_lowercase + string.digits)
        for _ in range(8))
    yaml_file = prefix + name + '.yaml'
    json_file = prefix + name + '.json'
    other_file = prefix + name + '.txt'

    try:
        # when called with output file nothing should be written to stdout
        assert call_generate_swagger(output_file=yaml_file) == ''
        assert call_generate_swagger(output_file=json_file) == ''
        assert call_generate_swagger(output_file=other_file) == ''

        with pytest.raises(OSError):
            # a second call should fail because file exists
            call_generate_swagger(output_file=yaml_file)

        # a second call with overwrite should still succeed
        assert call_generate_swagger(output_file=json_file,
                                     overwrite=True) == ''

        with open(yaml_file) as f:
            content = f.read()
            # YAML is a superset of JSON - that means we have to check that
            # the file is really YAML and not just JSON parsed by the YAML parser
            with pytest.raises(ValueError):
                json.loads(content)
            output_yaml = yaml_sane_load(content)
        with open(json_file) as f:
            output_json = json.load(f, object_pairs_hook=OrderedDict)
        with open(other_file) as f:
            output_other = json.load(f, object_pairs_hook=OrderedDict)

        assert output_yaml == output_json == output_other
    finally:
        silentremove(yaml_file)
        silentremove(json_file)
        silentremove(other_file)
def test_yaml_and_json_match(codec_yaml, codec_json, swagger):
    yaml_schema = yaml_sane_load(codec_yaml.encode(swagger).decode('utf-8'))
    json_schema = json.loads(codec_json.encode(swagger).decode('utf-8'),
                             object_pairs_hook=OrderedDict)
    assert yaml_schema == json_schema
def test_yaml_codec_roundtrip(codec_yaml, swagger, validate_schema):
    yaml_bytes = codec_yaml.encode(swagger)
    assert b'omap' not in yaml_bytes  # ensure no ugly !!omap is outputted
    assert b'&id' not in yaml_bytes and b'*id' not in yaml_bytes  # ensure no YAML references are generated
    validate_schema(yaml_sane_load(yaml_bytes.decode('utf-8')))
Esempio n. 8
0
def reference_schema():
    with open(os.path.join(os.path.dirname(__file__), 'reference.yaml')) as reference:
        return yaml_sane_load(reference)
Esempio n. 9
0
def test_non_public(db):
    output = call_generate_swagger(format='yaml',
                                   api_url='http://test.local:8002/',
                                   private=True)
    output_schema = yaml_sane_load(output)
    assert len(output_schema['paths']) == 0
Esempio n. 10
0
def test_non_public(client):
    response = client.get('/private/swagger.yaml')
    swagger = yaml_sane_load(response.content.decode('utf-8'))
    assert len(swagger['paths']) == 0
Esempio n. 11
0
def test_reference_schema(call_generate_swagger, db, reference_schema):
    output = call_generate_swagger(format='yaml',
                                   api_url='http://test.local:8002/',
                                   user='******')
    output_schema = yaml_sane_load(output)
    assert output_schema == reference_schema
Esempio n. 12
0
def _get_versioned_schema(prefix, client, validate_schema):
    response = client.get(prefix + '/swagger.yaml')
    assert response.status_code == 200
    swagger = yaml_sane_load(response.content.decode('utf-8'))
    _check_base(swagger, prefix, validate_schema)
    return swagger
Esempio n. 13
0
def _get_versioned_schema_management(prefix, call_generate_swagger, validate_schema, kwargs):
    output = call_generate_swagger(format='yaml', api_url='http://localhost' + prefix + '/swagger.yaml', **kwargs)
    swagger = yaml_sane_load(output)
    _check_base(swagger, prefix, validate_schema)
    return swagger