diff --git a/moto/route53/responses.py b/moto/route53/responses.py index 077c89a2c..e831820e1 100644 --- a/moto/route53/responses.py +++ b/moto/route53/responses.py @@ -243,6 +243,15 @@ class Route53(BaseResponse): return 200, headers, template.render() + def get_change(self, request, full_url, headers): + self.setup_class(request, full_url, headers) + + if request.method == "GET": + parsed_url = urlparse(full_url) + change_id = parsed_url.path.rstrip("/").rsplit("/", 1)[1] + template = Template(GET_CHANGE_RESPONSE) + return 200, headers, template.render(change_id=change_id) + LIST_TAGS_FOR_RESOURCE_RESPONSE = """ @@ -382,3 +391,12 @@ LIST_HEALTH_CHECKS_RESPONSE = """ DELETE_HEALTH_CHECK_RESPONSE = """ """ + +GET_CHANGE_RESPONSE = """ + + + INSYNC + 2010-09-10T01:36:41.958Z + {{ change_id }} + +""" diff --git a/moto/route53/urls.py b/moto/route53/urls.py index c0fc93734..3bca32715 100644 --- a/moto/route53/urls.py +++ b/moto/route53/urls.py @@ -21,4 +21,5 @@ url_paths = { r"{0}/(?P[\d_-]+)/tags/healthcheck/(?P[^/]+)$": tag_response1, r"{0}/(?P[\d_-]+)/tags/hostedzone/(?P[^/]+)$": tag_response2, r"{0}/(?P[\d_-]+)/trafficpolicyinstances/*": Route53().not_implemented_response, + r"{0}/(?P[\d_-]+)/change/(?P[^/]+)$": Route53().get_change, } diff --git a/tests/test_route53/test_route53.py b/tests/test_route53/test_route53.py index dcc12904f..8ce5272ef 100644 --- a/tests/test_route53/test_route53.py +++ b/tests/test_route53/test_route53.py @@ -1031,3 +1031,14 @@ def test_list_resource_record_sets_name_type_filters(): len(returned_records).should.equal(len(all_records) - start_with) for desired_record in all_records[start_with:]: returned_records.should.contain(desired_record) + + +@mock_route53 +def test_get_change(): + conn = boto3.client("route53", region_name="us-east-2") + + change_id = "123456" + response = conn.get_change(Id=change_id) + + response["ChangeInfo"]["Id"].should.equal(change_id) + response["ChangeInfo"]["Status"].should.equal("INSYNC")