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))
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'])), [])
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))
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')] ]))
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)
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
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]
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 _create_app(self, url, headers): app = App.load( url, getter=self._create_getter(headers=headers), ) app.prepare(strict=False) return app
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()
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()
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'])), [])
def setUpClass(kls): kls.app = App.load(get_test_data_folder( version='2.0', which='bitbucket' )) # bypass cyclic testing kls.app.prepare(strict=False)
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()
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))
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))
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()
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
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()
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()
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)
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') ]))
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')]))
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()
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)
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)
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']), [])
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_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'] ), [])
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)
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')
@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
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'])), [])
def setUp(self): self.app = App.load(get_test_data_folder(version='1.2', which='err'))
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()
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()
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
def setUpClass(kls): kls.app = App.load( get_test_data_folder(version='2.0', which='bitbucket')) # bypass cyclic testing kls.app.prepare(strict=False)
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'])), [])