def test_lambda_succeeds_if_user_app_fails( status, side_effect, context, mocker: MockerFixture, requests_mock: RequestsMocker, ): event = RawTaskEvent(task_id='0', version=2).dict() mocker.patch.object( RawTaskEvent, 'get_task_event', return_value=TaskEvent(asset_id=int(), company_id=int()), ) put_mock = requests_mock.put(re.compile(f'/v2/tasks/0/{status}')) result = task(mocker.Mock(side_effect=side_effect, return_value=True))(event, context)[0] assert put_mock.called_once if status == 'fail': assert put_mock.request_history[0].json() == { 'fail_reason': 'test_user_app_raises' } assert result is None if status == 'success': assert put_mock.request_history[0].json() == {'payload': True} assert result is True
def test_log_if_unable_to_update_task_data(context, mocker: MockerFixture, capsys): @task def task_app(event, api): return True event = RawTaskEvent(task_id='0', version=2).dict() mocker.patch.object( RawTaskEvent, 'get_task_event', return_value=TaskEvent(asset_id=int(), company_id=int()), ) update_task_data_patch = mocker.patch.object( RawTaskEvent, 'update_task_data', side_effect=Exception, ) task_app(event, context) captured = capsys.readouterr() assert 'ASSET=0' in captured.out assert 'Could not update task data.' in captured.out update_task_data_patch.assert_called_once()
def test_lambda_succeeds_if_unable_to_get_task_event( status_code, json, status, context, requests_mock: RequestsMocker, ): @task def task_app(event, api): return True event = RawTaskEvent(task_id='0', version=2).dict() get_mock = requests_mock.get(re.compile('/v2/tasks/0'), status_code=status_code, json=json) put_mock = requests_mock.put(re.compile(f'/v2/tasks/0/{status}')) result = task_app(event, context)[0] assert get_mock.called_once assert put_mock.called_once if status == 'fail': assert set(put_mock.request_history[0].json()) == {'fail_reason'} assert result is None if status == 'success': assert put_mock.request_history[0].json() == {'payload': True} assert result is True
def wrapper( event: RawTaskEvent, api: Api, aws_request_id: str, logging_ctx: LoggingContext, ) -> Any: try: app_event = event.get_task_event(api=api) logging_ctx.asset_id = app_event.asset_id with LoggingContext( aws_request_id=aws_request_id, asset_id=app_event.asset_id, app_connection_id=None, 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(app_event, api) status = TaskStatus.success data = {'payload': result} return result except Exception as exc: CORVA_LOGGER.exception('Task app failed to execute.') status = TaskStatus.fail data = {'fail_reason': str(exc)} finally: try: event.update_task_data( api=api, status=status, data=data, ) except Exception: # lambda succeeds if we're unable to update task data CORVA_LOGGER.exception('Could not update task data.')
def test_tutorial002(context, mocker: MockerFixture, capsys, caplog): raw_event = RawTaskEvent(task_id='0', version=2).dict() event = TaskEvent(asset_id=0, company_id=int()) mocker.patch.object( RawTaskEvent, 'get_task_event', return_value=event, ) mocker.patch.object(RawTaskEvent, 'update_task_data') mocker.patch.object(Logger, 'propagate', True) # for caplog to work tutorial002.task_app(raw_event, context) captured = capsys.readouterr() assert captured.out.endswith('Info message!\n') assert caplog.messages == ['Info message!']
def test_lambda_exceptions_are_logged(context, capsys, mocker: MockerFixture): @task def app(event, api): pass raw_event = RawTaskEvent(task_id='0', version=2).dict() mocker.patch.object( CorvaContext, 'from_aws', side_effect=Exception('test_task_logging2'), ) with pytest.raises(Exception, match=r'^test_task_logging2$'): app(raw_event, context) captured = capsys.readouterr() assert 'The app failed to execute.' in captured.out
def test_task_app_succeeds(context, requests_mock: RequestsMocker): @task def task_app(event, api): return True event = RawTaskEvent(task_id='0', version=2).dict() get_mock = requests_mock.get( re.compile('/v2/tasks/0'), json=TaskEvent(asset_id=int(), company_id=int()).dict(), ) put_mock = requests_mock.put(re.compile('/v2/tasks/0/success')) result = task_app(event, context)[0] assert get_mock.called_once assert put_mock.called_once assert put_mock.request_history[0].json() == {'payload': True} assert result is True
def test_custom_log_handler(context, mocker: MockerFixture, capsys): @task(handler=logging.StreamHandler()) def app(event, api): Logger.info('Info message!') raw_event = RawTaskEvent(task_id='0', version=2).dict() event = TaskEvent(asset_id=0, company_id=int()) mocker.patch.object( RawTaskEvent, 'get_task_event', return_value=event, ) mocker.patch.object(RawTaskEvent, 'update_task_data') app(raw_event, context) captured = capsys.readouterr() assert captured.out.endswith('Info message!\n') assert captured.err == 'Info message!\n'
def test_lambda_succeeds_if_unable_to_update_task_data(context, mocker: MockerFixture): @task def task_app(event, api): return True event = RawTaskEvent(task_id='0', version=2).dict() mocker.patch.object( RawTaskEvent, 'get_task_event', return_value=TaskEvent(asset_id=int(), company_id=int()), ) update_task_data_patch = mocker.patch.object( RawTaskEvent, 'update_task_data', side_effect=Exception, ) task_app(event, context) update_task_data_patch.assert_called_once()
def test_log_if_user_app_fails( context, mocker: MockerFixture, requests_mock: RequestsMocker, capsys, ): event = RawTaskEvent(task_id='0', version=2).dict() mocker.patch.object( RawTaskEvent, 'get_task_event', return_value=TaskEvent(asset_id=int(), company_id=int()), ) put_mock = requests_mock.put(re.compile('/v2/tasks/0/fail')) task(mocker.Mock(side_effect=Exception))(event, context) captured = capsys.readouterr() assert put_mock.called_once assert 'ASSET=0' in captured.out assert 'Task app failed to execute.' in captured.out
def test_task_logging(context, capsys, mocker: MockerFixture): @task def app(event, api): Logger.warning('Hello, World!') raw_event = RawTaskEvent(task_id='0', version=2).dict() event = TaskEvent(asset_id=0, company_id=int()) mocker.patch.object( RawTaskEvent, 'get_task_event', return_value=TaskEvent(asset_id=0, company_id=int()), ) mocker.patch.object(RawTaskEvent, 'update_task_data') with freezegun.freeze_time(datetime.datetime(2021, 1, 2, 3, 4, 5, 678910)): app(raw_event, context) captured = capsys.readouterr() assert (captured.out == f'2021-01-02T03:04:05.678Z {context.aws_request_id} WARNING ' f'ASSET={event.asset_id} | Hello, World!\n')