Exemple #1
0
def should_raise_exception_if_iteration_size_is_more_than_production_iteration_size(
) -> None:
    event = deepcopy(SUBSEQUENT_EVENT)
    event["content"]["iteration_size"] = MAX_ITERATION_SIZE + 1

    with raises(ValidationError):
        lambda_handler(event, any_lambda_context())
Exemple #2
0
def should_raise_exception_if_first_item_is_not_a_multiple_of_iteration_size(
) -> None:
    """Assumes iteration size is not 1"""
    event = deepcopy(SUBSEQUENT_EVENT)
    event["content"]["first_item"] = str(MAX_ITERATION_SIZE - 1)

    with raises(AssertionError):
        lambda_handler(event, any_lambda_context())
Exemple #3
0
def should_raise_exception_if_event_is_missing_state_machine_properties(
    subtests: SubTests, ) -> None:
    for property_name in [DATASET_ID_KEY, METADATA_URL_KEY, VERSION_ID_KEY]:
        event = deepcopy(INITIAL_EVENT)
        del event[property_name]
        expected_message = f"'{property_name}' is a required property"

        with subtests.test(msg=property_name), raises(ValidationError,
                                                      match=expected_message):
            lambda_handler(event, any_lambda_context())
Exemple #4
0
def should_raise_exception_if_content_is_missing_any_property(
        subtests: SubTests) -> None:
    for property_name in ["first_item", "iteration_size", "next_item"]:
        event = deepcopy(SUBSEQUENT_EVENT)
        del event["content"][property_name]
        expected_message = f"'{property_name}' is a required property"

        with subtests.test(msg=property_name), raises(ValidationError,
                                                      match=expected_message):
            lambda_handler(event, any_lambda_context())
Exemple #5
0
def should_raise_exception_if_content_is_missing_any_property(
        subtests: SubTests) -> None:
    for property_name in [FIRST_ITEM_KEY, ITERATION_SIZE_KEY, NEXT_ITEM_KEY]:
        event = deepcopy(SUBSEQUENT_EVENT)
        del event[CONTENT_KEY][property_name]
        expected_message = f"'{property_name}' is a required property"

        with subtests.test(msg=property_name), raises(ValidationError,
                                                      match=expected_message):
            lambda_handler(event, any_lambda_context())
Exemple #6
0
def should_return_content_when_remaining_item_count_is_more_than_iteration_size(
    get_param_mock: MagicMock,
    processing_assets_model_mock: MagicMock,
) -> None:

    assets_table_name = any_table_name()
    results_table_name = any_table_name()
    get_param_mock.side_effect = [assets_table_name, results_table_name]

    remaining_item_count = MAX_ITERATION_SIZE + 1
    next_item_index = any_next_item_index()
    event = deepcopy(SUBSEQUENT_EVENT)
    event["content"]["next_item"] = next_item_index
    processing_assets_model_mock.return_value.count.return_value = (
        next_item_index + remaining_item_count)
    expected_response = {
        "first_item": str(next_item_index),
        "iteration_size": MAX_ITERATION_SIZE,
        "next_item": next_item_index + MAX_ITERATION_SIZE,
        "assets_table_name": assets_table_name,
        "results_table_name": results_table_name,
    }

    response = lambda_handler(event, any_lambda_context())

    assert response == expected_response, response
Exemple #7
0
def should_return_content_when_remaining_item_count_is_more_than_iteration_size(
    get_param_mock: MagicMock,
    processing_assets_model_mock: MagicMock,
) -> None:

    assets_table_name = any_table_name()
    results_table_name = any_table_name()
    get_param_mock.side_effect = [assets_table_name, results_table_name]

    remaining_item_count = MAX_ITERATION_SIZE + 1
    next_item_index = any_next_item_index()
    event = deepcopy(SUBSEQUENT_EVENT)
    event[CONTENT_KEY][NEXT_ITEM_KEY] = next_item_index
    processing_assets_model_mock.return_value.count.return_value = (
        next_item_index + remaining_item_count)
    expected_response = {
        FIRST_ITEM_KEY: str(next_item_index),
        ITERATION_SIZE_KEY: MAX_ITERATION_SIZE,
        NEXT_ITEM_KEY: next_item_index + MAX_ITERATION_SIZE,
        ASSETS_TABLE_NAME_KEY: assets_table_name,
        RESULTS_TABLE_NAME_KEY: results_table_name,
    }

    response = lambda_handler(event, any_lambda_context())

    assert response == expected_response, response
Exemple #8
0
def should_return_zero_as_first_item_if_no_content(
    processing_assets_model_mock: MagicMock, ) -> None:
    event = deepcopy(INITIAL_EVENT)
    processing_assets_model_mock.return_value.count.return_value = any_item_count(
    )

    response = lambda_handler(event, any_lambda_context())

    assert response["first_item"] == "0", response
Exemple #9
0
def should_return_next_item_as_first_item(
        processing_assets_model_mock: MagicMock) -> None:
    event = deepcopy(SUBSEQUENT_EVENT)
    next_item_index = any_next_item_index()
    event["content"]["next_item"] = next_item_index
    processing_assets_model_mock.return_value.count.return_value = any_item_count(
    )

    response = lambda_handler(event, any_lambda_context())

    assert response["first_item"] == str(next_item_index), response
Exemple #10
0
def should_count_only_asset_files() -> None:
    # Given a single metadata and asset entry in the database
    event = deepcopy(INITIAL_EVENT)
    hash_key = f"DATASET#{event['dataset_id']}#VERSION#{event['version_id']}"
    processing_assets_model = processing_assets_model_with_meta()
    processing_assets_model(
        hash_key=hash_key,
        range_key=f"{ProcessingAssetType.METADATA.value}#0",
        url=any_s3_url(),
    ).save()
    processing_assets_model(
        hash_key=hash_key,
        range_key=f"{ProcessingAssetType.DATA.value}#0",
        url=any_s3_url(),
        multihash=any_hex_multihash(),
    ).save()

    # When running the Lambda handler
    response = lambda_handler(event, any_lambda_context())

    # Then the iteration size should be one
    assert response["iteration_size"] == 1
Exemple #11
0
def should_raise_exception_if_iteration_size_is_not_positive() -> None:
    event = deepcopy(SUBSEQUENT_EVENT)
    event["content"]["iteration_size"] = 0

    with raises(ValidationError):
        lambda_handler(event, any_lambda_context())
Exemple #12
0
def should_raise_exception_if_next_item_is_zero() -> None:
    event = deepcopy(SUBSEQUENT_EVENT)
    event["content"]["next_item"] = 0

    with raises(ValidationError):
        lambda_handler(event, any_lambda_context())
Exemple #13
0
def should_raise_exception_if_content_has_unknown_property() -> None:
    event = deepcopy(SUBSEQUENT_EVENT)
    event["content"][any_dictionary_key()] = 1

    with raises(ValidationError):
        lambda_handler(event, any_lambda_context())
Exemple #14
0
def should_raise_exception_if_next_item_is_negative() -> None:
    event = deepcopy(SUBSEQUENT_EVENT)
    event[CONTENT_KEY][NEXT_ITEM_KEY] = -1

    with raises(ValidationError):
        lambda_handler(event, any_lambda_context())
Exemple #15
0
def should_raise_exception_if_event_has_unknown_top_level_property() -> None:
    event = deepcopy(INITIAL_EVENT)
    event[any_dictionary_key()] = 1

    with raises(ValidationError):
        lambda_handler(event, any_lambda_context())
Exemple #16
0
def should_raise_exception_if_iteration_size_is_not_positive() -> None:
    event = deepcopy(SUBSEQUENT_EVENT)
    event[CONTENT_KEY][ITERATION_SIZE_KEY] = 0

    with raises(ValidationError):
        lambda_handler(event, any_lambda_context())
Exemple #17
0
def should_raise_exception_if_first_item_is_negative() -> None:
    event = deepcopy(SUBSEQUENT_EVENT)
    event["content"]["first_item"] = "-1"

    with raises(ValidationError):
        lambda_handler(event, any_lambda_context())