Example #1
0
 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(
         '//'), (
         '', '#'))
Example #2
0
    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
Example #3
0
    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
Example #4
0
    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')]
        ]))
Example #5
0
    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
Example #6
0
 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')
Example #7
0
    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')
                    ]]))
Example #8
0
    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')
        ]]))
Example #9
0
    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')
Example #10
0
    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')
            ]]))
Example #11
0
 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:]))
Example #12
0
 def test_normalize_url_on_windows(self):
     self.assertEqual(utils.normalize_url(r'C:\path\to\something'),
                      'file:///C:/path/to/something')
Example #13
0
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'])
Example #14
0
 def test_normalize_url_on_windows(self):
     self.assertEqual(utils.normalize_url(r'C:\path\to\something'), 'file:///C:/path/to/something')
Example #15
0
 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:]))
Example #16
0
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')