def test_validate_request_data_incorrect_start_date(self): request = RequestFactory().post( path="/datacube_accuracy_api/", data=format_request_body( provider="blah-blah", start_time="invalid", # invalid start format end_time="2016-01-02T00:00", action=utils.ACTION_CHECK, environment=utils.ENVIRONMENT_NEXT_STAGING, cube=utils.CUBE_DAILY, url_dimension=utils.URL_DIMENSION_YES)) # overriding data attribute as mismatch between WSGIRequest and Django request in APIViews request.data = request.POST """ # self.assertRaises(ValueError, utils.validate_request_data(request)) try: utils.validate_request_data(request) self.assertFalse(True) except ValueError: self.assertTrue(True) """ with self.assertRaisesMessage( ValueError, "Incorrect start_time format in request body. Please provide \'%Y-%m-%dT%H:%M\'" ): utils.validate_request_data(request)
def register(): """ Endpoint for registering a new repositor. Registers new information and updates existing repo information. """ resp_dict = { "data": [], "success": True, "summary": "{} successfully registered" } input_json = request.get_json() validated_data = validate_request_data(input_json) if not validated_data[0]: resp_dict["success"] = False resp_dict["summary"] = validated_data[1] return flask.jsonify(resp_dict), 404 try: status = DatabaseIngestion.store_record(input_json) resp_dict["data"] = status except Exception as e: resp_dict["success"] = False resp_dict["summary"] = "Database Ingestion Failure due to" + e return flask.jsonify(resp_dict), 500 status = scan_repo(input_json) if status is not True: resp_dict["success"] = False resp_dict["summary"] = "New Repo Scan Initializtion Failure" return flask.jsonify(resp_dict), 500 rep_summary = resp_dict["summary"].format(input_json['git_url']) resp_dict["summary"] = rep_summary return flask.jsonify(resp_dict), 200
def post(self, request, format=None): try: utils.validate_request_data(request) except ValueError as e: response_data = dict() # standard format to be followed for custom exceptions response_data[ 'message'] = "Exception : " + e.__class__.__name__ + " :- " + e.__str__( ) utils.LOGGER.error("Validation during validation: " + response_data['message']) return Response(response_data, status=status.HTTP_400_BAD_REQUEST) finally: pass # process the request as per action value passed in body return utils.process_request(request)
def test_validate_request_data(self): request = RequestFactory().post( path="/datacube_accuracy_api/", data=format_request_body( provider="blah-blah", start_time="2016-01-01T00:00", end_time="2016-01-02T00:00", action=utils.ACTION_CHECK, environment=utils.ENVIRONMENT_NEXT_STAGING, cube=utils.CUBE_DAILY, url_dimension=utils.URL_DIMENSION_YES)) # overriding data attribute as mismatch between WSGIRequest and Django request in APIViews request.data = request.POST try: utils.validate_request_data(request) except ValueError: self.assertTrue(False)
def test_validate_request_data_incorrect_cube(self): request = RequestFactory().post( path="/datacube_accuracy_api/", data=format_request_body( provider="blah-blah", start_time="2016-01-01T00:00", end_time="2016-01-02T00:00", action=utils.ACTION_CHECK, environment=utils.ENVIRONMENT_NEXT_STAGING, cube="some incorrect value", url_dimension=utils.URL_DIMENSION_YES)) # overriding data attribute as mismatch between WSGIRequest and Django request in APIViews request.data = request.POST with self.assertRaisesMessage(ValueError, "Incorrect 'cube' : " + "some incorrect value" + " value. Should be either " \ + utils.CUBE_MIN_15 + "/" + utils.CUBE_DAILY + "/" + utils.CUBE_WEEKLY): utils.validate_request_data(request)
def test_validate_request_data_incorrect_date_range(self): request = RequestFactory().post( path="/datacube_accuracy_api/", data=format_request_body( provider="blah-blah", start_time="2016-01-02T00:00", end_time="2016-01-01T00:00", action=utils.ACTION_CHECK, environment=utils.ENVIRONMENT_NEXT_STAGING, cube=utils.CUBE_DAILY, url_dimension=utils.URL_DIMENSION_YES)) # overriding data attribute as mismatch between WSGIRequest and Django request in APIViews request.data = request.POST with self.assertRaisesMessage( ValueError, "start_time:2016-01-02T00:00 is greater than end_time:2016-01-01T00:00" " in request body"): utils.validate_request_data(request)
def register(): """ Endpoint for registering a new repository. Registers new information and updates existing repo information. """ resp_dict = {"success": True, "summary": ""} input_json = request.get_json() if request.content_type != 'application/json': resp_dict["success"] = False resp_dict["summary"] = "Set content type to application/json" return flask.jsonify(resp_dict), 400 validated_data = validate_request_data(input_json) if not validated_data[0]: resp_dict["success"] = False resp_dict["summary"] = validated_data[1] return flask.jsonify(resp_dict), 404 try: repo_info = DatabaseIngestion.get_info(input_json.get('git-url')) if repo_info.get('is_valid'): data = repo_info.get('data') # Update the record to reflect new git_sha if any. DatabaseIngestion.update_data(input_json) else: try: # First time ingestion DatabaseIngestion.store_record(input_json) status = scan_repo(input_json) if status is not True: resp_dict["success"] = False resp_dict[ "summary"] = "New Repo Scan Initialization Failure" return flask.jsonify(resp_dict), 500 resp_dict["summary"] = "Repository {} with commit-hash {} " \ "has been successfully registered. " \ "Please check back for report after some time." \ .format(input_json.get('git-url'), input_json.get('git-sha')) return flask.jsonify(resp_dict), 200 except Exception as e: resp_dict["success"] = False resp_dict["summary"] = "Database Ingestion Failure due to: {}" \ .format(e) return flask.jsonify(resp_dict), 500 except Exception as e: resp_dict["success"] = False resp_dict["summary"] = "Cannot get information about repository {} " \ "due to {}" \ .format(input_json.get('git-url'), e) return flask.jsonify(resp_dict), 500 # Scan the repository irrespective of report is available or not. status = scan_repo(input_json) if status is not True: resp_dict["success"] = False resp_dict["summary"] = "New Repo Scan Initialization Failure" return flask.jsonify(resp_dict), 500 resp_dict.update({ "summary": "Repository {} was already registered, but no report for " "commit-hash {} was found. Please check back later.".format( input_json.get('git-url'), input_json.get('git-sha')), "last_scanned_at": data['last_scanned_at'], "last_scan_report": None }) return flask.jsonify(resp_dict), 200