Example #1
0
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
Example #2
0
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()
Example #3
0
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
Example #4
0
    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.')
Example #5
0
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!']
Example #6
0
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
Example #7
0
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
Example #8
0
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'
Example #9
0
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()
Example #10
0
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
Example #11
0
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')