| 
									
										
										
										
											2023-11-30 07:55:51 -08:00
										 |  |  | import json | 
					
						
							|  |  |  | from unittest import SkipTest, TestCase | 
					
						
							| 
									
										
										
										
											2017-02-23 19:43:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | import boto3 | 
					
						
							| 
									
										
										
										
											2022-08-23 16:09:35 +00:00
										 |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2023-11-30 07:55:51 -08:00
										 |  |  | import requests | 
					
						
							| 
									
										
										
										
											2022-08-23 16:09:35 +00:00
										 |  |  | from botocore.exceptions import ClientError | 
					
						
							| 
									
										
										
										
											2023-11-30 07:55:51 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-07 12:03:33 +00:00
										 |  |  | from moto import mock_aws, settings | 
					
						
							| 
									
										
										
										
											2023-02-22 10:21:45 -01:00
										 |  |  | from moto.core.model_instances import model_data, reset_model_data | 
					
						
							| 
									
										
										
										
											2017-02-23 19:43:48 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-12 21:04:19 -04:00
										 |  |  | base_url = ( | 
					
						
							|  |  |  |     "http://localhost:5000" | 
					
						
							|  |  |  |     if settings.TEST_SERVER_MODE | 
					
						
							|  |  |  |     else "http://motoapi.amazonaws.com" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2023-06-15 11:03:20 +00:00
										 |  |  | data_url = f"{base_url}/moto-api/data.json" | 
					
						
							| 
									
										
										
										
											2017-02-23 19:43:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-07 12:03:33 +00:00
										 |  |  | @mock_aws | 
					
						
							| 
									
										
										
										
											2023-12-14 20:35:36 -01:00
										 |  |  | def test_reset_api() -> None: | 
					
						
							| 
									
										
										
										
											2017-02-23 19:43:48 -05:00
										 |  |  |     conn = boto3.client("sqs", region_name="us-west-1") | 
					
						
							|  |  |  |     conn.create_queue(QueueName="queue1") | 
					
						
							| 
									
										
										
										
											2023-07-10 21:04:31 +00:00
										 |  |  |     assert len(conn.list_queues()["QueueUrls"]) == 1 | 
					
						
							| 
									
										
										
										
											2017-02-23 19:43:48 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |     res = requests.post(f"{base_url}/moto-api/reset") | 
					
						
							| 
									
										
										
										
											2023-07-10 21:04:31 +00:00
										 |  |  |     assert res.content == b'{"status": "ok"}' | 
					
						
							| 
									
										
										
										
											2017-02-23 19:43:48 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-10 21:04:31 +00:00
										 |  |  |     assert "QueueUrls" not in conn.list_queues()  # No more queues | 
					
						
							| 
									
										
										
										
											2017-03-11 22:45:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-07 12:03:33 +00:00
										 |  |  | @mock_aws | 
					
						
							| 
									
										
										
										
											2023-12-14 20:35:36 -01:00
										 |  |  | def test_data_api() -> None: | 
					
						
							| 
									
										
										
										
											2017-03-11 22:45:42 -05:00
										 |  |  |     conn = boto3.client("sqs", region_name="us-west-1") | 
					
						
							|  |  |  |     conn.create_queue(QueueName="queue1") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-15 11:03:20 +00:00
										 |  |  |     queues = requests.post(data_url).json()["sqs"]["Queue"] | 
					
						
							| 
									
										
										
										
											2023-07-10 21:04:31 +00:00
										 |  |  |     assert len(queues) == 1 | 
					
						
							| 
									
										
										
										
											2017-03-11 22:45:42 -05:00
										 |  |  |     queue = queues[0] | 
					
						
							| 
									
										
										
										
											2023-07-10 21:04:31 +00:00
										 |  |  |     assert queue["name"] == "queue1" | 
					
						
							| 
									
										
										
										
											2022-08-23 16:09:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-07 12:03:33 +00:00
										 |  |  | @mock_aws | 
					
						
							| 
									
										
										
										
											2023-12-14 20:35:36 -01:00
										 |  |  | def test_overwriting_s3_object_still_returns_data() -> None: | 
					
						
							| 
									
										
										
										
											2023-06-15 11:03:20 +00:00
										 |  |  |     if settings.TEST_SERVER_MODE: | 
					
						
							|  |  |  |         raise SkipTest("No point in testing this behaves the same in ServerMode") | 
					
						
							|  |  |  |     s3 = boto3.client("s3", region_name="us-east-1") | 
					
						
							|  |  |  |     s3.create_bucket(Bucket="test") | 
					
						
							|  |  |  |     s3.put_object(Bucket="test", Body=b"t", Key="file.txt") | 
					
						
							|  |  |  |     assert len(requests.post(data_url).json()["s3"]["FakeKey"]) == 1 | 
					
						
							|  |  |  |     s3.put_object(Bucket="test", Body=b"t", Key="file.txt") | 
					
						
							|  |  |  |     assert len(requests.post(data_url).json()["s3"]["FakeKey"]) == 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-07 12:03:33 +00:00
										 |  |  | @mock_aws | 
					
						
							| 
									
										
										
										
											2023-12-14 20:35:36 -01:00
										 |  |  | def test_creation_error__data_api_still_returns_thing() -> None: | 
					
						
							| 
									
										
										
										
											2022-08-23 16:09:35 +00:00
										 |  |  |     if settings.TEST_SERVER_MODE: | 
					
						
							|  |  |  |         raise SkipTest("No point in testing this behaves the same in ServerMode") | 
					
						
							|  |  |  |     # Timeline: | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # When calling BaseModel.__new__, the created instance (of type FakeAutoScalingGroup) is stored in `model_data` | 
					
						
							|  |  |  |     # We then try and initialize the instance by calling __init__ | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # Initialization fails in this test, but: by then, the instance is already registered | 
					
						
							|  |  |  |     # This test ensures that we can still print/__repr__ the uninitialized instance, despite the fact that no attributes have been set | 
					
						
							|  |  |  |     client = boto3.client("autoscaling", region_name="us-east-1") | 
					
						
							|  |  |  |     # Creating this ASG fails, because it doesn't specify a Region/VPC | 
					
						
							|  |  |  |     with pytest.raises(ClientError): | 
					
						
							|  |  |  |         client.create_auto_scaling_group( | 
					
						
							|  |  |  |             AutoScalingGroupName="test_asg", | 
					
						
							|  |  |  |             LaunchTemplate={ | 
					
						
							|  |  |  |                 "LaunchTemplateName": "test_launch_template", | 
					
						
							|  |  |  |                 "Version": "1", | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             MinSize=0, | 
					
						
							|  |  |  |             MaxSize=20, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     from moto.moto_api._internal.urls import response_instance | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-14 20:35:36 -01:00
										 |  |  |     _, _, x = response_instance.model_data(None, "None", None) | 
					
						
							| 
									
										
										
										
											2022-08-23 16:09:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     as_objects = json.loads(x)["autoscaling"] | 
					
						
							|  |  |  |     assert len(as_objects["FakeAutoScalingGroup"]) >= 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     names = [obj["name"] for obj in as_objects["FakeAutoScalingGroup"]] | 
					
						
							| 
									
										
										
										
											2023-07-10 21:04:31 +00:00
										 |  |  |     assert "test_asg" in names | 
					
						
							| 
									
										
										
										
											2023-02-22 10:21:45 -01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-14 20:35:36 -01:00
										 |  |  | def test_model_data_is_emptied_as_necessary() -> None: | 
					
						
							| 
									
										
										
										
											2023-02-22 10:21:45 -01:00
										 |  |  |     if settings.TEST_SERVER_MODE: | 
					
						
							|  |  |  |         raise SkipTest("We're only interested in the decorator performance here") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Reset any residual data | 
					
						
							|  |  |  |     reset_model_data() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # No instances exist, because we have just reset it | 
					
						
							|  |  |  |     for classes_per_service in model_data.values(): | 
					
						
							|  |  |  |         for _class in classes_per_service.values(): | 
					
						
							| 
									
										
										
										
											2023-12-14 20:35:36 -01:00
										 |  |  |             assert _class.instances == []  # type: ignore[attr-defined] | 
					
						
							| 
									
										
										
										
											2023-02-22 10:21:45 -01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-07 12:03:33 +00:00
										 |  |  |     # TODO: ensure that iam is not loaded, and IAM policies are not created | 
					
						
							|  |  |  |     # with mock_aws(load_static_data=False) ? | 
					
						
							|  |  |  |     with mock_aws(): | 
					
						
							| 
									
										
										
										
											2023-02-22 10:21:45 -01:00
										 |  |  |         # When just starting a mock, it is empty | 
					
						
							|  |  |  |         for classes_per_service in model_data.values(): | 
					
						
							|  |  |  |             for _class in classes_per_service.values(): | 
					
						
							| 
									
										
										
										
											2023-12-14 20:35:36 -01:00
										 |  |  |                 assert _class.instances == []  # type: ignore[attr-defined] | 
					
						
							| 
									
										
										
										
											2023-02-22 10:21:45 -01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # After creating a queue, some data will be present | 
					
						
							|  |  |  |         conn = boto3.client("sqs", region_name="us-west-1") | 
					
						
							|  |  |  |         conn.create_queue(QueueName="queue1") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-14 20:35:36 -01:00
										 |  |  |         assert len(model_data["sqs"]["Queue"].instances) == 1  # type: ignore[attr-defined] | 
					
						
							| 
									
										
										
										
											2023-02-22 10:21:45 -01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # But after the mock ends, it is empty again | 
					
						
							|  |  |  |     for classes_per_service in model_data.values(): | 
					
						
							|  |  |  |         for _class in classes_per_service.values(): | 
					
						
							| 
									
										
										
										
											2023-12-14 20:35:36 -01:00
										 |  |  |             assert _class.instances == []  # type: ignore[attr-defined] | 
					
						
							| 
									
										
										
										
											2023-02-22 10:21:45 -01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # When we have multiple/nested mocks, the data should still be present after the first mock ends | 
					
						
							| 
									
										
										
										
											2024-01-07 12:03:33 +00:00
										 |  |  |     with mock_aws(): | 
					
						
							| 
									
										
										
										
											2023-02-22 10:21:45 -01:00
										 |  |  |         conn = boto3.client("sqs", region_name="us-west-1") | 
					
						
							|  |  |  |         conn.create_queue(QueueName="queue1") | 
					
						
							| 
									
										
										
										
											2024-01-07 12:03:33 +00:00
										 |  |  |         with mock_aws(): | 
					
						
							| 
									
										
										
										
											2023-02-22 10:21:45 -01:00
										 |  |  |             # The data should still be here - instances should not reset if another mock is still active | 
					
						
							| 
									
										
										
										
											2023-12-14 20:35:36 -01:00
										 |  |  |             assert len(model_data["sqs"]["Queue"].instances) == 1  # type: ignore[attr-defined] | 
					
						
							| 
									
										
										
										
											2023-02-22 10:21:45 -01:00
										 |  |  |         # The data should still be here - the inner mock has exited, but the outer mock is still active | 
					
						
							| 
									
										
										
										
											2023-12-14 20:35:36 -01:00
										 |  |  |         assert len(model_data["sqs"]["Queue"].instances) == 1  # type: ignore[attr-defined] | 
					
						
							| 
									
										
										
										
											2023-02-22 10:21:45 -01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-07 12:03:33 +00:00
										 |  |  | @mock_aws | 
					
						
							| 
									
										
										
										
											2023-02-22 10:21:45 -01:00
										 |  |  | class TestModelDataResetForClassDecorator(TestCase): | 
					
						
							| 
									
										
										
										
											2023-12-14 20:35:36 -01:00
										 |  |  |     def setUp(self) -> None: | 
					
						
							| 
									
										
										
										
											2023-02-22 10:21:45 -01:00
										 |  |  |         if settings.TEST_SERVER_MODE: | 
					
						
							|  |  |  |             raise SkipTest("We're only interested in the decorator performance here") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # No data is present at the beginning | 
					
						
							|  |  |  |         for classes_per_service in model_data.values(): | 
					
						
							|  |  |  |             for _class in classes_per_service.values(): | 
					
						
							| 
									
										
										
										
											2023-12-14 20:35:36 -01:00
										 |  |  |                 assert _class.instances == []  # type: ignore[attr-defined] | 
					
						
							| 
									
										
										
										
											2023-02-22 10:21:45 -01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         conn = boto3.client("sqs", region_name="us-west-1") | 
					
						
							|  |  |  |         conn.create_queue(QueueName="queue1") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-14 20:35:36 -01:00
										 |  |  |     def test_should_find_bucket(self) -> None: | 
					
						
							|  |  |  |         assert len(model_data["sqs"]["Queue"].instances) == 1  # type: ignore[attr-defined] |