def test_invalid_nested_required_fields(self): invalid_data = {'f_integer': 2} valid, rez = FdmSwaggerValidator(nested_mock_data1).validate_data( 'getdata', invalid_data) assert not valid assert {'required': ['nested_model']} == rez invalid_data = {'nested_model': {'f_number': 1.2}} valid, rez = FdmSwaggerValidator(nested_mock_data1).validate_data( 'getdata', invalid_data) assert not valid assert {'required': ['nested_model.f_string']} == rez
def test_nested_required_fields(self): valid_data = {'nested_model': {'f_string': "test"}} valid, rez = FdmSwaggerValidator(nested_mock_data1).validate_data( 'getdata', valid_data) assert valid assert rez is None
def test_invalid_type_in_nested_fields(self): invalid_data = { 'nested_model': { "f_string": 1, "f_number": "ds", "f_boolean": 1.3, "f_integer": True } } valid, rez = FdmSwaggerValidator(nested_mock_data1).validate_data( 'getdata', invalid_data) assert not valid assert sort_validator_rez({ 'invalid_type': [{ 'path': 'nested_model.f_string', 'expected_type': 'string', 'actually_value': 1 }, { 'path': 'nested_model.f_number', 'expected_type': 'number', 'actually_value': "ds" }, { 'path': 'nested_model.f_boolean', 'expected_type': 'boolean', 'actually_value': 1.3 }, { 'path': 'nested_model.f_integer', 'expected_type': 'integer', 'actually_value': True }] }) == sort_validator_rez(rez)
def test_errors_if_no_data_was_passed(self): data = {} valid, rez = FdmSwaggerValidator(mock_data).validate_data( 'getNetworkObjectList', data) assert not valid assert sort_validator_rez({'required': ['subType', 'type', 'value']}) == sort_validator_rez(rez)
def test_errors_for_required_fields(self): data = {'name': 'test'} valid, rez = FdmSwaggerValidator(mock_data).validate_data( 'getNetworkObjectList', data) assert not valid assert sort_validator_rez({'required': ['subType', 'type', 'value']}) == sort_validator_rez(rez)
def validate_url_data_with_empty_data(self, method, parameters_type): local_mock_spec = { 'models': {}, 'operations': { 'getNetwork': { 'method': 'get', 'parameters': { parameters_type: { 'objId': { 'required': True, 'type': "string" } } } } } } validator = FdmSwaggerValidator(local_mock_spec) valid, rez = getattr(validator, method)('getNetwork', None) assert not valid assert {'required': ['objId']} == rez self.check_illegal_argument_exception( lambda: getattr(validator, method)('getNetwork', ''), "The params parameter must be a dict") self.check_illegal_argument_exception( lambda: getattr(validator, method)('getNetwork', []), "The params parameter must be a dict") valid, rez = getattr(validator, method)('getNetwork', {}) assert not valid assert {'required': ['objId']} == rez self.check_illegal_argument_exception( lambda: getattr(validator, method)(None, { 'name': 'test' }), "The operation_name parameter must be a non-empty string") self.check_illegal_argument_exception( lambda: getattr(validator, method)('', { 'name': 'test' }), "The operation_name parameter must be a non-empty string") self.check_illegal_argument_exception( lambda: getattr(validator, method)([], { 'name': 'test' }), "The operation_name parameter must be a non-empty string") self.check_illegal_argument_exception( lambda: getattr(validator, method)({}, { 'name': 'test' }), "The operation_name parameter must be a non-empty string") self.check_illegal_argument_exception( lambda: getattr(validator, method)('operation_does_not_exist', { 'name': 'test' }), "operation_does_not_exist operation does not support")
def test_pass_no_data_with_no_required_fields(self): spec = copy.deepcopy(mock_data) del spec['models']['NetworkObject']['required'] valid, rez = FdmSwaggerValidator(spec).validate_data( 'getNetworkObjectList', {}) assert valid assert rez is None
def test_pass_only_required_fields(self): data = { 'subType': 'NETWORK', 'type': 'networkobject', 'value': '1.1.1.1' } valid, rez = FdmSwaggerValidator(mock_data).validate_data( 'getNetworkObjectList', data) assert valid assert rez is None
def url_data_required_fields(method, parameters_type): local_mock_spec = { 'models': {}, 'operations': { 'getNetwork': { 'method': 'get', 'parameters': { parameters_type: { 'objId': { 'required': True, 'type': "string" }, 'parentId': { 'required': True, 'type': "string" }, 'someParam': { 'required': False, 'type': "string" }, 'p_integer': { 'required': False, 'type': "integer" }, 'p_boolean': { 'required': False, 'type': "boolean" }, 'p_number': { 'required': False, 'type': "number" } } } } } } validator = FdmSwaggerValidator(local_mock_spec) valid, rez = getattr(validator, method)('getNetwork', None) assert not valid assert sort_validator_rez({'required': ['objId', 'parentId']}) == sort_validator_rez(rez) valid, rez = getattr(validator, method)('getNetwork', {}) assert not valid assert sort_validator_rez({'required': ['objId', 'parentId']}) == sort_validator_rez(rez) data = {'someParam': "test"} valid, rez = getattr(validator, method)('getNetwork', data) assert not valid assert sort_validator_rez({'required': ['objId', 'parentId']}) == sort_validator_rez(rez)
def test_types_of_required_fields_are_incorrect(self): data = {'subType': True, 'type': 1, 'value': False} valid, rez = FdmSwaggerValidator(mock_data).validate_data( 'getNetworkObjectList', data) assert not valid assert sort_validator_rez({ 'invalid_type': [{ 'path': 'subType', 'expected_type': 'enum', 'actually_value': True }, { 'path': 'value', 'expected_type': 'string', 'actually_value': False }, { 'path': 'type', 'expected_type': 'string', 'actually_value': 1 }] }) == sort_validator_rez(rez) data = {'subType': {}, 'type': [], 'value': {}} valid, rez = FdmSwaggerValidator(mock_data).validate_data( 'getNetworkObjectList', data) assert not valid assert sort_validator_rez({ 'invalid_type': [{ 'path': 'subType', 'expected_type': 'enum', 'actually_value': {} }, { 'path': 'value', 'expected_type': 'string', 'actually_value': {} }, { 'path': 'type', 'expected_type': 'string', 'actually_value': [] }] }) == sort_validator_rez(rez)
def test_array_data_is_not_correct(self): data = { 'name': 'test_name', 'subType': 'NETWORK', 'type': 'networkobject', 'value': '1.1.1.1', 'objects': [{ 'id': 'fs-sf' }, { 'type': 'type' }, {}, { 'id': 1, 'type': True }, [], 'test'] } valid, rez = FdmSwaggerValidator(mock_data).validate_data( 'getNetworkObjectList', data) assert not valid assert sort_validator_rez({ 'required': [ 'objects[0].type', 'objects[1].id', 'objects[2].id', 'objects[2].type' ], 'invalid_type': [{ 'path': 'objects[3].id', 'expected_type': 'string', 'actually_value': 1 }, { 'path': 'objects[3].type', 'expected_type': 'string', 'actually_value': True }, { 'path': 'objects[4]', 'expected_type': 'object', 'actually_value': [] }, { 'path': 'objects[5]', 'expected_type': 'object', 'actually_value': 'test' }] }) == sort_validator_rez(rez)
def test_pass_all_fields_with_correct_data(self): data = { 'id': 'id-di', 'version': 'v', 'name': 'test_name', 'subType': 'NETWORK', 'type': 'networkobject', 'value': '1.1.1.1', 'description': 'des', 'isSystemDefined': False, 'dnsResolution': 'IPV4_ONLY', 'objects': [{ 'type': 'port', 'id': 'fs-sf' }] } valid, rez = FdmSwaggerValidator(mock_data).validate_data( 'getNetworkObjectList', data) assert valid assert rez is None
def url_data_valid(method, parameters_type): local_mock_spec = { 'models': {}, 'operations': { 'getNetwork': { 'method': 'get', 'parameters': { parameters_type: { 'objId': { 'required': True, 'type': "string" }, 'p_integer': { 'required': False, 'type': "integer" }, 'p_boolean': { 'required': False, 'type': "boolean" }, 'p_number': { 'required': False, 'type': "number" } } } } } } data = { 'objId': "value1", 'p_integer': 1, 'p_boolean': True, 'p_number': 2.3 } validator = FdmSwaggerValidator(local_mock_spec) valid, rez = getattr(validator, method)('getNetwork', data) assert valid assert rez is None
def url_params_invalid_params(method, parameters_type): local_mock_spec = { 'models': {}, 'operations': { 'getNetwork': { 'method': 'get', 'parameters': { parameters_type: { 'objId': { 'required': True, 'type': "string" }, 'parentId': { 'required': True, 'type': "string" }, 'someParam': { 'required': False, 'type': "string" }, 'p_integer': { 'required': False, 'type': "integer" }, 'p_boolean': { 'required': False, 'type': "boolean" }, 'p_number': { 'required': False, 'type': "number" } } } } } } validator = FdmSwaggerValidator(local_mock_spec) data = { 'objId': 1, 'parentId': True, 'someParam': [], 'p_integer': 1.2, 'p_boolean': 0, 'p_number': False } valid, rez = getattr(validator, method)('getNetwork', data) assert not valid assert sort_validator_rez({ 'invalid_type': [{ 'path': 'objId', 'expected_type': 'string', 'actually_value': 1 }, { 'path': 'parentId', 'expected_type': 'string', 'actually_value': True }, { 'path': 'someParam', 'expected_type': 'string', 'actually_value': [] }, { 'path': 'p_integer', 'expected_type': 'integer', 'actually_value': 1.2 }, { 'path': 'p_boolean', 'expected_type': 'boolean', 'actually_value': 0 }, { 'path': 'p_number', 'expected_type': 'number', 'actually_value': False }] }) == sort_validator_rez(rez) data = { 'objId': {}, 'parentId': 0, 'someParam': 1.2, 'p_integer': True, 'p_boolean': 1, 'p_number': True } valid, rez = getattr(validator, method)('getNetwork', data) assert not valid assert sort_validator_rez({ 'invalid_type': [{ 'path': 'objId', 'expected_type': 'string', 'actually_value': {} }, { 'path': 'parentId', 'expected_type': 'string', 'actually_value': 0 }, { 'path': 'someParam', 'expected_type': 'string', 'actually_value': 1.2 }, { 'path': 'p_integer', 'expected_type': 'integer', 'actually_value': True }, { 'path': 'p_boolean', 'expected_type': 'boolean', 'actually_value': 1 }, { 'path': 'p_number', 'expected_type': 'number', 'actually_value': True }] }) == sort_validator_rez(rez) data = { 'objId': {}, 'parentId': 0, 'someParam': 1.2, 'p_integer': "1", 'p_boolean': "", 'p_number': "2.1" } valid, rez = getattr(validator, method)('getNetwork', data) assert not valid assert sort_validator_rez({ 'invalid_type': [{ 'path': 'objId', 'expected_type': 'string', 'actually_value': {} }, { 'path': 'parentId', 'expected_type': 'string', 'actually_value': 0 }, { 'path': 'someParam', 'expected_type': 'string', 'actually_value': 1.2 }, { 'path': 'p_boolean', 'expected_type': 'boolean', 'actually_value': "" }] }) == sort_validator_rez(rez) data = { 'objId': "123", 'parentId': "1", 'someParam': None, 'p_integer': None } valid, rez = getattr(validator, method)('getNetwork', data) assert not valid assert sort_validator_rez({ 'invalid_type': [{ 'path': 'someParam', 'expected_type': 'string', 'actually_value': None }, { 'path': 'p_integer', 'expected_type': 'integer', 'actually_value': None }] }) == sort_validator_rez(rez)
def test_validate_data_method_with_empty_data(self): validator = FdmSwaggerValidator(mock_data) valid, rez = validator.validate_data('getNetworkObjectList', None) assert not valid assert sort_validator_rez({'required': ['subType', 'type', 'value']}) == sort_validator_rez(rez) self.check_illegal_argument_exception( lambda: validator.validate_data('getNetworkObjectList', ''), "The data parameter must be a dict") self.check_illegal_argument_exception( lambda: validator.validate_data('getNetworkObjectList', []), "The data parameter must be a dict") valid, rez = validator.validate_data('getNetworkObjectList', {}) assert not valid assert sort_validator_rez({'required': ['subType', 'type', 'value']}) == sort_validator_rez(rez) self.check_illegal_argument_exception( lambda: validator.validate_data(None, {'name': 'test'}), "The operation_name parameter must be a non-empty string") self.check_illegal_argument_exception( lambda: validator.validate_data('', {'name': 'test'}), "The operation_name parameter must be a non-empty string") self.check_illegal_argument_exception( lambda: validator.validate_data([], {'name': 'test'}), "The operation_name parameter must be a non-empty string") self.check_illegal_argument_exception( lambda: validator.validate_data({}, {'name': 'test'}), "The operation_name parameter must be a non-empty string") self.check_illegal_argument_exception( lambda: validator.validate_data('operation_does_not_exist', {'name': 'test'}), "operation_does_not_exist operation does not support")
def test_invalid_simple_types(self): local_mock_data = { 'models': { 'TestModel': { 'type': 'object', 'properties': { 'f_string': { 'type': 'string' }, 'f_number': { 'type': 'number' }, 'f_boolean': { 'type': 'boolean' }, 'f_integer': { 'type': 'integer' } }, 'required': [] } }, 'operations': { 'getdata': { 'modelName': 'TestModel' } } } invalid_data = { "f_string": True, "f_number": True, "f_boolean": 1, "f_integer": True } valid, rez = FdmSwaggerValidator(local_mock_data).validate_data( 'getdata', invalid_data) assert not valid assert sort_validator_rez({ 'invalid_type': [{ 'path': 'f_string', 'expected_type': 'string', 'actually_value': True }, { 'path': 'f_number', 'expected_type': 'number', 'actually_value': True }, { 'path': 'f_boolean', 'expected_type': 'boolean', 'actually_value': 1 }, { 'path': 'f_integer', 'expected_type': 'integer', 'actually_value': True }] }) == sort_validator_rez(rez) invalid_data = { "f_string": 1, "f_number": False, "f_boolean": 0, "f_integer": "test" } valid, rez = FdmSwaggerValidator(local_mock_data).validate_data( 'getdata', invalid_data) assert not valid assert sort_validator_rez({ 'invalid_type': [{ 'path': 'f_string', 'expected_type': 'string', 'actually_value': 1 }, { 'path': 'f_number', 'expected_type': 'number', 'actually_value': False }, { 'path': 'f_boolean', 'expected_type': 'boolean', 'actually_value': 0 }, { 'path': 'f_integer', 'expected_type': 'integer', 'actually_value': "test" }] }) == sort_validator_rez(rez) invalid_data = { "f_string": False, "f_number": "1", "f_boolean": "", "f_integer": "1.2" } valid, rez = FdmSwaggerValidator(local_mock_data).validate_data( 'getdata', invalid_data) assert not valid assert sort_validator_rez({ 'invalid_type': [{ 'path': 'f_string', 'expected_type': 'string', 'actually_value': False }, { 'path': 'f_boolean', 'expected_type': 'boolean', 'actually_value': "" }, { 'path': 'f_integer', 'expected_type': 'integer', 'actually_value': '1.2' }] }) == sort_validator_rez(rez)
def test_simple_types(self): local_mock_data = { 'models': { 'TestModel': { 'type': 'object', 'properties': { 'f_string': { 'type': 'string' }, 'f_number': { 'type': 'number' }, 'f_boolean': { 'type': 'boolean' }, 'f_integer': { 'type': 'integer' } }, 'required': [] } }, 'operations': { 'getdata': { 'modelName': 'TestModel' } } } valid_data = { "f_string": "test", "f_number": 2.2, "f_boolean": False, "f_integer": 1 } valid, rez = FdmSwaggerValidator(local_mock_data).validate_data( 'getdata', valid_data) assert valid assert rez is None valid_data = { "f_string": "", "f_number": 0, "f_boolean": True, "f_integer": 0 } valid, rez = FdmSwaggerValidator(local_mock_data).validate_data( 'getdata', valid_data) assert valid assert rez is None valid_data = { "f_string": "0", "f_number": 100, "f_boolean": True, "f_integer": 2 } valid, rez = FdmSwaggerValidator(local_mock_data).validate_data( 'getdata', valid_data) assert valid assert rez is None valid_data = { "f_string": None, "f_number": None, "f_boolean": None, "f_integer": None } valid, rez = FdmSwaggerValidator(local_mock_data).validate_data( 'getdata', valid_data) assert valid assert rez is None
def test_errors_if_one_required_field_is_empty(self): data = {'subType': 'NETWORK', 'value': '1.1.1.1'} valid, rez = FdmSwaggerValidator(mock_data).validate_data( 'getNetworkObjectList', data) assert not valid assert {'required': ['type']} == rez
def test_few_levels_nested_fields(self): local_mock_data = { 'models': { 'Model2': { 'type': 'object', 'required': ['ms', 'ts'], 'properties': { 'ms': { 'type': 'array', 'items': { 'type': 'object', '$ref': '#/definitions/ReferenceModel' } }, 'ts': { 'type': 'array', 'items': { 'type': 'object', '$ref': '#/definitions/ReferenceModel' } } } }, 'NetworkObjectType': { 'type': 'string', 'enum': ['HOST', 'NETWORK', 'IPRANGE', 'FQDN'] }, 'Fragment': { 'type': 'object', 'required': ['type', 'objects', 'subType', 'object'], 'properties': { 'objects': { 'type': 'array', 'items': { 'type': 'object', '$ref': '#/definitions/ReferenceModel' } }, 'object': { 'type': 'object', '$ref': '#/definitions/Model2' }, 'subType': { 'type': 'object', '$ref': '#/definitions/NetworkObjectType' }, 'type': { 'type': 'string' }, 'value': { 'type': 'number' }, 'name': { 'type': 'string' } } }, 'ReferenceModel': { 'type': 'object', 'required': ['id', 'type'], 'properties': { 'id': { 'type': 'string' }, 'type': { 'type': 'string' }, 'version': { 'type': 'string' }, 'name': { 'type': 'string' } } }, 'model1': { 'type': 'object', 'properties': { 'f_string': { 'type': 'string' }, 'f_number': { 'type': 'number' }, 'f_boolean': { 'type': 'boolean' }, 'f_integer': { 'type': 'integer' }, 'objects': { 'type': 'array', 'items': { 'type': 'object', '$ref': '#/definitions/ReferenceModel' } }, 'fragments': { 'type': 'array', 'items': { 'type': 'object', '$ref': '#/definitions/Fragment' } } }, 'required': ['f_string', 'objects', 'fragments'] }, 'TestModel': { 'type': 'object', 'properties': { 'nested_model': { 'type': 'object', '$ref': '#/definitions/model1' }, 'f_integer': { 'type': 'integer' } }, 'required': ['nested_model'] } }, 'operations': { 'getdata': { 'modelName': 'TestModel' } } } valid_data = { "nested_model": { 'objects': [{ 'type': 't1', 'id': 'id1' }], 'fragments': [{ 'type': "test", 'subType': 'NETWORK', 'object': { 'ts': [], 'ms': [{ 'type': "tt", 'id': 'id' }] }, 'objects': [{ 'type': 't', 'id': 'id' }] }], 'f_string': '1' } } valid, rez = FdmSwaggerValidator(local_mock_data).validate_data( 'getdata', valid_data) assert valid assert rez is None valid_data = { "nested_model": { 'objects': [{ 'type': 't1', 'id': 'id1' }], 'fragments': [{ 'type': "test", 'subType': 'NETWORK', 'object': { 'ms': {} }, 'objects': [{ 'type': 't', 'id': 'id' }] }], 'f_string': '1' } } valid, rez = FdmSwaggerValidator(local_mock_data).validate_data( 'getdata', valid_data) assert not valid assert sort_validator_rez({ 'required': ['nested_model.fragments[0].object.ts'], 'invalid_type': [{ 'path': 'nested_model.fragments[0].object.ms', 'expected_type': 'array', 'actually_value': {} }] }) == sort_validator_rez(rez) valid_data = { "nested_model": { 'objects': [{ 'type': 't1', 'id': 'id1' }], 'fragments': [{ 'type': "test", 'subType': 'NETWORK', 'object': [], 'objects': {} }], 'f_string': '1' } } valid, rez = FdmSwaggerValidator(local_mock_data).validate_data( 'getdata', valid_data) assert not valid assert sort_validator_rez({ 'invalid_type': [{ 'path': 'nested_model.fragments[0].objects', 'expected_type': 'array', 'actually_value': {} }, { 'path': 'nested_model.fragments[0].object', 'expected_type': 'object', 'actually_value': [] }] }) == sort_validator_rez(rez)
def api_validator(self): if self._api_validator is None: self._api_validator = FdmSwaggerValidator(self.api_spec) return self._api_validator
def test_pass_only_required_fields_with_none_values(self): data = {'subType': 'NETWORK', 'type': 'networkobject', 'value': None} valid, rez = FdmSwaggerValidator(mock_data).validate_data( 'getNetworkObjectList', data) assert not valid assert {'required': ['value']} == rez