def test_scheduled_logging(context, capsys, mocker: MockerFixture): @scheduled def app(event, api, cache): Logger.warning('Hello, World!') event = RawScheduledEvent( asset_id=0, interval=int(), schedule=int(), schedule_start=int(), app_connection=1, app_stream=int(), company=int(), ) mocker.patch.object(RawScheduledEvent, 'set_schedule_as_completed') with freezegun.freeze_time(datetime.datetime(2021, 1, 2, 3, 4, 5, 678910)): app( [[event.dict( by_alias=True, exclude_unset=True, )]], context, ) assert ( capsys.readouterr().out == f'2021-01-02T03:04:05.678Z {context.aws_request_id} WARNING ' f'ASSET={event.asset_id} AC={event.app_connection_id} | Hello, World!\n' )
def test_custom_log_handler(context, capsys, mocker: MockerFixture): @scheduled(handler=logging.StreamHandler()) def app(event, api, cache): Logger.info('Info message!') event = RawScheduledEvent( asset_id=0, interval=int(), schedule=int(), schedule_start=int(), app_connection=1, app_stream=int(), company=int(), ) mocker.patch.object(RawScheduledEvent, 'set_schedule_as_completed') app( [[event.dict( by_alias=True, exclude_unset=True, )]], context, ) captured = capsys.readouterr() assert captured.out.endswith('Info message!\n') assert captured.err == 'Info message!\n'
def test_log_if_unable_to_set_completed_status(context, mocker: MockerFixture, capsys): @scheduled def scheduled_app(event, api, state): pass event = [[ RawScheduledEvent( asset_id=int(), interval=int(), schedule=int(), schedule_start=int(), app_connection=int(), app_stream=int(), company=int(), ).dict( by_alias=True, exclude_unset=True, ) ]] patch = mocker.patch.object(RawScheduledEvent, 'set_schedule_as_completed', side_effect=Exception) scheduled_app(event, context) captured = capsys.readouterr() assert 'ASSET=0 AC=0' in captured.out assert 'Could not set schedule as completed.' in captured.out patch.assert_called_once()
def test_set_completed_status_should_not_fail_lambda(context, mocker: MockerFixture): @scheduled def scheduled_app(event, api, state): pass event = [[ RawScheduledEvent( asset_id=int(), interval=int(), schedule=int(), schedule_start=int(), app_connection=int(), app_stream=int(), company=int(), ).dict( by_alias=True, exclude_unset=True, ) ]] patch = mocker.patch.object(RawScheduledEvent, 'set_schedule_as_completed', side_effect=Exception) scheduled_app(event, context) patch.assert_called_once()
def test_set_completed_status(context, requests_mock): @scheduled def scheduled_app(event, api, state): pass event = [[ RawScheduledEvent( asset_id=int(), interval=int(), schedule=int(), schedule_start=int(), app_connection=int(), app_stream=int(), company=int(), ).dict( by_alias=True, exclude_unset=True, ) ]] # patch post request, that sets scheduled task as completed # looks for url path like /scheduler/123/completed post_mock = requests_mock.post(re.compile(r'/scheduler/\d+/completed')) scheduled_app(event, context) assert post_mock.called_once assert post_mock.last_request.path == '/scheduler/0/completed'
def test_set_start_time(schedule_start, interval, expected, context, mocker: MockerFixture): @scheduled def app(event, api, state): return event event = [[ RawScheduledEvent( asset_id=int(), interval=interval, schedule=int(), schedule_start=schedule_start, app_connection=int(), app_stream=int(), company=int(), ).dict( by_alias=True, exclude_unset=True, ) ]] mocker.patch.object(RawScheduledEvent, 'set_schedule_as_completed') result_event: ScheduledEvent = app(event, context)[0] assert result_event.start_time == expected
def wrapper( event: RawScheduledEvent, api: Api, aws_request_id: str, logging_ctx: LoggingContext, ) -> Any: logging_ctx.asset_id = event.asset_id logging_ctx.app_connection_id = event.app_connection_id cache = get_cache( asset_id=event.asset_id, app_stream_id=event.app_stream_id, app_connection_id=event.app_connection_id, provider=SETTINGS.PROVIDER, app_key=SETTINGS.APP_KEY, cache_url=SETTINGS.CACHE_URL, cache_settings=None, ) with LoggingContext( aws_request_id=aws_request_id, asset_id=event.asset_id, app_connection_id=event.app_connection_id, handler=CorvaLoggerHandler( max_message_size=SETTINGS.LOG_THRESHOLD_MESSAGE_SIZE, max_message_count=SETTINGS.LOG_THRESHOLD_MESSAGE_COUNT, logger=CORVA_LOGGER, placeholder=' ...\n', ), user_handler=handler, logger=CORVA_LOGGER, ): result = func(ScheduledEvent.parse_obj(event), api, cache) try: event.set_schedule_as_completed(api=api) except Exception: # lambda succeeds if we're unable to set completed status CORVA_LOGGER.exception('Could not set schedule as completed.') return result
def test_event_parsing(is_dict, requests_mock: RequestsMocker, context): @scheduled def scheduled_app(event, api, state): pass event = RawScheduledEvent( asset_id=int(), interval=int(), schedule=int(), schedule_start=int(), app_connection=int(), app_stream=int(), company=int(), ).dict( by_alias=True, exclude_unset=True, ) if not is_dict: event = [[event]] requests_mock.post(requests_mock_lib.ANY) scheduled_app(event, context)