def test_location_error_handling(): with pytest.raises(InvalidParameterException): location_error_handling({}) with pytest.raises(InvalidParameterException): location_error_handling({"country": "", "county": ""}) with pytest.raises(InvalidParameterException): location_error_handling({"country": "", "district": ""}) assert location_error_handling({ "country": "", "state": "", "county": "" }) is None assert location_error_handling({ "country": "", "state": "", "district": "" }) is None assert location_error_handling({ "country": "", "state": "", "county": "", "district": "" }) is None assert location_error_handling({ "country": "", "state": "", "county": "", "district": "", "feet": "" }) is None
def _validate_and_update_locations(filters, json_request): if 'filters' not in json_request: json_request['filters'] = {} for location_filter in [ 'place_of_performance_locations', 'recipient_locations' ]: if filters.get(location_filter): for location_dict in filters[location_filter]: if not isinstance(location_dict, dict): raise InvalidParameterException( 'Location is not a dictionary: {}'.format( location_dict)) location_error_handling(location_dict.keys()) json_request['filters'][location_filter] = filters[location_filter]
def test_create_nested_object(): with pytest.raises(InvalidParameterException): location_error_handling([]) with pytest.raises(InvalidParameterException): location_error_handling([{"country": "", "state": ""}]) with pytest.raises(InvalidParameterException): location_error_handling([{"country": "", "state": "", "feet": ""}]) assert create_nested_object([ { "country": "USA", "zip": "12345", "city": "Chicago", "state": "IL", "county": "Yes", "district": "Also Yes", }, { "country": "USA", "zip": "12345", "city": "Chicago" }, ]) == { "USA": { "city": ["CHICAGO"], "zip": ["12345", "12345"], "IL": { "county": ["YES"], "district": ["ALSO YES"], "city": ["CHICAGO"] }, } }
def validate_award_request(self, request_data): """Analyze request and raise any formatting errors as Exceptions""" json_request = {} constraint_type = request_data.get('constraint_type', None) # Validate required parameters for required_param in ['award_levels', 'filters']: if required_param not in request_data: raise InvalidParameterException( 'Missing one or more required query parameters: {}'.format(required_param) ) if not isinstance(request_data['award_levels'], list): raise InvalidParameterException('Award levels parameter not provided as a list') elif len(request_data['award_levels']) == 0: raise InvalidParameterException('At least one award level is required.') for award_level in request_data['award_levels']: if award_level not in VALUE_MAPPINGS: raise InvalidParameterException('Invalid award_level: {}'.format(award_level)) json_request['download_types'] = request_data['award_levels'] # Overriding all other filters if the keyword filter is provided in year-constraint download # Make sure this is after checking the award_levels if constraint_type == 'year' and 'elasticsearch_keyword' in request_data['filters']: json_request['filters'] = { 'elasticsearch_keyword': request_data['filters']['elasticsearch_keyword'], 'award_type_codes': list(award_type_mapping.keys()), } json_request['limit'] = settings.MAX_DOWNLOAD_LIMIT return json_request if not isinstance(request_data['filters'], dict): raise InvalidParameterException('Filters parameter not provided as a dict') elif len(request_data['filters']) == 0: raise InvalidParameterException('At least one filter is required.') json_request['filters'] = {} # Set defaults of non-required parameters json_request['columns'] = request_data.get('columns', []) json_request['file_format'] = request_data.get('file_format', 'csv') # Validate shared filter types and assign defaults filters = request_data['filters'] check_types_and_assign_defaults(filters, json_request['filters'], SHARED_AWARD_FILTER_DEFAULTS) # Validate award type types if not filters.get('award_type_codes', None) or len(filters['award_type_codes']) < 1: filters['award_type_codes'] = list(award_type_mapping.keys()) for award_type_code in filters['award_type_codes']: if award_type_code not in award_type_mapping: raise InvalidParameterException('Invalid award_type: {}'.format(award_type_code)) json_request['filters']['award_type_codes'] = filters['award_type_codes'] # Validate locations for location_filter in ['place_of_performance_locations', 'recipient_locations']: if filters.get(location_filter): for location_dict in filters[location_filter]: if not isinstance(location_dict, dict): raise InvalidParameterException('Location is not a dictionary: {}'.format(location_dict)) location_error_handling(location_dict.keys()) json_request['filters'][location_filter] = filters[location_filter] # Validate time periods total_range_count = validate_time_periods(filters, json_request) if constraint_type == 'row_count': # Validate limit exists and is below MAX_DOWNLOAD_LIMIT json_request['limit'] = parse_limit(request_data) # Validate row_count-constrainted filter types and assign defaults check_types_and_assign_defaults(filters, json_request['filters'], ROW_CONSTRAINT_FILTER_DEFAULTS) elif constraint_type == 'year': # Validate combined total dates within one year (allow for leap years) if total_range_count > 366: raise InvalidParameterException('Invalid Parameter: time_period total days must be within a year') # Validate year-constrainted filter types and assign defaults check_types_and_assign_defaults(filters, json_request['filters'], YEAR_CONSTRAINT_FILTER_DEFAULTS) else: raise InvalidParameterException('Invalid parameter: constraint_type must be "row_count" or "year"') return json_request
def validate_award_request(self, request_data): """Analyze request and raise any formatting errors as Exceptions""" json_request = {} constraint_type = request_data.get('constraint_type', None) # Validate required parameters for required_param in ['award_levels', 'filters']: if required_param not in request_data: raise InvalidParameterException( 'Missing one or more required query parameters: {}'.format( required_param)) if not isinstance(request_data['award_levels'], list): raise InvalidParameterException( 'Award levels parameter not provided as a list') elif len(request_data['award_levels']) == 0: raise InvalidParameterException( 'At least one award level is required.') for award_level in request_data['award_levels']: if award_level not in VALUE_MAPPINGS: raise InvalidParameterException( 'Invalid award_level: {}'.format(award_level)) json_request['download_types'] = request_data['award_levels'] # Overriding all other filters if the keyword filter is provided in year-constraint download # Make sure this is after checking the award_levels if constraint_type == 'year' and 'elasticsearch_keyword' in request_data[ 'filters']: json_request['filters'] = { 'elasticsearch_keyword': request_data['filters']['elasticsearch_keyword'], 'award_type_codes': list(award_type_mapping.keys()) } json_request['limit'] = settings.MAX_DOWNLOAD_LIMIT return json_request if not isinstance(request_data['filters'], dict): raise InvalidParameterException( 'Filters parameter not provided as a dict') elif len(request_data['filters']) == 0: raise InvalidParameterException('At least one filter is required.') json_request['filters'] = {} # Set defaults of non-required parameters json_request['columns'] = request_data.get('columns', []) json_request['file_format'] = request_data.get('file_format', 'csv') # Validate shared filter types and assign defaults filters = request_data['filters'] check_types_and_assign_defaults(filters, json_request['filters'], SHARED_AWARD_FILTER_DEFAULTS) # Validate award type types if not filters.get('award_type_codes', None) or len(filters['award_type_codes']) < 1: filters['award_type_codes'] = list(award_type_mapping.keys()) for award_type_code in filters['award_type_codes']: if award_type_code not in award_type_mapping: raise InvalidParameterException( 'Invalid award_type: {}'.format(award_type_code)) json_request['filters']['award_type_codes'] = filters[ 'award_type_codes'] # Validate locations for location_filter in [ 'place_of_performance_locations', 'recipient_locations' ]: if filters.get(location_filter): for location_dict in filters[location_filter]: if not isinstance(location_dict, dict): raise InvalidParameterException( 'Location is not a dictionary: {}'.format( location_dict)) location_error_handling(location_dict.keys()) json_request['filters'][location_filter] = filters[ location_filter] # Validate time periods total_range_count = validate_time_periods(filters, json_request) if constraint_type == 'row_count': # Validate limit exists and is below MAX_DOWNLOAD_LIMIT json_request['limit'] = parse_limit(request_data) # Validate row_count-constrainted filter types and assign defaults check_types_and_assign_defaults(filters, json_request['filters'], ROW_CONSTRAINT_FILTER_DEFAULTS) elif constraint_type == 'year': # Validate combined total dates within one year (allow for leap years) if total_range_count > 366: raise InvalidParameterException( 'Invalid Parameter: time_period total days must be within a year' ) # Validate year-constrainted filter types and assign defaults check_types_and_assign_defaults(filters, json_request['filters'], YEAR_CONSTRAINT_FILTER_DEFAULTS) else: raise InvalidParameterException( 'Invalid parameter: constraint_type must be "row_count" or "year"' ) return json_request