userver: /data/code/userver/testsuite/pytest_plugins/pytest_userver/plugins/s3api.py Source File
Loading...
Searching...
No Matches
s3api.py
1import collections
2
3import pytest
4
5from pytest_userver import s3api
6
7pytest_plugins = ['pytest_userver.plugins.core']
8
9
10def pytest_configure(config):
11 config.addinivalue_line('markers', 's3: store s3 files in mock')
12
13
14@pytest.fixture(name='s3_mock_storage')
15def _s3_mock_storage():
16 """
17 In-memory S3 bucket storage for tests.
18
19 @ingroup userver_testsuite_fixtures
20 """
21 buckets = collections.defaultdict(s3api.S3MockBucketStorage)
22 return buckets
23
24
25@pytest.fixture(autouse=True)
26def s3_mock(mockserver, s3_mock_storage):
27 mock_base_url = '/mds-s3'
28 mock_impl = s3api.S3HandleMock(
29 mockserver=mockserver,
30 s3_mock_storage=s3_mock_storage,
31 mock_base_url=mock_base_url,
32 )
33
34 @mockserver.handler(mock_base_url, prefix=True)
35 def _mock_all(request):
36 if request.method == 'GET':
37 if 'prefix' in request.query:
38 return mock_impl.get_objects(request)
39 return mock_impl.get_object(request)
40
41 if request.method == 'PUT':
42 if 'uploadId' in request.query:
43 if 'partNumber' in request.query:
44 return mock_impl.upload_part(request)
45 return mockserver.make_response('Unknown or unsupported method', 404)
46 if request.headers.get('x-amz-copy-source', None):
47 return mock_impl.copy_object(request)
48 return mock_impl.put_object(request)
49
50 if request.method == 'POST':
51 if 'uploadId' in request.query:
52 return mock_impl.complete_multipart_upload(request)
53 if 'uploads' in request.query:
54 return mock_impl.create_multipart_upload(request)
55
56 if request.method == 'DELETE':
57 if 'uploadId' in request.query:
58 return mock_impl.abort_multipart_upload(request)
59 return mock_impl.delete_object(request)
60
61 if request.method == 'HEAD':
62 return mock_impl.get_object_head(request)
63
64 return mockserver.make_response('Unknown or unsupported method', 404)
65
66
67@pytest.fixture(autouse=True)
68def s3_apply(request, s3_mock_storage, load):
69 def _put_files(bucket, files):
70 bucket_storage = s3_mock_storage[bucket]
71 for s3_path, file_path in files.items():
72 bucket_storage.put_object(
73 key=s3_path,
74 data=load(file_path).encode('utf-8'),
75 )
76
77 for mark in request.node.iter_markers('s3'):
78 _put_files(*mark.args, **mark.kwargs)