예제 #1
0
def batch_execute_statement(
        request: BatchExecuteStatementRequests
) -> BatchExecuteStatementResponse:
    resource: Optional[Resource] = None
    try:
        resource = get_resource(request.resourceArn, request.secretArn,
                                request.transactionId)

        update_results: List[UpdateResult] = []

        if not request.parameterSets:
            response: BatchExecuteStatementResponse = BatchExecuteStatementResponse(
                updateResults=update_results)
        else:
            for parameter_set in request.parameterSets:
                parameters: Dict[str, Any] = {
                    parameter.name: parameter.valid_value
                    for parameter in parameter_set.__root__
                }
                result: ExecuteStatementResponse = resource.execute(
                    request.sql, parameters, request.database)

                if result.generatedFields:
                    update_results.append(
                        UpdateResult(generatedFields=result.generatedFields))

            response = BatchExecuteStatementResponse(
                updateResults=update_results)

        if not resource.transaction_id:
            resource.commit()
        return response
    finally:
        if resource and not resource.transaction_id:
            resource.close()
예제 #2
0
def test_get_resource(secrets, mocker) -> None:
    resource_arn: str = 'dummy_resource_arn'

    connection_maker = SQLite.create_connection_maker('localhost', 3306,
                                                      'test', 'pw', {})

    RESOURCE_METAS[resource_arn] = ResourceMeta(SQLite, connection_maker,
                                                'localhost', 3306, 'test',
                                                'pw')

    mock_get_connection = mocker.patch(
        'local_data_api.resources.resource.get_connection')
    new_connection = mocker.Mock()
    mock_get_connection.return_value = new_connection
    resource = get_resource(resource_arn, 'dummy', 'transaction')
    assert resource.connection, new_connection

    with pytest.raises(BadRequestException):
        get_resource(resource_arn, 'dummy', 'transaction', database='test')
예제 #3
0
def test_get_resource_exception(clear, secrets, mocker) -> None:
    resource_arn: str = 'dummy_resource_arn'

    connection_maker = SQLite.create_connection_maker()

    RESOURCE_METAS[resource_arn] = ResourceMeta(SQLite, connection_maker,
                                                'localhost', 3306, 'test',
                                                'pw')

    with pytest.raises(BadRequestException):
        get_resource('invalid', 'dummy')

    with pytest.raises(InternalServerErrorException):
        CONNECTION_POOL['dummy'] = connection_maker()
        get_resource('invalid', 'dummy', 'dummy')
    del CONNECTION_POOL['dummy']

    with pytest.raises(BadRequestException):
        secrets.side_effect = BadRequestException('error')
        get_resource(resource_arn, 'dummy')

    with pytest.raises(InternalServerErrorException):
        secrets.side_effect = BadRequestException('error')
        CONNECTION_POOL['dummy'] = connection_maker()
        get_resource(resource_arn, 'dummy', 'dummy')

    secrets.side_effect = None
    secret = mocker.Mock()
    secret.user_name = 'invalid'
    secret.password = '******'

    secrets.return_value = secret
    with pytest.raises(BadRequestException):
        get_resource(resource_arn, 'dummy')

    secret = mocker.Mock()
    secret.user_name = 'test'
    secret.password = '******'

    secrets.return_value = secret
    with pytest.raises(BadRequestException):
        get_resource(resource_arn, 'dummy')