"""Route53 Fargate test module.""" import boto3 import pytest from moto import mock_aws from moto.core import DEFAULT_ACCOUNT_ID from datetime import datetime from unittest.mock import patch import app as index import config @pytest.fixture() def mock_account_id(): """Return an AWS account id.""" return DEFAULT_ACCOUNT_ID @pytest.fixture() def mock_route53_zone_name(): """Return a Route53 zone name.""" return 'test-zone' @pytest.fixture() @mock_aws def mock_route53_client(mock_account_id): """Return a mock route53 client.""" credentials = index.assume_source_account_role(mock_account_id) client = boto3.client( 'route53', region_name='us-east-1', aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey'], aws_session_token=credentials['SessionToken'] ) return client @mock_aws def test_assume_source_account_role(mock_account_id): """Test assume_source_account_role function.""" aws_credentials = ['AccessKeyId', 'SecretAccessKey', 'SessionToken'] result = index.assume_source_account_role(mock_account_id) for credential in aws_credentials: assert result[credential] @mock_aws def test_fetch_zone_records(mock_route53_client, mock_account_id): """Test fetch_zone_records function.""" zone_name = 'test.com.' mock_route53_client.create_hosted_zone(Name=zone_name, CallerReference='test_call_ref') zones = index.fetch_zone_records(mock_account_id) assert any(zone['Name'] == zone_name.strip('.') for zone in zones) @mock_aws def test_convert_to_bind_format(): """Test convert_to_bind_format function.""" zone_data = [ { 'Name': 'test.com', 'Config': {'PrivateZone': False}, 'ResourceRecordSets': [ {'Name': 'test.com.', 'Type': 'SOA', 'TTL': 300}, {'Name': 'test.com.', 'Type': 'NS', 'TTL': 300, 'ResourceRecords': [{'Value': 'ns-1.awsdns.com.'}]}, {'Name': 'www.test.com.', 'Type': 'A', 'TTL': 300, 'ResourceRecords': [{'Value': '1.2.3.4'}]} ] } ] result = index.convert_to_bind_format(zone_data) assert 'SOA' not in result['test.com'] assert 'NS' not in result['test.com'] assert 'www.test.com.' in result['test.com'] @mock_aws def test_put_hosted_zone_data_to_s3(mock_route53_client, mock_route53_zone_name, mock_account_id): """Test put_hosted_zone_data_to_s3 function.""" s3 = boto3.client('s3') zone_data = { 'Name': mock_route53_zone_name, 'Config': {'PrivateZone': False}, 'ResourceRecordSets': [{'Name': 'www.test.com.', 'Type': 'A', 'TTL': 300, 'ResourceRecords': [{'Value': '1.2.3.4'}]}] } bind_data = index.convert_to_bind_format([zone_data]) s3.create_bucket(Bucket=config.BUCKET_NAME) with patch('app.datetime') as mock_datetime: mock_datetime.now.return_value = datetime(2023, 1, 1, 0, 0) index.put_hosted_zone_data_to_s3(s3, config.BUCKET_NAME, mock_route53_zone_name, bind_data[mock_route53_zone_name], mock_account_id) object_list = s3.list_objects_v2(Bucket=config.BUCKET_NAME) assert any(f'{mock_account_id}/{mock_route53_zone_name}/' in obj['Key'] for obj in object_list.get('Contents', []))