Ejemplo n.º 1
0
    def test_parameter(self):
        """ Parameter -> Parameter
        """
        # body
        o = self.app.root.paths['/api/pet/{petId}'].patch
        p = [p for p in o.parameters if getattr(p, 'in') == 'body'][0]
        self.assertEqual(getattr(p, 'in'), 'body')
        self.assertEqual(p.required, True)
        self.assertEqual(getattr(p.schema, '$ref'), _pf('/definitions/pet!##!Pet'))

        # form
        o = self.app.root.paths['/api/pet/uploadImage'].post
        p = [p for p in o.parameters if getattr(p, 'in') == 'formData' and p.type == 'string'][0]
        self.assertEqual(p.name, 'additionalMetadata')
        self.assertEqual(p.required, False)

        # file
        o = self.app.root.paths['/api/pet/uploadImage'].post
        p = [p for p in o.parameters if getattr(p, 'in') == 'formData' and p.type == 'file'][0]
        self.assertEqual(p.name, 'file')
        self.assertEqual(p.required, False)

        # non-body can't have $ref
        try:
            App._create_(get_test_data_folder(
                version='1.2',
                which='upgrade_parameter'
            ))
        except errs.SchemaError as e:
            self.failUnlessEqual(e.args, ("Can't have $ref in non-body Parameters",))
        else:
            self.fail('SchemaError not raised')
Ejemplo n.º 2
0
    def test_dict_getter_v2_0(self):
        """ make sure 'DictGetter' works the same as 'LocalGetter'
        for Swagger 2.0
        """

        #
        # loading via DictGetter
        #
        path = get_test_data_folder(
            version='2.0',
            which='wordnik'
        )

        origin_app = App.create(path)

        with open(os.path.join(path, 'swagger.json'), 'r') as f:
            spec = json.loads(f.read())

        getter = DictGetter([path], {
            os.path.join(path, 'swagger.json'): spec
        })
        app = App.load(path, resolver=Resolver(default_getter=getter))
        app.prepare()

        # make sure it produce the same App in default way
        self.assertEqual(sorted(_diff_(app.dump(), origin_app.dump())), [])

        #
        # loading via wrong path, should be ok when all internal $ref are not absoluted
        #
        getter = DictGetter([''], {
            '': spec
        })
        app = App.load('', resolver=Resolver(default_getter=getter))
        app.prepare()

        # make sure it produce the same App in default way
        self.assertEqual(sorted(_diff_(app.dump(), origin_app.dump(), exclude=['$ref'])), [])

        #
        # faking http path
        #
        getter = DictGetter(['https://petstore.com'], {
            'https://petstore.com': spec
        })
        app = App.load('https://petstore.com', resolver=Resolver(default_getter=getter))
        app.prepare()

        # make sure it produce the same App in default way
        self.assertEqual(sorted(_diff_(app.dump(), origin_app.dump(), exclude=['$ref'])), [])
Ejemplo n.º 3
0
    def test_load(self):
        """ make sure the result of yaml and json are identical """
        app_json = App.load(get_test_data_folder(
            version='2.0',
            which='wordnik'
        ))
        app_yaml = App.load(get_test_data_folder(
            version='2.0',
            which='yaml',
            )
        )
        s = Scanner(app_yaml)
        s.scan(route=[YamlFixer()], root=app_yaml.raw, leaves=[Operation])

        self.assertEqual((True, ''), app_json.raw.compare(app_yaml.raw))
Ejemplo n.º 4
0
    def test_v2_0(self):
        """ convert from 2.0 to 2.0 """
        path = get_test_data_folder(version='2.0', which='wordnik')
        app = App.create(path)

        # load swagger.json into dict
        origin = None
        with open(os.path.join(path, 'swagger.json')) as r:
            origin = json.loads(r.read())

        # diff for empty list or dict is allowed
        d = app.dump()
        self.assertEqual(
            sorted(_diff_(origin, d, exclude=['$ref'])),
            sorted([('paths/~1pet~1{petId}/get/security/0/api_key', "list",
                     "NoneType"),
                    ('paths/~1store~1inventory/get/parameters', None, None),
                    ('paths/~1store~1inventory/get/security/0/api_key', "list",
                     "NoneType"),
                    ('paths/~1user~1logout/get/parameters', None, None)]))

        # try to load the dumped dict back, to see if anything wrong
        tmp = {'_tmp_': {}}
        with SwaggerContext(tmp, '_tmp_') as ctx:
            ctx.parse(d)
Ejemplo n.º 5
0
    def __init__(self,
                 creds=elicit_creds.ElicitCreds(),
                 api_url=PRODUCTION_URL,
                 send_opt=dict(verify=True)):
        print("Initialize Elicit client library for %s options:" % api_url)
        print(send_opt)

        if ((not send_opt['verify']) and api_url.startswith("https")):
            print('WARNING: not checking SSL')
            dont_check_ssl()

        self.api_url = api_url
        self.swagger_url = self.api_url + '/apidocs/v1/swagger.json'
        self.app = App._create_(self.swagger_url)
        self.auth = Security(self.app)
        self.creds = creds

        # init swagger client
        self.client = Client(
            self.auth, send_opt=send_opt
        )  # HACK to work around self-signed SSL certs used in development
        if (self.app.root.host != self.api_url):
            print(
                'WARNING: API URL from swagger doesn\'t match this configuration: [%s] vs [%s]'
                % (self.api_url, self.app.root.host))
Ejemplo n.º 6
0
    def test_path_item_prepare_with_cycle(self):
        app = App.load(
            get_test_data_folder(version='2.0',
                                 which=os.path.join('circular', 'path_item')))

        # should raise nothing
        app.prepare()
Ejemplo n.º 7
0
    def runAction(self, action, **kwargs):

        if "config_override" in kwargs:
            self.overwriteConfig(kwargs['config_override'])
            del (kwargs['config_override'])

        factory = Primitive()
        factory.register('string', 'int-or-string', self._encode_intOrString)

        app = App.load(url=self.swagger, prim=factory)
        app.prepare()
        client = Client(config=self.config, send_opt=({'verify': False}))

        opt = dict(url_netloc=self.config['kubernetes_api_url'][8:])

        op = app.op[action]

        # bit of a hack - pyswagger can't handle */* currently
        if op.consumes[0] == u'*/*':
            op.consumes[0] = u'application/json'

        a = op(**kwargs)

        resp = client.request(a, opt=opt)

        return resp
Ejemplo n.º 8
0
    def test_float_dump(self):
        """ failed to dump an object with float property

        refer to issue: https://github.com/mission-liao/pyswagger/issues/92
        """
        app = App.create(get_test_data_folder(version='2.0', which=os.path.join('schema', 'floatDump')))
        app.dump() # should not raise exception
Ejemplo n.º 9
0
    def test_path_item(self):
        folder = get_test_data_folder(
            version='2.0',
            which=os.path.join('circular', 'path_item')
        )

        def _pf(s):
            return six.moves.urllib.parse.urlunparse((
                'file',
                '',
                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')
        ]]))
Ejemplo n.º 10
0
 def test_random_name_v2_0(self):
     """
     """
     path = get_test_data_folder(version='2.0', which='random_file_name')
     path = os.path.join(path, 'test_random.json')
     # should not raise ValueError
     app = App.create(path)
Ejemplo n.º 11
0
    def test_schema(self):
        folder = get_test_data_folder(
            version='2.0',
            which=os.path.join('circular', 'schema')
        )

        def _pf(s):
            return six.moves.urllib.parse.urlunparse((
                'file',
                '',
                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')]
        ]))
Ejemplo n.º 12
0
    def _load_swagger_resource(self, endpoint_name: str):
        """
        Get Swagger spec of specified service and create an app instance to
        be able to validate requests/responses and perform request.

        :param endpoint_name: name of the service endpoint that data will be retrieved
        :return PySwagger.App: an app instance
        """
        # load Swagger resource file

        logic_module = self._get_logic_module(endpoint_name)
        schema_url = utils.get_swagger_url_by_logic_module(logic_module)

        if schema_url not in self._data:
            # load swagger json as a raw App and prepare it
            try:
                app = App.load(schema_url)
            except URLError:
                raise URLError(f'Make sure that {schema_url} is accessible.')
            if app.raw.basePath == '/':
                getattr(app, 'raw').update_field('basePath', '')
            app.prepare()
            self._data[schema_url] = app

        return self._data[schema_url]
Ejemplo n.º 13
0
    def test_uploadImages(self):
        """ test for uploading multiple files """
        global received_files

        app = App._create_(
            get_test_data_folder(version='2.0',
                                 which=os.path.join('io', 'files')))
        resp = yield self.client.request(app.op['upload_images'](images=[
            dict(data=six.BytesIO(six.b('test image 1')), filename='_1.k'),
            dict(data=six.BytesIO(six.b('test image 2')), filename='_2.k'),
            dict(data=six.BytesIO(six.b('test image 3')), filename='_3.k'),
        ]),
                                         opt=dict(url_netloc='localhost:' +
                                                  str(self.get_http_port())))

        self.assertEqual(
            received_files[0], {
                'body': six.b('test image 1'),
                'content_type': 'application/unknown',
                'filename': u'_1.k'
            })
        self.assertEqual(
            received_files[1], {
                'body': six.b('test image 2'),
                'content_type': 'application/unknown',
                'filename': u'_2.k'
            })
        self.assertEqual(
            received_files[2], {
                'body': six.b('test image 3'),
                'content_type': 'application/unknown',
                'filename': u'_3.k'
            })
Ejemplo n.º 14
0
    def test_authorization(self):
        """
        """
        app = App.create(get_test_data_folder(
            version='1.2', which='simple_auth')
        )

        expect = {
            'type':'apiKey',
            'in':'query',
            'name':'simpleQK'
        }
        self.assertEqual(_diff_(
            expect,
            app.resolve('#/securityDefinitions/simple_key').dump()
        ), [])

        expect = {
            'type':'apiKey',
            'in':'header',
            'name':'simpleHK'
        }
        self.assertEqual(_diff_(
            expect,
            app.resolve('#/securityDefinitions/simple_key2').dump()
        ), [])


        expect = {
            'type':'basic',
        }
        self.assertEqual(_diff_(
            expect,
            app.resolve('#/securityDefinitions/simple_basic').dump()
        ), [])
Ejemplo n.º 15
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')]
        ]))
Ejemplo n.º 16
0
    def setUpClass(kls):
        factory = Primitive()

        def decode_int(obj, val, ctx):
            # minus 1
            return int(val) - 1

        def decode_str(obj, val, ctx):
            # remove the last char
            return str(val)[:-1]

        def str_no_validate(obj, val, ctx):
            # same as the one used in pyswagger, but no validation
            return str(val)

        factory.register('encoded_integer', None, decode_int)
        factory.register('string', 'special_encoded', decode_str)
        factory.register('string', None, str_no_validate, _2nd_pass=None)

        kls.app = App.load(get_test_data_folder(
            version='2.0',
            which=os.path.join('schema', 'extension'),
        ),
                           prim=factory)
        kls.app.prepare()
Ejemplo n.º 17
0
    def test_dict_getter_v2_0(self):
        """ make sure 'DictGetter' works the same as 'LocalGetter'
        for Swagger 2.0
        """

        #
        # loading via DictGetter
        #
        path = get_test_data_folder(version='2.0', which='wordnik')

        origin_app = App.create(path)

        with open(os.path.join(path, 'swagger.json'), 'r') as f:
            spec = json.loads(f.read())

        getter = DictGetter([path], {os.path.join(path, 'swagger.json'): spec})
        app = App.load(path, resolver=Resolver(default_getter=getter))
        app.prepare()

        # make sure it produce the same App in default way
        self.assertEqual(sorted(_diff_(app.dump(), origin_app.dump())), [])

        #
        # loading via wrong path, should be ok when all internal $ref are not absoluted
        #
        getter = DictGetter([''], {'': spec})
        app = App.load('', resolver=Resolver(default_getter=getter))
        app.prepare()

        # make sure it produce the same App in default way
        self.assertEqual(
            sorted(_diff_(app.dump(), origin_app.dump(), exclude=['$ref'])),
            [])

        #
        # faking http path
        #
        getter = DictGetter(['https://petstore.com'],
                            {'https://petstore.com': spec})
        app = App.load('https://petstore.com',
                       resolver=Resolver(default_getter=getter))
        app.prepare()

        # make sure it produce the same App in default way
        self.assertEqual(
            sorted(_diff_(app.dump(), origin_app.dump(), exclude=['$ref'])),
            [])
Ejemplo n.º 18
0
    def test_path_item_prepare_with_cycle(self):
        app = App.load(get_test_data_folder(
            version='2.0',
            which=os.path.join('circular', 'path_item')
        ))

        # should raise nothing
        app.prepare()
Ejemplo n.º 19
0
    def setUpClass(kls):
        kls.app = App.load(get_test_data_folder(version='1.2',
                                                which='wordnik'),
                           sep=':')
        kls.app.prepare()

        with open('./test.json', 'w') as r:
            r.write(json.dumps(kls.app.dump(), indent=3))
Ejemplo n.º 20
0
    def setUpClass(kls):
        kls.app = App.load(get_test_data_folder(
            version='1.2', which='wordnik'), sep=':'
        )
        kls.app.prepare()

        with open('./test.json', 'w') as r:
            r.write(json.dumps(kls.app.dump(), indent=3))
Ejemplo n.º 21
0
    def setUpClass(kls):
        kls.app = App.load(get_test_data_folder(
            version='2.0',
            which='bitbucket'
        ))

        # bypass cyclic testing
        kls.app.prepare(strict=False)
Ejemplo n.º 22
0
 def test_relative_schema(self):
     """ test case for issue#53,
     relative file, which root is a Schema Object
     """
     app = App.load(url='file:///relative/internal.yaml',
                    url_load_hook=_gen_hook(
                        get_test_data_folder(version='2.0', which='ex')))
     app.prepare()
Ejemplo n.º 23
0
 def init(self):
     self.server = self["server"]
     self.port = self["port"]
     self.api = self["api"]
     openapi_spec = 'http://{}:{}/{}/swagger.json'.format(
         self.server, str(self.port), self.api)
     self.app = App._create_(openapi_spec)
     self.client = Client()
     StratusClient.init(self)
Ejemplo n.º 24
0
 def test_relative_schema(self):
     """ test case for issue#53,
     relative file, which root is a Schema Object
     """
     app = App.load(
         url='file:///relative/internal.yaml',
         url_load_hook=_gen_hook(get_test_data_folder(version='2.0', which='ex'))
     )
     app.prepare()
Ejemplo n.º 25
0
def app():
    _codec = MimeCodec()
    _codec.register('application/json', JsonCodec())

    # TODO: how to load .yaml?
    app = App.load('http://petstore.swagger.io/v2/swagger.json', 
                   mime_codec=_codec)
    app.prepare(strict=True)
    return app
Ejemplo n.º 26
0
    def test_deref(self):
        app = App.create(get_test_data_folder(
            version='2.0',
            which=os.path.join('circular', 'schema'),
        ),
                         strict=False)

        s = app.resolve('#/definitions/s1')
        self.assertRaises(errs.CycleDetectionError, utils.deref, s)
Ejemplo n.º 27
0
    def __get_or_create_app(self, url, cache_key):
        """ Get the app from cache or generate a new one if required

        Because app object doesn't have etag/expiry, we have to make
        a head() call before, to have these informations first... """
        headers = {"Accept": "application/json"}
        app_url = '%s?datasource=%s' % (url, self.datasource)

        cached = self.cache.get(cache_key, (None, None, 0))
        if cached is None or len(cached) != 3:
            self.cache.invalidate(cache_key)
            cached_app, cached_headers, cached_expiry = (cached, None, 0)
        else:
            cached_app, cached_headers, cached_expiry = cached

        if cached_app is not None and cached_headers is not None:
            # we didn't set custom expire, use header expiry
            expires = cached_headers.get('expires', None)
            cache_timeout = -1
            if self.expire is None and expires is not None:
                cache_timeout = get_cache_time_left(cached_headers['expires'])
                if cache_timeout >= 0:
                    return cached_app

            # we set custom expire, check this instead
            else:
                if self.expire == 0 or cached_expiry >= time.time():
                    return cached_app

            # if we have etags, add the header to use them
            etag = cached_headers.get('etag', None)
            if etag is not None:
                headers['If-None-Match'] = etag

            # if nothing makes us use the cache, invalidate it
            if ((expires is None or cache_timeout < 0
                 or cached_expiry < time.time()) and etag is None):
                self.cache.invalidate(cache_key)

        # set timeout value in case we have to cache it later
        timeout = 0
        if self.expire is not None and self.expire > 0:
            timeout = time.time() + self.expire

        # we are here, we know we have to make a head call...
        res = requests.head(app_url, headers=headers)
        if res.status_code == 304 and cached_app is not None:
            self.cache.set(cache_key, (cached_app, res.headers, timeout))
            return cached_app

        # ok, cache is not accurate, make the full stuff
        app = App.create(app_url)
        if self.caching:
            self.cache.set(cache_key, (app, res.headers, timeout))

        return app
Ejemplo n.º 28
0
    def test_local_path_with_custome_getter(self):
        """ make sure path would be assigned when
        passing a getter class
        """
        cls = UrlGetter
        path = get_test_data_folder(version='2.0', which='random_file_name')
        path = os.path.join(path, 'test_random.json')

        # should not raise errors
        app = App.load(path, getter=cls)
Ejemplo n.º 29
0
Archivo: app.py Proyecto: akakjs/EsiPy
    def __get_or_create_app(self, app_url, cache_key):
        """ Get the app from cache or generate a new one if required """
        app = self.cache.get(cache_key, None)

        if app is None:
            app = App.create(app_url)
            if self.caching:
                self.cache.set(cache_key, app, self.expire)

        return app
Ejemplo n.º 30
0
 def test_random_name_v1_2(self):
     """
     """
     path = get_test_data_folder(
         version='1.2',
         which='random_file_name'
     )
     path = os.path.join(path, 'test_random.json')
     # should not raise ValueError
     app = App.create(path)
Ejemplo n.º 31
0
    def test_primfactory(self):
        app = App.create(get_test_data_folder(
            version='2.0',
            which=os.path.join('circular', 'schema'),
            ),
            strict=False
        )

        s = app.resolve('#/definitions/s1')
        self.assertRaises(errs.CycleDetectionError, app.prim_factory.produce, s, {})
Ejemplo n.º 32
0
 def test_empty_operation_id(self):
     """ when operationId is empty, should not raise SchemaError """
     try:
         app = App.create(
             get_test_data_folder(version="2.0",
                                  which=os.path.join("schema", "emptyOp")))
     except errs.SchemaError:
         self.fail(
             "SchemaError is raised when 'operationId' is empty and 'tags' is not"
         )
Ejemplo n.º 33
0
    def __init__(self, url, *auths):
        app = App._create_(url)
        auth = Security(app)
        for t, cred in auths:
            auth.update_with(t, cred)

        client = Client(auth)
        self.app, self.client = app, client

        self.client._Client__s.hooks['response'] = logHttp
Ejemplo n.º 34
0
    def setUp(self):
        folder = get_test_data_folder(version='1.2', )

        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:]))

        self.app = App.load('http://petstore.io/wordnik', url_load_hook=_hook)
        self.app.prepare()
Ejemplo n.º 35
0
    def test_deref(self):
        app = App.create(get_test_data_folder(
            version='2.0',
            which=os.path.join('circular', 'schema'),
            ),
            strict=False
        )

        s = app.resolve('#/definitions/s1')
        self.assertRaises(errs.CycleDetectionError, utils.deref, s)
Ejemplo n.º 36
0
    def test_primfactory(self):
        app = App.create(get_test_data_folder(
            version='2.0',
            which=os.path.join('circular', 'schema'),
            ),
            strict=False
        )

        s = app.resolve('#/definitions/s1')
        self.assertRaises(errs.CycleDetectionError, app.prim_factory.produce, s, {})
Ejemplo n.º 37
0
 def test_read_only_and_required(self):
     """ a property is both read-only and required """
     app = App.load(get_test_data_folder(
         version='2.0',
         which=os.path.join('validate', 'req_and_readonly')
     ))
     errs = app.validate(strict=False)
     self.maxDiff = None
     self.assertEqual(sorted(errs), sorted([
         ((u'#/definitions/ReadOnly', 'Schema'), 'ReadOnly property in required list: protected')
     ]))
Ejemplo n.º 38
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')
Ejemplo n.º 39
0
 def test_read_only_and_required(self):
     """ a property is both read-only and required """
     app = App.load(
         get_test_data_folder(version='2.0',
                              which=os.path.join('validate',
                                                 'req_and_readonly')))
     errs = app.validate(strict=False)
     self.maxDiff = None
     self.assertEqual(
         sorted(errs),
         sorted([((u'#/definitions/ReadOnly', 'Schema'),
                  'ReadOnly property in required list: protected')]))
Ejemplo n.º 40
0
    def setUp(self):
        folder = get_test_data_folder(
            version='1.2',
        )

        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:]))

        self.app = App.load('http://petstore.io/wordnik', url_load_hook=_hook)
        self.app.prepare()
Ejemplo n.º 41
0
    def test_item(self):
        """ make sure to raise exception for invalid item
        """
        try:
            App._create_(get_test_data_folder(
                version='1.2',
                which=os.path.join('upgrade_items', 'with_ref')
            ))
        except errs.SchemaError as e:
            self.failUnlessEqual(e.args, ('Can\'t have $ref for Items',))
        else:
            self.fail('SchemaError not raised')

        try:
            App._create_(get_test_data_folder(
                version='1.2',
                which=os.path.join('upgrade_items', 'invalid_primitive')
            ))
        except errs.SchemaError as e:
            self.failUnlessEqual(e.args, ('Non primitive type is not allowed for Items',))
        else:
            self.fail('SchemaError not raised')
Ejemplo n.º 42
0
    def __init__(
        self,
        api_key: str,
        swagger_file:
        str = "http://www.mingweisamuel.com/riotapi-schema/swaggerspec-2.0.yml"
    ):

        self.api_key = api_key
        self.swagger_file = swagger_file
        self.app = App.create(swagger_file)
        self.auth = Security(self.app)
        self.auth.update_with("api_key", api_key)
        self.client = Client(self.auth)
Ejemplo n.º 43
0
    def __init__(self, schema_path, codec=None):
        self._schema_path = schema_path

        if codec is None:
            codec = CodecFactory()

        self._prim_factory = \
            codec._pyswagger_factory  # pylint: disable=protected-access

        self._app = App.load(schema_path, prim=self._prim_factory)
        self._app.prepare()

        self._api = Api(self)
Ejemplo n.º 44
0
    def test_overwrite(self):
        """ overrite type/format handler used in pyswagger """
        m1 = self.app.resolve('#/definitions/m1')
        v = m1._prim_({"job": "man"}, self.app.prim_factory)
        # should not raise
        self.assertEqual(v.job, "man")

        app = App.create(
            get_test_data_folder(version='2.0',
                                 which=os.path.join('schema', 'extension')))
        m1 = app.resolve('#/definitions/m1')
        self.assertRaises(errs.ValidationError, m1._prim_, {'job': 'man'},
                          app.prim_factory)
Ejemplo n.º 45
0
    def test_local_path_with_custome_getter(self):
        """ make sure path would be assigned when
        passing a getter class
        """
        cls = UrlGetter
        path = get_test_data_folder(
            version='2.0',
            which='random_file_name'
        )
        path = os.path.join(path, 'test_random.json')

        # should not raise errors
        app = App.load(path, getter=cls)
Ejemplo n.º 46
0
    def test_parameter(self):
        """ Parameter -> Parameter
        """
        # body
        o = self.app.root.paths['/api/pet/{petId}'].patch
        p = [p for p in o.parameters if getattr(p, 'in') == 'body'][0]
        self.assertEqual(getattr(p, 'in'), 'body')
        self.assertEqual(p.required, True)
        self.assertEqual(getattr(p.schema, '$ref'),
                         _pf('/definitions/pet!##!Pet'))

        # form
        o = self.app.root.paths['/api/pet/uploadImage'].post
        p = [
            p for p in o.parameters
            if getattr(p, 'in') == 'formData' and p.type == 'string'
        ][0]
        self.assertEqual(p.name, 'additionalMetadata')
        self.assertEqual(p.required, False)

        # file
        o = self.app.root.paths['/api/pet/uploadImage'].post
        p = [
            p for p in o.parameters
            if getattr(p, 'in') == 'formData' and p.type == 'file'
        ][0]
        self.assertEqual(p.name, 'file')
        self.assertEqual(p.required, False)

        # non-body can't have $ref
        try:
            App._create_(
                get_test_data_folder(version='1.2', which='upgrade_parameter'))
        except errs.SchemaError as e:
            self.failUnlessEqual(e.args,
                                 ("Can't have $ref in non-body Parameters", ))
        else:
            self.fail('SchemaError not raised')
Ejemplo n.º 47
0
    def test_overwrite(self):
        """ overrite type/format handler used in pyswagger """
        m1 = self.app.resolve('#/definitions/m1')
        v = m1._prim_({
            "job":"man"
        }, self.app.prim_factory)
        # should not raise
        self.assertEqual(v.job, "man")

        app = App.create(get_test_data_folder(
            version='2.0',
            which=os.path.join('schema', 'extension')
        ))
        m1 = app.resolve('#/definitions/m1')
        self.assertRaises(errs.ValidationError, m1._prim_, {'job':'man'}, app.prim_factory)
Ejemplo n.º 48
0
    def test_cookie(self):
        global cookie_cache

        app = App.create(get_test_data_folder(
            version='2.0',
            which=os.path.join('io', 'cookie')
        ))
        client = Webapp2TestClient(cookie_app, keep_cookie=True)
        resp = client.request(app.op['get_cookie']())
        self.assertEqual(resp.status, 200)

        resp = client.request(app.op['keep_cookie']())
        self.assertEqual(resp.status, 200)

        self.assertEqual(cookie_cache, 'test 123')
Ejemplo n.º 49
0
    def test_model_inheritance(self):
        """
        """
        app = App.load(get_test_data_folder(
            version='1.2', which='model_subtypes'
            ), sep=':')
        app.prepare()

        expect = {
            'allOf': [{'$ref': u'#/definitions/user:User'}]
        }

        self.assertEqual(_diff_(
            expect,
            app.resolve('#/definitions/user:UserWithInfo').dump(),
            include=['allOf']
        ), [])
Ejemplo n.º 50
0
    def test_load_from_url_without_file(self):
        """ try to load from a url withou swagger.json """
        data = None
        with open(os.path.join(get_test_data_folder(
            version='2.0',
            which='wordnik'), 'swagger.json')) as f:
            data = f.read()

        httpretty.register_uri(
            httpretty.GET,
            'http://10.0.0.10:8080/swaggerapi/api/v1beta2',
            body=data
        )

        # no exception should be raised
        app = App.create('http://10.0.0.10:8080/swaggerapi/api/v1beta2')
        self.assertTrue(app.schemes, ['http'])
        self.assertTrue(isinstance(app.root, BaseObj))
Ejemplo n.º 51
0
    def test_uploadImages(self):
        """ upload multiple files """
        httpretty.register_uri(httpretty.POST, 'http://test.com/upload', status=200)

        app = App._create_(get_test_data_folder(version='2.0', which=os.path.join('io', 'files')))
        resp = client.request(app.op['upload_images'](images=[
                dict(data=six.BytesIO(six.b('test image 1')), filename='_1.k'),
                dict(data=six.BytesIO(six.b('test image 2')), filename='_2.k'),
                dict(data=six.BytesIO(six.b('test image 3')), filename='_3.k')
            ])
        )
        self.assertEqual(resp.status, 200)
        body = httpretty.last_request().body.decode()
        self.assertTrue(body.find('_1.k') != -1)
        self.assertTrue(body.find('test image 1') != -1)
        self.assertTrue(body.find('_2.k') != -1)
        self.assertTrue(body.find('test image 2') != -1)
        self.assertTrue(body.find('_3.k') != -1)
        self.assertTrue(body.find('test image 3') != -1)
Ejemplo n.º 52
0
    def test_uploadImages(self):
        """ test for uploading multiple files """
        global received_files

        app = App._create_(get_test_data_folder(version='2.0', which=os.path.join('io', 'files')))
        resp = yield self.client.request(
            app.op['upload_images'](images=[
                dict(data=six.BytesIO(six.b('test image 1')), filename='_1.k'),
                dict(data=six.BytesIO(six.b('test image 2')), filename='_2.k'),
                dict(data=six.BytesIO(six.b('test image 3')), filename='_3.k'),
            ]),
            opt=dict(
                url_netloc='localhost:'+str(self.get_http_port())
            )
        )

        self.assertEqual(received_files[0], {'body': six.b('test image 1'), 'content_type': 'application/unknown', 'filename': u'_1.k'})
        self.assertEqual(received_files[1], {'body': six.b('test image 2'), 'content_type': 'application/unknown', 'filename': u'_2.k'})
        self.assertEqual(received_files[2], {'body': six.b('test image 3'), 'content_type': 'application/unknown', 'filename': u'_3.k'})
Ejemplo n.º 53
0
    def test_auto_schemes(self):
        """ make sure we scheme of url to access
        swagger.json as default scheme
        """
        # load swagger.json
        data = None
        with open(os.path.join(get_test_data_folder(
                version='2.0',
                which=os.path.join('schema', 'model')
                ), 'swagger.json')) as f:
            data = f.read()

        httpretty.register_uri(
            httpretty.GET,
            'http://test.com/api-doc/swagger.json',
            body=data
        )

        app = App._create_('http://test.com/api-doc/swagger.json')
        self.assertEqual(app.schemes, ['http'])
Ejemplo n.º 54
0
    def test_token_endpoint(self):
        """
        """
        app = App.create(get_test_data_folder(
            version='1.2', which='simple_auth')
        )

        expect={
            'tokenUrl':'http://petstore.swagger.wordnik.com/api/oauth/token',
            'type':'oauth2',
            'flow':'access_code',
            'scopes': {
                'test:anything':'for testing purpose'
            }
        }

        self.assertEqual(_diff_(
            expect,
            app.resolve('#/securityDefinitions/oauth2').dump()
        ), [])
Ejemplo n.º 55
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')
        ]]))
Ejemplo n.º 56
0
    def setUpClass(kls):
        factory = Primitive()
        def decode_int(obj, val, ctx):
            # minus 1
            return int(val) - 1

        def decode_str(obj, val, ctx):
            # remove the last char
            return str(val)[:-1]

        def str_no_validate(obj, val, ctx):
            # same as the one used in pyswagger, but no validation
            return str(val)

        factory.register('encoded_integer', None, decode_int)
        factory.register('string', 'special_encoded', decode_str)
        factory.register('string', None, str_no_validate, _2nd_pass=None)

        kls.app = App.load(get_test_data_folder(
            version='2.0',
            which=os.path.join('schema', 'extension'),
        ), prim=factory)
        kls.app.prepare()
Ejemplo n.º 57
0
    def test_v2_0(self):
        """ convert from 2.0 to 2.0 """
        path = get_test_data_folder(version='2.0', which='wordnik')
        app = App.create(path)

        # load swagger.json into dict
        origin = None
        with open(os.path.join(path, 'swagger.json')) as r:
            origin = json.loads(r.read())

        # diff for empty list or dict is allowed
        d = app.dump()
        self.assertEqual(sorted(_diff_(origin, d, exclude=['$ref'])), sorted([
            ('paths/~1pet~1{petId}/get/security/0/api_key', "list", "NoneType"),
            ('paths/~1store~1inventory/get/parameters', None, None),
            ('paths/~1store~1inventory/get/security/0/api_key', "list", "NoneType"),
            ('paths/~1user~1logout/get/parameters', None, None)
        ]))

        # try to load the dumped dict back, to see if anything wrong
        tmp = {'_tmp_': {}}
        with SwaggerContext(tmp, '_tmp_') as ctx:
            ctx.parse(d)
Ejemplo n.º 58
0
from __future__ import absolute_import
from tornado import web, testing
from tornado.ioloop import IOLoop
from pyswagger import App
from pyswagger.contrib.client.tornado import TornadoClient
from ...utils import create_pet_db, get_test_data_folder, pet_Mary
import json
import six
import os


sapp = App._create_(get_test_data_folder(version='1.2', which='wordnik'))
received_file = None
received_meta = None
received_headers = None

""" refer to pyswagger.tests.data.v1_2.wordnik for details """

class RESTHandler(web.RequestHandler):
    """ base implementation of RequestHandler,
    accept a db as init paramaeter.
    """
    def initialize(self, db):
        self.db = db

    def prepare(self):
        """
        According to FAQ of tornado, they won't handle json media-type.
        """
        super(RESTHandler, self).prepare()