def test_jr_split(self): """ test jr_split """ self.assertEqual(utils.jr_split( 'http://test.com/api/swagger.json#/definitions/s1'), ( 'http://test.com/api/swagger.json', '#/definitions/s1')) self.assertEqual(utils.jr_split( 'http://test/com/api/'), ( 'http://test/com/api/', '#')) self.assertEqual(utils.jr_split( '#/definitions/s1'), ( '', '#/definitions/s1')) self.assertEqual(utils.jr_split( '/user/tmp/local/ttt'), ( 'file:///user/tmp/local/ttt', '#')) self.assertEqual(utils.jr_split( '/user/tmp/local/ttt/'), ( 'file:///user/tmp/local/ttt', '#')) # relative path should be converted to absolute one self.assertEqual(utils.jr_split( 'user'), ( utils.normalize_url('user'), '#')) self.assertEqual(utils.jr_split( '#'), ( '', '#')) self.assertEqual(utils.jr_split( '//'), ( '', '#'))
def load(kls, url, getter=None, parser=None, url_load_hook=None, sep=consts.private.SCOPE_SEPARATOR, prim=None): """ load json as a raw SwaggerApp :param str url: url of path of Swagger API definition :param getter: customized Getter :type getter: sub class/instance of Getter :param parser: the parser to parse the loaded json. :type parser: pyswagger.base.Context :param dict app_cache: the cache shared by related SwaggerApp :param func url_load_hook: hook to patch the url to load json :param str sep: scope-separater used in this SwaggerApp :param prim pyswager.primitives.SwaggerPrimitive: factory for primitives in Swagger :return: the created SwaggerApp object :rtype: SwaggerApp :raises ValueError: if url is wrong :raises NotImplementedError: the swagger version is not supported. """ logger.info('load with [{0}]'.format(url)) url = utils.normalize_url(url) app = kls(url, url_load_hook=url_load_hook, sep=sep, prim=prim) app.__raw, app.__version = app.load_obj(url, getter=getter, parser=parser) if app.__version not in ['1.2', '2.0']: raise NotImplementedError('Unsupported Version: {0}'.format(self.__version)) # update schem if any p = six.moves.urllib.parse.urlparse(url) if p.scheme: app.schemes.append(p.scheme) return app
def load(kls, url, getter=None, parser=None, url_load_hook=None, sep=consts.private.SCOPE_SEPARATOR, prim=None, mime_codec=None, resolver=None): """ load json as a raw App :param str url: url of path of Swagger API definition :param getter: customized Getter :type getter: sub class/instance of Getter :param parser: the parser to parse the loaded json. :type parser: pyswagger.base.Context :param dict app_cache: the cache shared by related App :param func url_load_hook: hook to patch the url to load json :param str sep: scope-separater used in this App :param prim pyswager.primitives.Primitive: factory for primitives in Swagger :param mime_codec pyswagger.primitives.MimeCodec: MIME codec :param resolver: pyswagger.resolve.Resolver: customized resolver used as default when none is provided when resolving :return: the created App object :rtype: App :raises ValueError: if url is wrong :raises NotImplementedError: the swagger version is not supported. """ logger.info('load with [{0}]'.format(url)) url = utils.normalize_url(url) app = kls(url, url_load_hook=url_load_hook, sep=sep, prim=prim, mime_codec=mime_codec, resolver=resolver) app.__raw, app.__version = app.load_obj(url, getter=getter, parser=parser) if app.__version not in ['1.2', '2.0']: raise NotImplementedError('Unsupported Version: {0}'.format(self.__version)) # update schem if any p = six.moves.urllib.parse.urlparse(url) if p.scheme: app.schemes.append(p.scheme) return app
def test_schema(self): folder = utils.normalize_url(get_test_data_folder( version='2.0', which=os.path.join('circular', 'schema') )) def _pf(s): return folder + '#' + s app = App.load(folder) app.prepare(strict=False) s = Scanner(app) c = CycleDetector() s.scan(root=app.raw, route=[c]) self.maxDiff = None self.assertEqual(sorted(c.cycles['schema']), sorted([ [_pf('/definitions/s10'), _pf('/definitions/s11'), _pf('/definitions/s9'), _pf('/definitions/s10')], [_pf('/definitions/s5'), _pf('/definitions/s5')], [_pf('/definitions/s1'), _pf('/definitions/s2'), _pf('/definitions/s3'), _pf('/definitions/s4'), _pf('/definitions/s1')], [_pf('/definitions/s12'), _pf('/definitions/s13'), _pf('/definitions/s12')], [_pf('/definitions/s6'), _pf('/definitions/s7'), _pf('/definitions/s6')], [_pf('/definitions/s14'), _pf('/definitions/s15'), _pf('/definitions/s14')] ]))
def load(kls, url, getter=None, parser=None, app_cache=None, url_load_hook=None, sep=consts.private.SCOPE_SEPARATOR): """ load json as a raw SwaggerApp :param str url: url of path of Swagger API definition :param getter: customized Getter :type getter: sub class/instance of Getter :param parser: the parser to parse the loaded json. :type parser: pyswagger.base.Context :param dict app_cache: the cache shared by related SwaggerApp :param func url_load_hook: hook to patch the url to load json :param str sep: scope-separater used in this SwaggerApp :return: the created SwaggerApp object :rtype: SwaggerApp :raises ValueError: if url is wrong :raises NotImplementedError: the swagger version is not supported. """ logger.info('load with [{0}]'.format(url)) url = utils.normalize_url(url) app = kls(url, app_cache=app_cache, url_load_hook=url_load_hook, sep=sep) app._load_obj(url, getter, parser) # update schem if any p = six.moves.urllib.parse.urlparse(url) if p.scheme: app.schemes.append(p.scheme) return app
def test_normalize_url(self): self.assertEqual(utils.normalize_url(None), None) self.assertEqual(utils.normalize_url(''), '') self.assertEqual(utils.normalize_url('http://test.com/a/q.php?q=100'), 'http://test.com/a/q.php?q=100') self.assertEqual(utils.normalize_url('/tmp/local/test/'), 'file:///tmp/local/test') self.assertEqual(utils.normalize_url('/tmp/local/test'), 'file:///tmp/local/test') self.assertEqual(utils.normalize_url('/tmp/local/test in space.txt'), 'file:///tmp/local/test%20in%20space.txt')
def test_schema(self): folder = utils.normalize_url( get_test_data_folder(version='2.0', which=os.path.join('circular', 'schema'))) def _pf(s): return folder + '#' + s app = App.load(folder) app.prepare(strict=False) s = Scanner(app) c = CycleDetector() s.scan(root=app.raw, route=[c]) self.maxDiff = None self.assertEqual( sorted(c.cycles['schema']), sorted([[ _pf('/definitions/s10'), _pf('/definitions/s11'), _pf('/definitions/s9'), _pf('/definitions/s10') ], [_pf('/definitions/s5'), _pf('/definitions/s5')], [ _pf('/definitions/s1'), _pf('/definitions/s2'), _pf('/definitions/s3'), _pf('/definitions/s4'), _pf('/definitions/s1') ], [ _pf('/definitions/s12'), _pf('/definitions/s13'), _pf('/definitions/s12') ], [ _pf('/definitions/s6'), _pf('/definitions/s7'), _pf('/definitions/s6') ], [ _pf('/definitions/s14'), _pf('/definitions/s15'), _pf('/definitions/s14') ]]))
def test_path_item(self): folder = utils.normalize_url(get_test_data_folder( version='2.0', which=os.path.join('circular', 'path_item') )) def _pf(s): return folder + '#' + s app = App.create(folder) s = Scanner(app) c = CycleDetector() s.scan(root=app.raw, route=[c]) self.assertEqual(sorted(c.cycles['path_item']), sorted([[ _pf('/paths/~1p1'), _pf('/paths/~1p2'), _pf('/paths/~1p3'), _pf('/paths/~1p4'), _pf('/paths/~1p1') ]]))
def test_no_host_basePath(self): """ test case for swagger.json without 'host' and 'basePath' defined """ path = get_test_data_folder( version='2.0', which=os.path.join('patch', 'no_host_schemes') ) fu = utils.normalize_url(path) # file uri version of path # load swagger.json from a file path app = App.create(path) req, _ = app.s('t1').get() self.assertEqual(req.url, '//localhost/t1') self.assertEqual(req.schemes, ['file']) req.prepare(scheme='file', handle_files=False) self.assertEqual(req.url, 'file://localhost/t1') # load swagger.json from a file uri self.assertNotEqual(six.moves.urllib.parse.urlparse(fu).scheme, '') app = App.create(fu) req, _ = app.s('t1').get() self.assertEqual(req.url, '//localhost/t1') self.assertEqual(req.schemes, ['file']) req.prepare(scheme='file', handle_files=False) self.assertEqual(req.url, 'file://localhost/t1') # load swagger.json from a remote uri def _hook(url): # no matter what url, return the path of local swagger.json return fu url = 'test.com/api/v1' app = App.load('https://'+url, url_load_hook=_hook) app.prepare() # try to make a Request and verify its url req, _ = app.s('t1').get() self.assertEqual(req.url, '//test.com/t1') self.assertEqual(req.schemes, ['https']) req.prepare(scheme='https', handle_files=False) self.assertEqual(req.url, 'https://test.com/t1')
def test_path_item(self): folder = utils.normalize_url( get_test_data_folder(version='2.0', which=os.path.join('circular', 'path_item'))) def _pf(s): return folder + '#' + s app = App.create(folder) s = Scanner(app) c = CycleDetector() s.scan(root=app.raw, route=[c]) self.assertEqual( sorted(c.cycles['path_item']), sorted([[ _pf('/paths/~1p1'), _pf('/paths/~1p2'), _pf('/paths/~1p3'), _pf('/paths/~1p4'), _pf('/paths/~1p1') ]]))
def _hook(url): # a demo of hooking a remote url to local path p = six.moves.urllib.parse.urlparse(url) return utils.normalize_url(os.path.join(folder, p.path[1:]))
def test_normalize_url_on_windows(self): self.assertEqual(utils.normalize_url(r'C:\path\to\something'), 'file:///C:/path/to/something')
from pyswagger import App, errs from pyswagger.utils import normalize_url from ..utils import get_test_data_folder, is_windows from ...spec.v2_0 import objects import unittest import os import six folder = normalize_url(get_test_data_folder(version='1.2', which='wordnik')) def _pf(s): return folder + '#' + s class Swagger_Upgrade_TestCase(unittest.TestCase): """ test for upgrade from converting 1.2 to 2.0 """ @classmethod def setUpClass(kls): kls.app = App._create_(folder) def test_resource_list(self): """ ResourceList -> Swagger """ s = self.app.root self.assertEqual(s.swagger, '2.0') self.assertEqual(s.host, 'petstore.swagger.wordnik.com') self.assertEqual(s.basePath, '') self.assertEqual(s.info.version, '1.0.0') self.assertEqual(s.schemes, ['http', 'https'])
from pyswagger import App, errs from pyswagger.utils import normalize_url from ..utils import get_test_data_folder, is_windows from ...spec.v2_0 import objects import unittest import os import six folder = normalize_url(get_test_data_folder( version='1.2', which='wordnik' )) def _pf(s): return folder + '#' + s class Swagger_Upgrade_TestCase(unittest.TestCase): """ test for upgrade from converting 1.2 to 2.0 """ @classmethod def setUpClass(kls): kls.app = App._create_(folder) def test_resource_list(self): """ ResourceList -> Swagger """ s = self.app.root self.assertEqual(s.swagger, '2.0')