Skip to content

Commit 817130f

Browse files
authored
bump moto (#1297)
* add missing StreamingChecksumBody subclass * add patch check * isort * add missing patch * bump moto * cleanup * cleanup * cleanup and simplify * squash last 2 commits to sign
1 parent 4a096bd commit 817130f

File tree

7 files changed

+162
-338
lines changed

7 files changed

+162
-338
lines changed

pyproject.toml

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,17 @@ botocore-dev = [
7171
# "colorama>0.3.0", # Windows requirement
7272
]
7373
dev = [
74-
"dill ~=0.3.3", # Used in test_patches.py
75-
"docker ~=7.1",
76-
"docutils >=0.16,<0.22", # Used in test_version.py
77-
"moto[server,s3,sqs,awslambda,dynamodb,cloudformation,sns,batch,ec2,rds] ~=4.2.9",
78-
"packaging ~=24.1", # Used in test_version.py
74+
"dill ~= 0.3.3", # Used in test_patches.py
75+
"docker ~= 7.1",
76+
"docutils >= 0.16,<0.22", # Used in test_version.py
77+
"moto[server,s3,sqs,awslambda,dynamodb,cloudformation,sns,batch,ec2,rds] ~= 5.0.11",
78+
"packaging ~= 24.1", # Used in test_version.py
7979
"pip >=24.3.1,<26", # Used in test_version.py
80-
"pre-commit >=3.5.0,<5",
81-
"pytest-asyncio >=0.23.8,<0.26",
82-
"requests ~=2.32.3", # Used in test_version.py
83-
"time-machine ~=2.15.0", # Used in test_signers.py
80+
"pre-commit >= 3.5.0,<5",
81+
"pytest-asyncio >= 0.23.8,<0.26",
82+
"requests ~= 2.32.3", # Used in test_version.py
83+
"time-machine ~= 2.15.0", # Used in test_signers.py
8484
"tomli; python_version<'3.11'", # Used in test_version.py
85-
"werkzeug ~=3.0.6", # Used in moto_server.py
8685
]
8786

8887
[tool.uv]

tests/boto_tests/unit/test_signers.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@
2525
DATE = datetime.datetime(2024, 11, 7, 17, 39, 33, tzinfo=timezone.utc)
2626

2727

28+
@pytest.mark.parametrize(
29+
'aws_auth',
30+
[{'aws_secret_access_key': 'skid', 'aws_access_key_id': 'akid'}],
31+
)
2832
async def test_signers_generate_db_auth_token(rds_client):
2933
hostname = 'prod-instance.us-east-1.rds.amazonaws.com'
3034
port = 3306
@@ -41,15 +45,19 @@ async def test_signers_generate_db_auth_token(rds_client):
4145
hostname, port, username
4246
)
4347

44-
# A scheme needs to be appended to the beginning or urlsplit may fail
45-
# on certain systems.
46-
assert result.startswith(
47-
'prod-instance.us-east-1.rds.amazonaws.com:3306/?AWSAccessKeyId=xxx&'
48-
)
49-
assert result2.startswith(
50-
'prod-instance.us-east-1.rds.amazonaws.com:3306/?AWSAccessKeyId=xxx&'
48+
expected_result = (
49+
'prod-instance.us-east-1.rds.amazonaws.com:3306/?Action=connect'
50+
'&DBUser=someusername&X-Amz-Algorithm=AWS4-HMAC-SHA256'
51+
'&X-Amz-Date=20161107T173933Z&X-Amz-SignedHeaders=host'
52+
'&X-Amz-Expires=900&X-Amz-Credential=akid%2F20161107%2F'
53+
'us-east-1%2Frds-db%2Faws4_request&X-Amz-Signature'
54+
'=d1138cdbc0ca63eec012ec0fc6c2267e03642168f5884a7795320d4c18374c61'
5155
)
5256

57+
assert_url_equal('http://' + result, 'http://' + expected_result)
58+
59+
assert result2 == result
60+
5361

5462
class TestDSQLGenerateDBAuthToken:
5563
@pytest.fixture(scope="session")

tests/conftest.py

Lines changed: 52 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ def alternative_region():
126126

127127
@pytest.fixture
128128
def signature_version():
129-
return 's3'
129+
return 'v4'
130130

131131

132132
@pytest.fixture
@@ -160,23 +160,18 @@ def config(request, region, signature_version):
160160
)
161161

162162

163+
@pytest.fixture
164+
def aws_auth():
165+
return {'aws_secret_access_key': 'xxx', 'aws_access_key_id': 'xxx'}
166+
167+
163168
@pytest.fixture
164169
def mocking_test():
165170
# change this flag for test with real aws
166171
# TODO: this should be merged with pytest.mark.moto
167172
return True
168173

169174

170-
def moto_config(endpoint_url):
171-
kw = dict(
172-
endpoint_url=endpoint_url,
173-
aws_secret_access_key="xxx",
174-
aws_access_key_id="xxx",
175-
)
176-
177-
return kw
178-
179-
180175
@pytest.fixture
181176
def patch_attributes(request):
182177
"""Call unittest.mock.patch on arguments passed through a pytest mark.
@@ -227,14 +222,15 @@ async def s3_client(
227222
session,
228223
region,
229224
config,
230-
s3_server,
225+
moto_server,
231226
mocking_test,
232227
s3_verify,
233228
patch_attributes,
229+
aws_auth,
234230
):
235231
# This depends on mock_attributes because we may want to test event listeners.
236232
# See the documentation of `mock_attributes` for details.
237-
kw = moto_config(s3_server) if mocking_test else {}
233+
kw = {'endpoint_url': moto_server, **aws_auth} if mocking_test else {}
238234

239235
async with session.create_client(
240236
's3', region_name=region, config=config, verify=s3_verify, **kw
@@ -244,9 +240,14 @@ async def s3_client(
244240

245241
@pytest.fixture
246242
async def alternative_s3_client(
247-
session, alternative_region, signature_version, s3_server, mocking_test
243+
session,
244+
alternative_region,
245+
signature_version,
246+
moto_server,
247+
mocking_test,
248+
aws_auth,
248249
):
249-
kw = moto_config(s3_server) if mocking_test else {}
250+
kw = {'endpoint_url': moto_server, **aws_auth} if mocking_test else {}
250251

251252
config = AioConfig(
252253
region_name=alternative_region,
@@ -263,9 +264,9 @@ async def alternative_s3_client(
263264

264265
@pytest.fixture
265266
async def dynamodb_client(
266-
session, region, config, dynamodb2_server, mocking_test
267+
session, region, config, moto_server, mocking_test, aws_auth
267268
):
268-
kw = moto_config(dynamodb2_server) if mocking_test else {}
269+
kw = {'endpoint_url': moto_server, **aws_auth} if mocking_test else {}
269270
async with session.create_client(
270271
'dynamodb', region_name=region, config=config, **kw
271272
) as client:
@@ -274,72 +275,86 @@ async def dynamodb_client(
274275

275276
@pytest.fixture
276277
async def cloudformation_client(
277-
session, region, config, cloudformation_server, mocking_test
278+
session, region, config, moto_server, mocking_test, aws_auth
278279
):
279-
kw = moto_config(cloudformation_server) if mocking_test else {}
280+
kw = {'endpoint_url': moto_server, **aws_auth} if mocking_test else {}
280281
async with session.create_client(
281282
'cloudformation', region_name=region, config=config, **kw
282283
) as client:
283284
yield client
284285

285286

286287
@pytest.fixture
287-
async def sns_client(session, region, config, sns_server, mocking_test):
288-
kw = moto_config(sns_server) if mocking_test else {}
288+
async def sns_client(
289+
session, region, config, moto_server, mocking_test, aws_auth
290+
):
291+
kw = {'endpoint_url': moto_server, **aws_auth} if mocking_test else {}
289292
async with session.create_client(
290293
'sns', region_name=region, config=config, **kw
291294
) as client:
292295
yield client
293296

294297

295298
@pytest.fixture
296-
async def sqs_client(session, region, config, sqs_server, mocking_test):
297-
kw = moto_config(sqs_server) if mocking_test else {}
299+
async def sqs_client(
300+
session, region, config, moto_server, mocking_test, aws_auth
301+
):
302+
kw = {'endpoint_url': moto_server, **aws_auth} if mocking_test else {}
298303
async with session.create_client(
299304
'sqs', region_name=region, config=config, **kw
300305
) as client:
301306
yield client
302307

303308

304309
@pytest.fixture
305-
async def batch_client(session, region, config, batch_server, mocking_test):
306-
kw = moto_config(batch_server) if mocking_test else {}
310+
async def batch_client(
311+
session, region, config, moto_server, mocking_test, aws_auth
312+
):
313+
kw = {'endpoint_url': moto_server, **aws_auth} if mocking_test else {}
307314
async with session.create_client(
308315
'batch', region_name=region, config=config, **kw
309316
) as client:
310317
yield client
311318

312319

313320
@pytest.fixture
314-
async def lambda_client(session, region, config, lambda_server, mocking_test):
315-
kw = moto_config(lambda_server) if mocking_test else {}
321+
async def lambda_client(
322+
session, region, config, moto_server, mocking_test, aws_auth
323+
):
324+
kw = {'endpoint_url': moto_server, **aws_auth} if mocking_test else {}
316325
async with session.create_client(
317326
'lambda', region_name=region, config=config, **kw
318327
) as client:
319328
yield client
320329

321330

322331
@pytest.fixture
323-
async def iam_client(session, region, config, iam_server, mocking_test):
324-
kw = moto_config(iam_server) if mocking_test else {}
332+
async def iam_client(
333+
session, region, config, moto_server, mocking_test, aws_auth
334+
):
335+
kw = {'endpoint_url': moto_server, **aws_auth} if mocking_test else {}
325336
async with session.create_client(
326337
'iam', region_name=region, config=config, **kw
327338
) as client:
328339
yield client
329340

330341

331342
@pytest.fixture
332-
async def rds_client(session, region, config, rds_server, mocking_test):
333-
kw = moto_config(rds_server) if mocking_test else {}
343+
async def rds_client(
344+
session, region, config, moto_server, mocking_test, aws_auth
345+
):
346+
kw = {'endpoint_url': moto_server, **aws_auth} if mocking_test else {}
334347
async with session.create_client(
335348
'rds', region_name=region, config=config, **kw
336349
) as client:
337350
yield client
338351

339352

340353
@pytest.fixture
341-
async def ec2_client(session, region, config, ec2_server, mocking_test):
342-
kw = moto_config(ec2_server) if mocking_test else {}
354+
async def ec2_client(
355+
session, region, config, moto_server, mocking_test, aws_auth
356+
):
357+
kw = {'endpoint_url': moto_server, **aws_auth} if mocking_test else {}
343358
async with session.create_client(
344359
'ec2', region_name=region, config=config, **kw
345360
) as client:
@@ -348,9 +363,9 @@ async def ec2_client(session, region, config, ec2_server, mocking_test):
348363

349364
@pytest.fixture
350365
async def kinesis_client(
351-
session, region, config, kinesis_server, mocking_test
366+
session, region, config, moto_server, mocking_test, aws_auth
352367
):
353-
kw = moto_config(kinesis_server) if mocking_test else {}
368+
kw = {'endpoint_url': moto_server, **aws_auth} if mocking_test else {}
354369
async with session.create_client(
355370
'kinesis', region_name=region, config=config, **kw
356371
) as client:
@@ -468,8 +483,8 @@ def tempdir():
468483

469484

470485
@pytest.fixture
471-
def create_object(s3_client, bucket_name):
472-
async def _f(key_name, body='foo'):
486+
def create_object(s3_client, bucket_name: str):
487+
async def _f(key_name: str, body='foo', **kwargs):
473488
r = await s3_client.put_object(
474489
Bucket=bucket_name, Key=key_name, Body=body
475490
)

tests/mock_server.py

Lines changed: 23 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,32 @@
11
import asyncio
22
import multiprocessing
3+
import socket
34

45
# Third Party
56
import aiohttp
67
import aiohttp.web
78
import pytest
89
from aiohttp.web import StreamResponse
9-
10-
# aiobotocore
11-
from tests.moto_server import MotoService, get_free_tcp_port, host
10+
from moto.server import ThreadedMotoServer
1211

1312
_proxy_bypass = {
1413
"http": None,
1514
"https": None,
1615
}
1716

17+
host = '127.0.0.1'
18+
19+
20+
def get_free_tcp_port(release_socket: bool = False):
21+
sckt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
22+
sckt.bind((host, 0))
23+
addr, port = sckt.getsockname()
24+
if release_socket:
25+
sckt.close()
26+
return port
27+
28+
return sckt, port
29+
1830

1931
# This runs in a subprocess for a variety of reasons
2032
# 1) early versions of python 3.5 did not correctly set one thread per run loop
@@ -97,68 +109,11 @@ async def _wait_until_up(self):
97109

98110

99111
@pytest.fixture
100-
async def s3_server(server_scheme):
101-
async with MotoService('s3', ssl=server_scheme == 'https') as svc:
102-
yield svc.endpoint_url
103-
104-
105-
@pytest.fixture
106-
async def dynamodb2_server(server_scheme):
107-
async with MotoService('dynamodb', ssl=server_scheme == 'https') as svc:
108-
yield svc.endpoint_url
109-
110-
111-
@pytest.fixture
112-
async def cloudformation_server(server_scheme):
113-
async with MotoService(
114-
'cloudformation', ssl=server_scheme == 'https'
115-
) as svc:
116-
yield svc.endpoint_url
117-
118-
119-
@pytest.fixture
120-
async def sns_server(server_scheme):
121-
async with MotoService('sns', ssl=server_scheme == 'https') as svc:
122-
yield svc.endpoint_url
123-
124-
125-
@pytest.fixture
126-
async def sqs_server(server_scheme):
127-
async with MotoService('sqs', ssl=server_scheme == 'https') as svc:
128-
yield svc.endpoint_url
129-
130-
131-
@pytest.fixture
132-
async def batch_server(server_scheme):
133-
async with MotoService('batch', ssl=server_scheme == 'https') as svc:
134-
yield svc.endpoint_url
135-
136-
137-
@pytest.fixture
138-
async def lambda_server(server_scheme):
139-
async with MotoService('lambda', ssl=server_scheme == 'https') as svc:
140-
yield svc.endpoint_url
141-
142-
143-
@pytest.fixture
144-
async def iam_server(server_scheme):
145-
async with MotoService('iam', ssl=server_scheme == 'https') as svc:
146-
yield svc.endpoint_url
147-
148-
149-
@pytest.fixture
150-
async def rds_server(server_scheme):
151-
async with MotoService('rds', ssl=server_scheme == 'https') as svc:
152-
yield svc.endpoint_url
153-
154-
155-
@pytest.fixture
156-
async def ec2_server(server_scheme):
157-
async with MotoService('ec2', ssl=server_scheme == 'https') as svc:
158-
yield svc.endpoint_url
159-
160-
161-
@pytest.fixture
162-
async def kinesis_server(server_scheme):
163-
async with MotoService('kinesis', ssl=server_scheme == 'https') as svc:
164-
yield svc.endpoint_url
112+
async def moto_server(server_scheme):
113+
server = ThreadedMotoServer(port=0)
114+
try:
115+
server.start()
116+
host, port = server.get_host_and_port()
117+
yield f'http://{host}:{port}'
118+
finally:
119+
server.stop()

0 commit comments

Comments
 (0)