def test_past_disruption_2_periods(): ''' application_period 2014-02-10 2014-03-10 application_period 2014-03-12 2014-03-15 current date 2014-03-16 disruption.status past ''' disruption = models.Disruption() disruption.start_publication_date = datetime(2014, 2, 10, 13, 5, 10) disruption.end_publication_date = datetime(2014, 3, 16, 13, 5, 10) impact = models.Impact() application_period = models.ApplicationPeriods() application_period.start_date = datetime(2014, 2, 10, 13, 5, 10) application_period.end_date = datetime(2014, 3, 10, 13, 5, 10) impact.application_periods.append(application_period) application_period = models.ApplicationPeriods() application_period.start_date = datetime(2014, 3, 12, 13, 5, 10) application_period.end_date = datetime(2014, 3, 15, 13, 5, 10) impact.application_periods.append(application_period) disruption.impacts.append(impact) impact.disruption = disruption with app.app_context(): g.current_time = datetime(2014, 3, 16, 13, 5, 10) class_time = fields.ComputeDisruptionStatus(Obj()) eq_(class_time.output(None, impact), 'past')
def test_field_cause(): obj = Obj() obj.disruption = models.Disruption() cause = models.Cause() obj.disruption.cause = cause class_field_cause = fields.FieldCause(Obj()) eq_(class_field_cause.output(None, obj), cause.wording)
def test_disruption_with_draft_status_isnnot_send(): ''' Tests that a disruption with status draft is not sent to navitia :return: ''' disruption = models.Disruption() disruption.status = 'draft' has_been_sent = send_disruption_to_navitia(disruption) eq_(has_been_sent, False)
def test_field_cause_none(): obj = Obj() obj.disruption = models.Disruption() cause = models.Cause() wording = models.Wording() wording.key = 'external_long' wording.value = 'external medium' cause.wordings.append(wording) obj.disruption.cause = cause class_field_cause = fields.FieldCause(Obj()) eq_(class_field_cause.output(None, obj), None)
def test_disruption_with_archived_status_is_sent(): ''' Tests that a disruption with status archived is sent to navitia :return: ''' disruption = models.Disruption() disruption.contributor = models.Contributor() disruption.contributor_id = disruption.contributor.id disruption.status = 'archived' has_been_sent = send_disruption_to_navitia(disruption) eq_(has_been_sent, None)
def test_disruption_with_rabbitmq_exception(): ''' Tests when a disruption fail to publish to rabbitmq :return: ''' disruption = models.Disruption() #contributor disruption.contributor = models.Contributor() disruption.contributor_id = disruption.contributor.id #cause disruption.cause = models.Cause() disruption.cause.wording = "CauseTest" disruption.cause.category = models.Category() disruption.cause.category.name = "CategoryTest" disruption.reference = "DisruptionTest" #localization localization = models.PTobject() localization.uri = "stop_area:123" localization.type = "stop_area" disruption.localizations.append(localization) # Wording wording = models.Wording() wording.key = "key_1" wording.value = "value_1" disruption.cause.wordings.append(wording) wording = models.Wording() wording.key = "key_2" wording.value = "value_2" disruption.cause.wordings.append(wording) # Tag tag = models.Tag() tag.name = "rer" disruption.tags.append(tag) disruption.status = 'published' chaos.publisher.publish = MagicMock(return_value=False) to_rabbitmq_not_sent = send_disruption_to_navitia(disruption) eq_(to_rabbitmq_not_sent, False)
def test_disruption_with_published_status_is_sent(): ''' Tests that a disruption with status published is sent to navitia :return: ''' disruption = models.Disruption() #contributor disruption.contributor = models.Contributor() disruption.contributor_id = disruption.contributor.id #cause disruption.cause = models.Cause() disruption.cause.wording = "CauseTest" disruption.cause.category = models.Category() disruption.cause.category.name = "CategoryTest" disruption.reference = "DisruptionTest" #localization localization = models.PTobject() localization.uri = "stop_area:123" localization.type = "stop_area" disruption.localizations.append(localization) # Wording wording = models.Wording() wording.key = "key_1" wording.value = "value_1" disruption.cause.wordings.append(wording) wording = models.Wording() wording.key = "key_2" wording.value = "value_2" disruption.cause.wordings.append(wording) # Tag tag = models.Tag() tag.name = "rer" disruption.tags.append(tag) disruption.status = 'published' has_been_sent = send_disruption_to_navitia(disruption) eq_(has_been_sent, None)
def create_disruption_from_json(json): disruption = models.Disruption() disruption.id = json['id'] disruption.reference = json['reference'] disruption.note = json['note'] disruption.status = json['status'] disruption.version = json['version'] disruption.created_at = get_datetime_from_json_attr(json, 'created_at') disruption.updated_at = get_datetime_from_json_attr(json, 'updated_at') disruption.start_publication_date = get_datetime_from_json_attr( json['publication_period'], 'begin') disruption.end_publication_date = get_datetime_from_json_attr( json['publication_period'], 'end') disruption.publicationStatus = json['publication_status'] disruption.history_localization = json['localization'] disruption.contributor = create_contributor_from_json(json['contributor']) disruption.cause = create_cause_from_json(json['cause']) disruption.tags = create_tags_from_json(json['tags']) disruption.properties = create_properties_from_json( json['properties'], json['id']) disruption.impacts = create_impacts_from_json(json['impacts'], json['id']) disruption.author = get_author_from_json(json) return disruption
class Disruptions(flask_restful.Resource): def __init__(self): self.navitia = None self.parsers = {} self.parsers["get"] = reqparse.RequestParser() parser_get = self.parsers["get"] parser_get.add_argument("start_page", type=int, default=1) parser_get.add_argument("items_per_page", type=int, default=20) parser_get.add_argument("publication_status[]", type=option_value(publication_status_values), action="append", default=publication_status_values) parser_get.add_argument("tag[]", type=utils.get_uuid, action="append") parser_get.add_argument("current_time", type=utils.get_datetime) parser_get.add_argument("uri", type=str) parser_get.add_argument("status[]", type=option_value(disruption_status_values), action="append", default=disruption_status_values) @validate_navitia() @validate_contributor() @manage_navitia_error() @validate_id() def get(self, contributor, navitia, id=None): self.navitia = navitia if id: return marshal( {'disruption': models.Disruption.get(id, contributor.id)}, one_disruption_fields) else: args = self.parsers['get'].parse_args() page_index = args['start_page'] if page_index == 0: abort(400, message="page_index argument value is not valid") items_per_page = args['items_per_page'] if items_per_page == 0: abort(400, message="items_per_page argument value is not valid") publication_status = args['publication_status[]'] tags = args['tag[]'] uri = args['uri'] statuses = args['status[]'] g.current_time = args['current_time'] result = models.Disruption.all_with_filter( page_index=page_index, items_per_page=items_per_page, contributor_id=contributor.id, publication_status=publication_status, tags=tags, uri=uri, statuses=statuses) response = { 'disruptions': result.items, 'meta': make_pager(result, 'disruption') } return marshal(response, disruptions_fields) @validate_navitia() @validate_client(True) @manage_navitia_error() def post(self, client, navitia): self.navitia = navitia json = request.get_json(silent=True) logging.getLogger(__name__).debug('POST disruption: %s', json) try: validate(json, disruptions_input_format) except ValidationError, e: logging.debug(str(e)) # TODO: generate good error messages return marshal({'error': { 'message': utils.parse_error(e) }}, error_fields), 400 disruption = models.Disruption() mapper.fill_from_json(disruption, json, mapper.disruption_mapping) # Use contributor_code present in the json to get contributor_id if 'contributor' in json: disruption.contributor = models.Contributor.get_or_create( json['contributor']) disruption.client = client # Add localization present in Json try: db_helper.manage_pt_object_without_line_section( self.navitia, disruption.localizations, 'localization', json) except exceptions.ObjectUnknown, e: return marshal({'error': { 'message': '{}'.format(e.message) }}, error_fields), 404
class Disruptions(flask_restful.Resource): def __init__(self): self.navitia = None self.parsers = {} self.parsers["get"] = reqparse.RequestParser() parser_get = self.parsers["get"] parser_get.add_argument("start_page", type=int, default=1) parser_get.add_argument("items_per_page", type=int, default=20) parser_get.add_argument("publication_status[]", type=option_value(publication_status_values), action="append", default=publication_status_values) parser_get.add_argument("ends_after_date", type=utils.get_datetime), parser_get.add_argument("ends_before_date", type=utils.get_datetime), parser_get.add_argument("tag[]", type=utils.get_uuid, action="append") parser_get.add_argument("current_time", type=utils.get_datetime) parser_get.add_argument("uri", type=str) parser_get.add_argument("line_section", type=types.boolean, default=False) parser_get.add_argument("status[]", type=option_value(disruption_status_values), action="append", default=disruption_status_values) parser_get.add_argument("depth", type=int, default=1) @validate_navitia() @validate_contributor() @manage_navitia_error() @validate_id() def get(self, contributor, navitia, id=None): self.navitia = navitia args = self.parsers['get'].parse_args() depth = args['depth'] g.display_impacts = depth > 1 if id: return self._get_disruption_by_id(id, contributor.id) else: return self._get_disruptions(contributor.id, args) def _get_disruption_by_id(self, id, contributor_id): return marshal( {'disruption': models.Disruption.get(id, contributor_id)}, one_disruption_fields) def _get_disruptions(self, contributor_id, args): self._validate_arguments_for_disruption_list(args) g.current_time = args['current_time'] page_index = args['start_page'] items_per_page = args['items_per_page'] publication_status = args['publication_status[]'] ends_after_date = args['ends_after_date'] ends_before_date = args['ends_before_date'] tags = args['tag[]'] uri = args['uri'] line_section = args['line_section'] statuses = args['status[]'] result = models.Disruption.all_with_filter( page_index=page_index, items_per_page=items_per_page, contributor_id=contributor_id, publication_status=publication_status, ends_after_date=ends_after_date, ends_before_date=ends_before_date, tags=tags, uri=uri, line_section=line_section, statuses=statuses) response = { 'disruptions': result.items, 'meta': make_pager(result, 'disruption') } ''' The purpose is to remove any database-loaded state from all current objects so that the next access of any attribute, or any query execution, will retrieve new state, freshening those objects which are still referenced outside of the session with the most recent available state. ''' for o in result.items: models.db.session.expunge(o) return marshal(response, disruptions_fields) def _validate_arguments_for_disruption_list(self, args): if args['start_page'] == 0: abort(400, message="page_index argument value is not valid") if args['items_per_page'] == 0: abort(400, message="items_per_page argument value is not valid") def get_post_error_response_and_log(self, exception, status_code): return self.get_error_response_and_log('POST', exception, status_code) def get_put_error_response_and_log(self, exception, status_code): return self.get_error_response_and_log('PUT', exception, status_code) def get_error_response_and_log(self, method, exception, status_code): response_content = marshal( {'error': { 'message': '{}'.format(exception.message) }}, error_fields) logging.getLogger(__name__).debug( "\nError REQUEST %s disruption: [X-Customer-Id:%s;X-Coverage:%s;X-Contributors:%s;Authorization:%s] with payload \n%s" + "\ngot RESPONSE with status %d:\n%s", method, request.headers.get('X-Customer-Id'), request.headers.get('X-Coverage'), request.headers.get('X-Contributors'), request.headers.get('Authorization'), json.dumps(request.get_json(silent=True)), status_code, json.dumps(response_content)) return response_content @validate_navitia() @validate_client(True) @manage_navitia_error() def post(self, client, navitia): self.navitia = navitia json = request.get_json(silent=True) try: validate(json, disruptions_input_format) except ValidationError, e: response = self.get_post_error_response_and_log(e, 400) return response, 400 disruption = models.Disruption() mapper.fill_from_json(disruption, json, mapper.disruption_mapping) # Use contributor_code present in the json to get contributor_id if 'contributor' in json: disruption.contributor = models.Contributor.get_or_create( json['contributor']) disruption.client = client # Add localization present in Json try: db_helper.manage_pt_object_without_line_section( self.navitia, disruption.localizations, 'localization', json) except exceptions.ObjectUnknown, e: response = self.get_post_error_response_and_log(e, 404) return response, 404
def test_name_disruption(): disruption = models.Disruption() eq_(str(disruption), "<Disruption '{}'>".format(disruption.id))