def test_path_invalid(self): spec = collections.defaultdict(collections.OrderedDict) spec['paths']['/resource_a'] = { 'get': { 'description': 'resource a', 'responses': { '200': {'description': 'ok'}, } } } spec['paths']['/resource_b'] = { 'post': { 'description': 'resource b', 'responses': { '404': {'description': 'error'}, } } } with pytest.raises(ValueError) as exc: openapi20.openapihttpdomain(spec, paths=[ '/resource_a', '/resource_invalid_name', ]) assert str(exc.value) == ( 'One or more paths are not defined in the spec: ' '/resource_invalid_name.' )
def test_unicode_is_allowed(self): spec = { 'paths': { '/resource_a': { 'get': { 'description': '\u041f', 'responses': { '200': {'description': 'ok'} } } } } } text = '\n'.join(openapi20.openapihttpdomain(spec)) assert text == textwrap.dedent(''' .. http:get:: /resource_a :synopsis: null \u041f :status 200: ok ''').lstrip()
def test_path_option(self): spec = collections.defaultdict(collections.OrderedDict) spec['paths']['/resource_a'] = { 'get': { 'description': 'resource a', 'responses': { '200': {'description': 'ok'}, } } } spec['paths']['/resource_b'] = { 'post': { 'description': 'resource b', 'responses': { '404': {'description': 'error'}, } } } text = '\n'.join(openapi20.openapihttpdomain(spec, paths=[ '/resource_a', ])) assert text == textwrap.dedent(''' .. http:get:: /resource_a :synopsis: null resource a :status 200: ok ''').lstrip()
def test_root_parameters(self): spec = {'paths': {}} spec['paths']['/resources/{name}'] = collections.OrderedDict() spec['paths']['/resources/{name}']['parameters'] = [{ 'name': 'name', 'in': 'path', 'type': 'string', 'description': 'The name of the resource.', }] spec['paths']['/resources/{name}']['get'] = { 'summary': 'Fetch a Resource', 'description': '~ some useful description ~', 'responses': { '200': { 'description': 'The fetched resource.', }, }, } spec['paths']['/resources/{name}']['put'] = { 'summary': 'Modify a Resource', 'description': '~ some useful description ~', 'responses': { '200': { 'description': 'The modified resource.', }, }, } text = '\n'.join(openapi20.openapihttpdomain(spec)) assert text == textwrap.dedent(''' .. http:get:: /resources/{name} :synopsis: Fetch a Resource **Fetch a Resource** ~ some useful description ~ :param string name: The name of the resource. :status 200: The fetched resource. .. http:put:: /resources/{name} :synopsis: Modify a Resource **Modify a Resource** ~ some useful description ~ :param string name: The name of the resource. :status 200: The modified resource. ''').lstrip()
def test_basic(self): text = '\n'.join(openapi20.openapihttpdomain({ 'paths': { '/resources/{kind}': { 'get': { 'summary': 'List Resources', 'description': '~ some useful description ~', 'parameters': [ { 'name': 'kind', 'in': 'path', 'type': 'string', 'description': 'Kind of resource to list.', }, { 'name': 'limit', 'in': 'query', 'type': 'integer', 'description': 'Show up to `limit` entries.', }, { 'name': 'If-None-Match', 'in': 'header', 'type': 'string', 'description': 'Last known resource ETag.' }, ], 'responses': { '200': { 'description': 'An array of resources.', 'headers': { 'ETag': { 'description': 'Resource ETag.', 'type': 'string' }, }, }, }, }, }, }, })) assert text == textwrap.dedent(''' .. http:get:: /resources/{kind} :synopsis: List Resources **List Resources** ~ some useful description ~ :param string kind: Kind of resource to list. :query integer limit: Show up to `limit` entries. :status 200: An array of resources. :reqheader If-None-Match: Last known resource ETag. :resheader ETag: Resource ETag. ''').lstrip()
def test_json_in_out(self): text = '\n'.join(openapi20.openapihttpdomain({ 'definitions': { 'CreateResourceSchema': { 'additionalProperties': False, 'properties': { 'string_field': { 'type': 'string', 'description': 'some input string' }, 'int_field': { 'default': 1, 'type': 'integer', }, }, 'required': [ 'string_field' ], 'title': 'CreateResourceSchema', 'type': 'object' }, 'ResourceSchema': { 'properties': { 'string_field': { 'type': 'string', 'description': 'some output string' }, 'int_field': { 'type': 'integer', }, }, 'required': [ 'string_field' ], 'title': 'ResourceSchema', 'type': 'object' }, 'Error': { 'properties': { 'errors': { 'type': 'object' }, 'message': { 'type': 'string' } }, 'required': [ 'message' ], 'title': 'Error', 'type': 'object' }, }, 'paths': { '/resources': { 'post': { 'description': '~ some useful description ~', 'parameters': [ { 'in': 'body', 'name': 'CreateResourceSchema', 'required': True, 'schema': { '$ref': '#/definitions/CreateResourceSchema' } }, ], 'responses': { '201': { 'description': '~ some useful description ~', 'schema': { '$ref': '#/definitions/ResourceSchema' } }, 'default': { 'description': '~ some useful description ~', 'schema': { '$ref': '#/definitions/Error' } } }, }, }, }, })) text2 = textwrap.dedent(''' .. http:post:: /resources :synopsis: null ~ some useful description ~ :<json integer int_field: :<json string string_field: some input string (required) :status 201: ~ some useful description ~ :status default: ~ some useful description ~ :>json integer int_field: :>json string string_field: some output string (required) ''').lstrip() assert text == text2