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
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']} )
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
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"]})
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')))
def reference_schema(): with open(os.path.join(os.path.dirname(__file__), 'reference.yaml')) as reference: return yaml_sane_load(reference)
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
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
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
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
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