diff --git a/pyproject.toml b/pyproject.toml index 7931423..c2789d0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,7 +32,7 @@ dependencies = [ "dnspython==2.6.1", "pydantic==2.8.2", "aws-lambda-powertools[parser]==3.2.0", - "open-mpic-core==3.0.2", + "open-mpic-core==3.1.0", ] [project.optional-dependencies] @@ -123,8 +123,6 @@ markers = [ addopts = [ "--import-mode=prepend", # explicit default, as the tests rely on it for proper import resolution ] -spec_header_format = "Spec for {test_case} ({path}):" -spec_test_format = "{result} {docstring_summary}" # defaults to {name} if docstring is not present in test [tool.coverage.run] source = [ diff --git a/src/aws_lambda_mpic/__about__.py b/src/aws_lambda_mpic/__about__.py index 260c070..f9aa3e1 100644 --- a/src/aws_lambda_mpic/__about__.py +++ b/src/aws_lambda_mpic/__about__.py @@ -1 +1 @@ -__version__ = "0.3.1" +__version__ = "0.3.2" diff --git a/src/aws_lambda_mpic/mpic_coordinator_lambda/mpic_coordinator_lambda_function.py b/src/aws_lambda_mpic/mpic_coordinator_lambda/mpic_coordinator_lambda_function.py index 892a644..df87a6a 100644 --- a/src/aws_lambda_mpic/mpic_coordinator_lambda/mpic_coordinator_lambda_function.py +++ b/src/aws_lambda_mpic/mpic_coordinator_lambda/mpic_coordinator_lambda_function.py @@ -66,7 +66,7 @@ def load_aws_region_config() -> dict[str, RemotePerspective]: Reads in the available perspectives from a configuration yaml and returns them as a dict (map). :return: dict of available perspectives with region code as key """ - with resources.open_text('resources', 'aws_region_config.yaml') as file: + with resources.files('resources').joinpath('aws_region_config.yaml').open('r') as file: aws_region_config_yaml = yaml.safe_load(file) aws_region_type_adapter = TypeAdapter(list[RemotePerspective]) aws_regions_list = aws_region_type_adapter.validate_python(aws_region_config_yaml['aws_available_regions']) diff --git a/tests/unit/aws_lambda_mpic/test_caa_checker_lambda.py b/tests/unit/aws_lambda_mpic/test_caa_checker_lambda.py index 9a187e4..1c44a3b 100644 --- a/tests/unit/aws_lambda_mpic/test_caa_checker_lambda.py +++ b/tests/unit/aws_lambda_mpic/test_caa_checker_lambda.py @@ -4,7 +4,7 @@ import aws_lambda_mpic.mpic_caa_checker_lambda.mpic_caa_checker_lambda_function as mpic_caa_checker_lambda_function from open_mpic_core.common_domain.check_response import CaaCheckResponse, CaaCheckResponseDetails -from unit.test_util.valid_check_creator import ValidCheckCreator +from open_mpic_core_test.test_util.valid_check_creator import ValidCheckCreator class TestCaaCheckerLambda: @@ -12,7 +12,6 @@ class TestCaaCheckerLambda: @pytest.fixture(scope='class') def set_env_variables(): envvars = { - 'rir_region': 'arin', 'AWS_REGION': 'us-east-1', 'default_caa_domains': 'ca1.com|ca2.org|ca3.net' } diff --git a/tests/unit/aws_lambda_mpic/test_dcv_checker_lambda.py b/tests/unit/aws_lambda_mpic/test_dcv_checker_lambda.py index 1709681..fa8e944 100644 --- a/tests/unit/aws_lambda_mpic/test_dcv_checker_lambda.py +++ b/tests/unit/aws_lambda_mpic/test_dcv_checker_lambda.py @@ -3,10 +3,10 @@ import aws_lambda_mpic.mpic_dcv_checker_lambda.mpic_dcv_checker_lambda_function as mpic_dcv_checker_lambda_function from open_mpic_core.common_domain.validation_error import MpicValidationError -from unit.test_util.valid_check_creator import ValidCheckCreator from open_mpic_core.common_domain.check_response_details import DcvHttpCheckResponseDetails from open_mpic_core.common_domain.enum.dcv_validation_method import DcvValidationMethod from open_mpic_core.common_domain.check_response import DcvCheckResponse +from open_mpic_core_test.test_util.valid_check_creator import ValidCheckCreator class TestDcvCheckerLambda: @@ -14,9 +14,7 @@ class TestDcvCheckerLambda: @pytest.fixture(scope='class') def set_env_variables(): envvars = { - 'rir_region': 'arin', 'AWS_REGION': 'us-east-1', - 'default_caa_domains': 'ca1.com|ca2.org|ca3.net' } with pytest.MonkeyPatch.context() as class_scoped_monkeypatch: for k, v in envvars.items(): diff --git a/tests/unit/aws_lambda_mpic/test_mpic_coordinator_lambda.py b/tests/unit/aws_lambda_mpic/test_mpic_coordinator_lambda.py index 0cc0711..47d9408 100644 --- a/tests/unit/aws_lambda_mpic/test_mpic_coordinator_lambda.py +++ b/tests/unit/aws_lambda_mpic/test_mpic_coordinator_lambda.py @@ -22,8 +22,8 @@ import aws_lambda_mpic.mpic_coordinator_lambda.mpic_coordinator_lambda_function as mpic_coordinator_lambda_function from aws_lambda_mpic.mpic_coordinator_lambda.mpic_coordinator_lambda_function import PerspectiveEndpoints, PerspectiveEndpointInfo -from unit.test_util.valid_check_creator import ValidCheckCreator -from unit.test_util.valid_mpic_request_creator import ValidMpicRequestCreator +from open_mpic_core_test.test_util.valid_mpic_request_creator import ValidMpicRequestCreator +from open_mpic_core_test.test_util.valid_check_creator import ValidCheckCreator # noinspection PyMethodMayBeStatic @@ -63,7 +63,7 @@ def call_remote_perspective__should_make_aws_lambda_call_with_provided_arguments CheckType.DCV, dcv_check_request) assert check_response.check_passed is True - # hijacking the value of 'perspective' to verify that the right arguments got passed to the call + # hijacking the value of 'perspective_code' to verify that the right arguments got passed to the call assert check_response.perspective_code == dcv_check_request.domain_or_ip_target def lambda_handler__should_return_400_error_and_details_given_invalid_request_body(self): @@ -148,7 +148,7 @@ def constructor__should_initialize_mpic_coordinator_and_set_target_perspectives( # noinspection PyUnusedLocal def create_successful_boto3_api_call_response_for_dcv_check(self, lambda_method, lambda_configuration): check_request = DcvCheckRequest.model_validate_json(lambda_configuration['Payload']) - # hijacking the value of 'perspective' to verify that the right arguments got passed to the call + # hijacking the value of 'perspective_code' to verify that the right arguments got passed to the call expected_response_body = DcvCheckResponse(perspective_code=check_request.domain_or_ip_target, check_passed=True, details=DcvDnsCheckResponseDetails(validation_method=DcvValidationMethod.ACME_DNS_01)) expected_response = {'statusCode': 200, 'body': expected_response_body.model_dump_json()} @@ -198,10 +198,11 @@ def create_api_gateway_request(): @staticmethod def get_perspectives_by_code_dict_from_file() -> dict[str, RemotePerspective]: - perspectives_yaml = yaml.safe_load(resources.open_text('resources', 'aws_region_config.yaml')) - perspective_type_adapter = TypeAdapter(list[RemotePerspective]) - perspectives = perspective_type_adapter.validate_python(perspectives_yaml['aws_available_regions']) - return {perspective.code: perspective for perspective in perspectives} + with resources.files('resources').joinpath('aws_region_config.yaml').open('r') as file: + perspectives_yaml = yaml.safe_load(file) + perspective_type_adapter = TypeAdapter(list[RemotePerspective]) + perspectives = perspective_type_adapter.validate_python(perspectives_yaml['aws_available_regions']) + return {perspective.code: perspective for perspective in perspectives} if __name__ == '__main__': diff --git a/tests/unit/test_util/mock_dns_object_creator.py b/tests/unit/test_util/mock_dns_object_creator.py deleted file mode 100644 index e87935e..0000000 --- a/tests/unit/test_util/mock_dns_object_creator.py +++ /dev/null @@ -1,64 +0,0 @@ -import dns -from dns.flags import Flag -from dns.rdtypes.ANY.CAA import CAA -from dns.rdtypes.ANY.CNAME import CNAME -from dns.rdtypes.ANY.TXT import TXT -from dns.rrset import RRset - -from open_mpic_core.common_domain.enum.dns_record_type import DnsRecordType - - -class MockDnsObjectCreator: - @staticmethod - def create_caa_rrset(*caa_records: CAA): - test_rrset = RRset(name=dns.name.from_text('example.com'), rdclass=dns.rdataclass.IN, rdtype=dns.rdatatype.CAA) - for caa_record in caa_records: - test_rrset.add(caa_record) - return test_rrset - - @staticmethod - def create_caa_record(flags, tag, value): - return MockDnsObjectCreator.create_record_by_type(DnsRecordType.CAA, {'flag': flags, 'tag': tag, 'value': value}) - - @staticmethod - def create_record_by_type(record_type, record_data): - value = record_data['value'] - match record_type: - case DnsRecordType.CNAME: - return CNAME(dns.rdataclass.IN, dns.rdatatype.CNAME, target=value) - case DnsRecordType.TXT: - return TXT(dns.rdataclass.IN, dns.rdatatype.TXT, strings=[value.encode('utf-8')]) - case DnsRecordType.CAA: - flags = record_data['flag'] - tag = record_data['tag'] - return CAA(dns.rdataclass.IN, dns.rdatatype.CAA, flags=flags, tag=tag.encode('utf-8'), value=value.encode('utf-8')) - - @staticmethod - def create_caa_query_answer(record_name, flags, tag, value, mocker): - return MockDnsObjectCreator.create_dns_query_answer(record_name, '', DnsRecordType.CAA, - {'flag': flags, 'tag': tag, 'value': value}, mocker) - - @staticmethod - def create_dns_query_answer(record_name, record_name_prefix, record_type, record_data, mocker): - dns_record = None - match record_type: - case DnsRecordType.CNAME: - dns_record = MockDnsObjectCreator.create_record_by_type(DnsRecordType.CNAME, record_data) - case DnsRecordType.TXT: - dns_record = MockDnsObjectCreator.create_record_by_type(DnsRecordType.TXT, record_data) - case DnsRecordType.CAA: - dns_record = MockDnsObjectCreator.create_record_by_type(DnsRecordType.CAA, record_data) - good_response = dns.message.QueryMessage() - good_response.flags = Flag.QR | Flag.RD | Flag.RA - if (record_name_prefix is not None) and (record_name_prefix != ''): # if there is a domain name prefix - dns_record_name = dns.name.from_text(f"{record_name_prefix}.{record_name}") # domain name prefix + domain name - else: - dns_record_name = dns.name.from_text(record_name) - dns_record_type = dns.rdatatype.from_text(record_type) - response_question_rrset = RRset(name=dns_record_name, rdclass=dns.rdataclass.IN, rdtype=dns_record_type) - good_response.question = [response_question_rrset] - response_answer_rrset = RRset(name=dns_record_name, rdclass=dns.rdataclass.IN, rdtype=dns_record_type) - response_answer_rrset.add(dns_record) - good_response.answer = [response_answer_rrset] # caa checker doesn't look here, but dcv checker does - mocker.patch('dns.message.Message.find_rrset', return_value=response_answer_rrset) # needed for Answer constructor to work - return dns.resolver.Answer(qname=dns_record_name, rdtype=dns_record_type, rdclass=dns.rdataclass.IN, response=good_response) diff --git a/tests/unit/test_util/valid_check_creator.py b/tests/unit/test_util/valid_check_creator.py deleted file mode 100644 index cbf03cd..0000000 --- a/tests/unit/test_util/valid_check_creator.py +++ /dev/null @@ -1,33 +0,0 @@ -from open_mpic_core.common_domain.check_parameters import DcvCheckParameters, DcvWebsiteChangeValidationDetails, \ - DcvDnsChangeValidationDetails, CaaCheckParameters -from open_mpic_core.common_domain.check_request import DcvCheckRequest, CaaCheckRequest -from open_mpic_core.common_domain.enum.certificate_type import CertificateType -from open_mpic_core.common_domain.enum.dns_record_type import DnsRecordType - - -class ValidCheckCreator: - @staticmethod - def create_valid_caa_check_request(): - return CaaCheckRequest(domain_or_ip_target='example.com', - caa_check_parameters=CaaCheckParameters( - certificate_type=CertificateType.TLS_SERVER, caa_domains=['ca1.com'] - )) - - @staticmethod - def create_valid_http_check_request(): - return DcvCheckRequest(domain_or_ip_target='example.com', - dcv_check_parameters=DcvCheckParameters( - validation_details=DcvWebsiteChangeValidationDetails( - http_token_path='/.well-known/pki_validation/token111_ca1.txt', - challenge_value='challenge_111') - )) - - @staticmethod - def create_valid_dns_check_request(record_type=DnsRecordType.TXT): - return DcvCheckRequest(domain_or_ip_target='example.com', - dcv_check_parameters=DcvCheckParameters( - validation_details=DcvDnsChangeValidationDetails( - dns_name_prefix='_dnsauth', - dns_record_type=record_type, - challenge_value=f"{record_type}_challenge_111.ca1.com.") - )) \ No newline at end of file diff --git a/tests/unit/test_util/valid_mpic_request_creator.py b/tests/unit/test_util/valid_mpic_request_creator.py deleted file mode 100644 index 06d16ae..0000000 --- a/tests/unit/test_util/valid_mpic_request_creator.py +++ /dev/null @@ -1,51 +0,0 @@ -from open_mpic_core.common_domain.check_parameters import CaaCheckParameters, DcvCheckParameters, \ - DcvDnsChangeValidationDetails, DcvWebsiteChangeValidationDetails -from open_mpic_core.common_domain.enum.certificate_type import CertificateType -from open_mpic_core.common_domain.enum.dcv_validation_method import DcvValidationMethod -from open_mpic_core.common_domain.enum.dns_record_type import DnsRecordType -from open_mpic_core.mpic_coordinator.domain.mpic_request import BaseMpicRequest -from open_mpic_core.common_domain.enum.check_type import CheckType -from open_mpic_core.mpic_coordinator.domain.mpic_request import MpicCaaRequest -from open_mpic_core.mpic_coordinator.domain.mpic_request import MpicDcvRequest -from open_mpic_core.mpic_coordinator.domain.mpic_orchestration_parameters import MpicRequestOrchestrationParameters - - -class ValidMpicRequestCreator: - @staticmethod - def create_valid_caa_mpic_request() -> MpicCaaRequest: - return MpicCaaRequest( - domain_or_ip_target='test', - orchestration_parameters=MpicRequestOrchestrationParameters(perspective_count=6, quorum_count=4), - caa_check_parameters=CaaCheckParameters(certificate_type=CertificateType.TLS_SERVER) - ) - - @staticmethod - def create_valid_dcv_mpic_request(validation_method=DcvValidationMethod.DNS_CHANGE) -> MpicDcvRequest: - return MpicDcvRequest( - domain_or_ip_target='test', - orchestration_parameters=MpicRequestOrchestrationParameters(perspective_count=6, quorum_count=4), - dcv_check_parameters=DcvCheckParameters( - validation_details=ValidMpicRequestCreator.create_validation_details(validation_method) - ) - ) - - - @staticmethod - def create_valid_mpic_request(check_type: CheckType) -> BaseMpicRequest: - match check_type: - case CheckType.CAA: - return ValidMpicRequestCreator.create_valid_caa_mpic_request() - case CheckType.DCV: - return ValidMpicRequestCreator.create_valid_dcv_mpic_request() - case CheckType.DCV_WITH_CAA: - return ValidMpicRequestCreator.create_valid_dcv_with_caa_mpic_request() - - @classmethod - def create_validation_details(cls, validation_method): - validation_details = {} - match validation_method: - case DcvValidationMethod.DNS_CHANGE: - validation_details = DcvDnsChangeValidationDetails(dns_name_prefix='test', dns_record_type=DnsRecordType.A, challenge_value='test') - case DcvValidationMethod.WEBSITE_CHANGE_V2: - validation_details = DcvWebsiteChangeValidationDetails(http_token_path='http://example.com', challenge_value='test') # noqa E501 (http) - return validation_details