def test_list_objects_empty_bucket(stub_and_patch, make_unique_name,
                                   make_bucket, object_count):
    """Test that listing the objects in a test bucket returns the expected list
    and that the bucket can be emptied of objects."""
    stubber = stub_and_patch(bucket_wrapper, 'get_s3')
    bucket = make_bucket(stubber, bucket_wrapper.get_s3())
    object_key = make_unique_name('object')

    put_keys = []
    for obj_suffix in range(0, object_count):
        key = f"{object_key}-{obj_suffix}"
        data = bytes(f"Test data-{obj_suffix}", 'utf-8')
        stubber.stub_put_object(bucket.name, key)
        stubber.stub_head_object(bucket.name, key)
        object_wrapper.put_object(bucket, key, data)
        put_keys.append(key)

    stubber.stub_list_objects(bucket.name, put_keys)
    stubber.stub_list_objects(bucket.name, put_keys, "object")
    stubber.stub_list_objects(bucket.name, put_keys)
    if put_keys:
        stubber.stub_delete_objects(bucket.name, put_keys)
    stubber.stub_list_objects(bucket.name)

    all_objects = object_wrapper.list_objects(bucket)
    assert set(put_keys).issubset([o.key for o in all_objects])
    filtered_objects = object_wrapper.list_objects(bucket, "object")
    assert put_keys == [o.key for o in filtered_objects]
    object_wrapper.empty_bucket(bucket)
    assert [] == object_wrapper.list_objects(bucket)
def test_delete_objects(stub_and_patch, make_unique_name, make_bucket):
    """Test that deleting objects from a bucket works as expected."""
    stubber = stub_and_patch(bucket_wrapper, 'get_s3')
    bucket = make_bucket(stubber, bucket_wrapper.get_s3())
    object_key = make_unique_name('object')

    put_keys = []
    for suffix in range(0, 5):
        put_key = f"{object_key}-{suffix}"
        stubber.stub_put_object(bucket.name, put_key)
        stubber.stub_head_object(bucket.name, put_key)
        object_wrapper.put_object(bucket, put_key, b"Test data!")
        put_keys.append(put_key)

    delete_keys = put_keys[3:]
    keep_keys = put_keys[:3]

    stubber.stub_delete_objects(bucket.name, delete_keys)
    stubber.stub_list_objects(bucket.name, keep_keys)
    stubber.stub_list_objects(bucket.name)

    response = object_wrapper.delete_objects(bucket, delete_keys)
    assert set(delete_keys) == set(obj['Key'] for obj in response['Deleted'])
    assert set(keep_keys) == set(
        obj.key for obj in object_wrapper.list_objects(bucket))

    object_wrapper.empty_bucket(bucket)