Files
notifications-admin/tests/app/main/test_s3_client.py
Chris Hill-Scott e7e3b95fee Store info about files as S3 metadata
Storing things in the session is proving buggy – we still have one user
(that we know about) where the session data isn’t getting written, so
they’re blocked from uploading a file.

Since all the info we’re storing in the session is about the file, it
makes sense to store it with the file.

This commit only does the writing of the metadata, once we’re sure this
is working we can do subsequent work to read it back, and remove
reliance on the session.
2018-04-27 16:37:05 +01:00

116 lines
3.9 KiB
Python

from collections import namedtuple
from unittest.mock import Mock, call
import pytest
from app.main.s3_client import (
LOGO_LOCATION_STRUCTURE,
TEMP_TAG,
delete_temp_file,
delete_temp_files_created_by,
get_temp_truncated_filename,
persist_logo,
set_metadata_on_csv_upload,
upload_logo,
)
bucket = 'test_bucket'
data = {'data': 'some_data'}
filename = 'test.png'
upload_id = 'test_uuid'
region = 'eu-west1'
@pytest.fixture
def upload_filename(fake_uuid):
return LOGO_LOCATION_STRUCTURE.format(
temp=TEMP_TAG.format(user_id=fake_uuid), unique_id=upload_id, filename=filename)
def test_upload_logo_calls_correct_args(client, mocker, fake_uuid, upload_filename):
mocker.patch('uuid.uuid4', return_value=upload_id)
mocker.patch.dict('flask.current_app.config', {'LOGO_UPLOAD_BUCKET_NAME': bucket})
mocked_s3_upload = mocker.patch('app.main.s3_client.utils_s3upload')
upload_logo(filename=filename, user_id=fake_uuid, filedata=data, region=region)
assert mocked_s3_upload.called_once_with(
filedata=data,
region=region,
file_location=upload_filename,
bucket_name=bucket
)
def test_persist_logo(client, mocker, fake_uuid, upload_filename):
mocker.patch.dict('flask.current_app.config', {'LOGO_UPLOAD_BUCKET_NAME': bucket})
mocked_rename_s3_object = mocker.patch('app.main.s3_client.rename_s3_object')
persisted_filename = persist_logo(filename=upload_filename, user_id=fake_uuid)
assert mocked_rename_s3_object.called_once_with(
upload_filename, get_temp_truncated_filename(upload_filename, fake_uuid))
assert persisted_filename == get_temp_truncated_filename(upload_filename, fake_uuid)
def test_persist_logo_returns_if_not_temp(client, mocker, fake_uuid):
filename = 'logo.png'
mocker.patch.dict('flask.current_app.config', {'LOGO_UPLOAD_BUCKET_NAME': bucket})
mocked_rename_s3_object = mocker.patch('app.main.s3_client.rename_s3_object')
persisted_filename = persist_logo(filename=filename, user_id=fake_uuid)
assert not mocked_rename_s3_object.called
assert persisted_filename == filename
def test_delete_temp_files_created_by_user(client, mocker, fake_uuid):
obj = namedtuple("obj", ["key"])
objs = [obj(key='test1'), obj(key='test2')]
mocker.patch('app.main.s3_client.get_s3_objects_filter_by_prefix', return_value=objs)
mocked_delete_s3_object = mocker.patch('app.main.s3_client.delete_s3_object')
delete_temp_files_created_by(fake_uuid)
assert mocked_delete_s3_object.called_with_args(objs[0].key)
for index, arg in enumerate(mocked_delete_s3_object.call_args_list):
assert arg == call(objs[index].key)
def test_delete_single_temp_file(client, mocker, fake_uuid, upload_filename):
mocked_delete_s3_object = mocker.patch('app.main.s3_client.delete_s3_object')
delete_temp_file(upload_filename)
assert mocked_delete_s3_object.called_with_args(upload_filename)
def test_does_not_delete_non_temp_file(client, mocker, fake_uuid):
filename = 'logo.png'
mocked_delete_s3_object = mocker.patch('app.main.s3_client.delete_s3_object')
with pytest.raises(ValueError) as error:
delete_temp_file(filename)
assert mocked_delete_s3_object.called_with_args(filename)
assert str(error.value) == 'Not a temp file: {}'.format(filename)
def test_sets_metadata(client, mocker):
mocked_s3_object = Mock()
mocked_get_s3_object = mocker.patch(
'app.main.s3_client.get_csv_upload',
return_value=mocked_s3_object,
)
set_metadata_on_csv_upload('1234', '5678', foo='bar', baz=True)
mocked_get_s3_object.assert_called_once_with('1234', '5678')
mocked_s3_object.copy_from.assert_called_once_with(
CopySource='test-notifications-csv-upload/service-1234-notify/5678.csv',
Metadata={'baz': 'True', 'foo': 'bar'},
MetadataDirective='REPLACE',
ServerSideEncryption='AES256',
)