예제 #1
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))
예제 #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'])), [])
예제 #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))
예제 #4
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')]
        ]))
예제 #5
0
    def __init__(
        self,
        schema_path,
        codec=None,
        username=None,
        password=None,
        token=None,
        security_name=None,
    ):
        self._schema_path = schema_path

        self._username = username
        self._password = password
        self._token = token

        self._auth_creds = None
        if username or password:
            security_name = security_name or "basic"
            self._auth_creds = (security_name, (username, password))
        elif token:
            security_name = security_name or "apiKey"
            self._auth_creds = (security_name, token)

        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)
예제 #6
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
예제 #7
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]
예제 #8
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')]
        ]))
예제 #9
0
 def _create_app(self, url, headers):
     app = App.load(
         url,
         getter=self._create_getter(headers=headers),
     )
     app.prepare(strict=False)
     return app
예제 #10
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()
예제 #11
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()
예제 #12
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'])),
            [])
예제 #13
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)
예제 #14
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()
예제 #15
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))
예제 #16
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))
예제 #17
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()
예제 #18
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
예제 #19
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()
예제 #20
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()
예제 #21
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)
예제 #22
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')
     ]))
예제 #23
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')]))
예제 #24
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()
예제 #25
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)
예제 #26
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)
예제 #27
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']), [])
예제 #28
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')
                    ]]))
예제 #29
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']
        ), [])
예제 #30
0
    def __init__(
        self,
        schema_path,
        codec=None,
        username=None,
        password=None,
        token=None,
        security_name=None,
        extra_headers=None,
    ):
        if extra_headers is None:
            extra_headers = {}
        self.extra_headers = extra_headers

        self._schema_path = schema_path

        self._username = username
        self._password = password
        self._token = token

        self._auth_creds = None
        if username or password:
            security_name = security_name or "basic"
            self._auth_creds = (security_name, (username, password))
        elif token:
            security_name = security_name or "apiKey"
            self._auth_creds = (security_name, token)

        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)

        security = Security(self._app)
        if self._auth_creds:
            security.update_with(*self._auth_creds)

        self.client = PyswaggerClient(security)
예제 #31
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')
예제 #32
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()
예제 #33
0
    @Disp.register([Authorization])
    def _authorization(self, path, obj, _):
        self.authorization.append(path)

    @Disp.register([ResponseMessage])
    def _response_message(self, path, obj, _):
        if path.startswith('#/apis/store'):
            self.response_message.append(path)

    @Disp.register([Parameter])
    def _parameter(self, path, obj, _):
        if path.startswith('#/apis/pet/apis/updatePetWithForm'):
            self.parameter.append(path)


app = App.load(get_test_data_folder(version='1.2', which='wordnik'))


class ScannerTestCase(unittest.TestCase):
    """ test scanner """
    def test_count(self):
        s = Scanner(app)
        co = CountObject()
        s.scan(route=[co], root=app.raw)

        self.assertEqual(co.long_name, 'createUsersWithArrayInput')
        self.assertEqual(co.total, {
            Authorization: 1,
            Resource: 3,
            Operation: 20,
            ResponseMessage: 23
예제 #34
0
    def test_dict_getter_v1_2(self):
        """ make sure 'DictGetter' works the same as 'LocalGetter'
        for Swagger 1.2
        """

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

        path_resource_list = os.path.join(path, 'resource_list.json')
        path_pet = os.path.join(path, 'pet.json')
        path_store = os.path.join(path, 'store.json')
        path_user = os.path.join(path, 'user.json')
        with open(path_resource_list, 'r') as f:
            resource_list = json.loads(f.read())
        with open(path_pet, 'r') as f:
            pet = json.loads(f.read())
        with open(path_store, 'r') as f:
            store = json.loads(f.read())
        with open(path_user, 'r') as f:
            user = json.loads(f.read())

        getter = DictGetter([
            path_resource_list,
            path_pet,
            path_user,
            path_store,
        ], {
            path_resource_list: resource_list,
            path_pet: pet,
            path_store: store,
            path_user: user,
        })
        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(), App.create(path).dump())), [])

        #
        # different path, mocking an url
        #
        getter = DictGetter([
            'http://petstore.com',
            'http://petstore.com/pet.json',
            'http://petstore.com/user.json',
            'http://petstore.com/store.json',
        ], {
            'http://petstore.com': resource_list,
            'http://petstore.com/pet.json': pet,
            'http://petstore.com/store.json': store,
            'http://petstore.com/user.json': user
        })
        app = App.load('http://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(), App.create(path).dump(), exclude=['$ref'])), [])

        #
        # provide empty path
        #
        getter = DictGetter([
            '',
            'pet.json',
            'user.json',
            'store.json',
        ], {
            '': resource_list,
            'pet.json': pet,
            'store.json': store,
            'user.json': user
        })
        app = App.load('http://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(), App.create(path).dump(), exclude=['$ref'])), [])
예제 #35
0
 def setUp(self):
     self.app = App.load(get_test_data_folder(version='1.2', which='err'))
예제 #36
0
 def setUpClass(kls):
     kls.app = App.load(url='file:///root/swagger.json',
                        url_load_hook=_gen_hook(
                            get_test_data_folder(version='2.0',
                                                 which='ex')))
     kls.app.prepare()
예제 #37
0
 def setUpClass(kls):
     kls.app = App.load(
         url='file:///root/swagger.json',
         url_load_hook=_gen_hook(get_test_data_folder(version='2.0', which='ex'))
     )
     kls.app.prepare()
예제 #38
0
copyfile(templatedir + "/sensor_template.yaml.jinja",
         kubedir + "/sensor_template.yaml.jinja")

templateLoader = jinja2.FileSystemLoader(searchpath=templatedir)
templateEnv = jinja2.Environment(loader=templateLoader)


def _encode_intOrString(self, obj, val, ctx):

    return int(val)


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

app = App.load(url=swagger, prim=factory)
app.prepare()

for path in app.dump()['paths'].keys():
    if not path.startswith("/api"):
        continue
    for method in app.dump()['paths'][path]:
        if method is 'parameters':
            continue
        try:
            operationId = app.dump()['paths'][path][method]['operationId']
        except KeyError:
            print("path missing operationId: %s" % path)
            continue
        if operationId.startswith(('proxy', 'connect')):
            continue
예제 #39
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)
예제 #40
0
 def setUp(self):
     self.app = App.load(get_test_data_folder(version='1.2', which='err'))
예제 #41
0
    @Disp.register([Authorization])
    def _authorization(self, path, obj, _):
        self.authorization.append(path) 

    @Disp.register([ResponseMessage])
    def _response_message(self, path, obj, _):
        if path.startswith('#/apis/store'):
            self.response_message.append(path)

    @Disp.register([Parameter])
    def _parameter(self, path, obj, _):
        if path.startswith('#/apis/pet/apis/updatePetWithForm'):
            self.parameter.append(path)


app = App.load(get_test_data_folder(version='1.2', which='wordnik')) 


class ScannerTestCase(unittest.TestCase):
    """ test scanner """
    def test_count(self):
        s = Scanner(app)
        co = CountObject()
        s.scan(route=[co], root=app.raw)

        self.assertEqual(co.long_name, 'createUsersWithArrayInput')
        self.assertEqual(co.total, {
            Authorization: 1,
            Resource: 3,
            Operation: 20,
            ResponseMessage: 23
예제 #42
0
    def test_dict_getter_v1_2(self):
        """ make sure 'DictGetter' works the same as 'LocalGetter'
        for Swagger 1.2
        """

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

        path_resource_list = os.path.join(path, 'resource_list.json')
        path_pet = os.path.join(path, 'pet.json')
        path_store = os.path.join(path, 'store.json')
        path_user = os.path.join(path, 'user.json')
        with open(path_resource_list, 'r') as f:
            resource_list = json.loads(f.read())
        with open(path_pet, 'r') as f:
            pet = json.loads(f.read())
        with open(path_store, 'r') as f:
            store = json.loads(f.read())
        with open(path_user, 'r') as f:
            user = json.loads(f.read())

        getter = DictGetter(
            [
                path_resource_list,
                path_pet,
                path_user,
                path_store,
            ], {
                path_resource_list: resource_list,
                path_pet: pet,
                path_store: store,
                path_user: user,
            })
        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(),
                                       App.create(path).dump())), [])

        #
        # different path, mocking an url
        #
        getter = DictGetter(
            [
                'http://petstore.com',
                'http://petstore.com/pet.json',
                'http://petstore.com/user.json',
                'http://petstore.com/store.json',
            ], {
                'http://petstore.com': resource_list,
                'http://petstore.com/pet.json': pet,
                'http://petstore.com/store.json': store,
                'http://petstore.com/user.json': user
            })
        app = App.load('http://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(), App.create(path).dump(), exclude=['$ref'])),
            [])

        #
        # provide empty path
        #
        getter = DictGetter(
            [
                '',
                'pet.json',
                'user.json',
                'store.json',
            ], {
                '': resource_list,
                'pet.json': pet,
                'store.json': store,
                'user.json': user
            })
        app = App.load('http://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(), App.create(path).dump(), exclude=['$ref'])),
            [])