Search code examples
pytestboto3botocoremoto

Moto testing not raising proper exception


I have the following function I wish to test:

    def download(self):
        s3 = boto3.client('s3')
        try:
            with open(self.flow_cells +'.tar', 'wb') as data:
                s3.download_fileobj(
                    self.source_s3_bucket,
                    self.source_key,
                    data
                )
            return True
        except botocore.exceptions.ClientError as error:
            print(error.response['Error']['Code'])

I am using pytest to test code with moto. All other tests and botocore exceptions are getting flagged except for this one. I am capturing in standard out that it is getting to the exception function and printing the correct code, but moto is not flagging it as an Exception

Here is my testing code.

def test_download(parse_args, file_test):
 with moto.mock_s3():
    s3 = boto3.resource('s3')
    s3.create_bucket(Bucket=parse_args.glacier_s3_bucket, CreateBucketConfiguration={
        'LocationConstraint': 'us-east-1'
        })
    s3.create_bucket(Bucket=parse_args.output_s3_bucket, CreateBucketConfiguration={
        'LocationConstraint': 'us-east-1'
        })
    bucket_version = s3.BucketVersioning(parse_args.glacier_s3_bucket)
    bucket_version.enable()
    s3.Object(parse_args.glacier_s3_bucket, 'flowcells/flowcell-testing.tar').put\
    (Body=open(file_test, 'rb'))
    glacier_client = GlacierRestoreClient(parse_args)
    assert glacier_client.download() is True
    s3.Object(glacier_client.source_s3_bucket, glacier_client.source_key).delete()
    with pytest.raises(Exception) as error:
        glacier_client.download()
    assert 'Error' in error

Solution

  • Inside except clause the exception is silenced and not propagated, so you need to re-raise it:

        except botocore.exceptions.ClientError as error:
            print(error.response['Error']['Code'])
            raise
    

    Bare raise re-raises exception that was just caught.

    PS. Shameless plug: I was one of those who asked Guido 20 years ago to add bare raise! :-)