Source code for devices.tests.test_issuer.test_opcua_server_credential
"""Test suite for validating the OPC UA Server Credential functionality."""importipaddressfromtypingimportAnyimportpytestfromcryptography.x509importDNSName,IPAddress,SubjectAlternativeName,UniformResourceIdentifierfromdevices.issuerimportOpcUaServerCredentialIssuerfromdevices.modelsimportIssuedCredentialModel@pytest.mark.django_db
[docs]deftest_issue_opc_ua_server_credential(device_instance:dict[str,Any])->None:"""Test that issuing an OPC UA server credential works without mocks."""device=device_instance['device']issuer=OpcUaServerCredentialIssuer(device=device,domain=device.domain)common_name='Test OPC UA Server Credential'application_uri='urn:example:opc-ua:server'ipv4_addresses=[ipaddress.IPv4Address('192.168.1.100')]ipv6_addresses:list[ipaddress.IPv6Address]=[]domain_names=['opc-ua.example.com']validity_days=365issued_credential=issuer.issue_opc_ua_server_credential(common_name=common_name,application_uri=application_uri,ipv4_addresses=ipv4_addresses,ipv6_addresses=ipv6_addresses,domain_names=domain_names,validity_days=validity_days,)assertisinstance(issued_credential,IssuedCredentialModel),('The returned object should be an IssuedCredentialModel')assertissued_credential.common_name==common_name,'The common name should match the input'assertissued_credential.device==device,'The issued credential should belong to the correct device'assertissued_credential.domain==device.domain,'The issued credential should belong to the correct domain'assert(issued_credential.issued_credential_type==IssuedCredentialModel.IssuedCredentialType.APPLICATION_CREDENTIAL),'The issued_credential_type should be APPLICATION_CREDENTIAL'assertissued_credential.issued_credential_purpose==IssuedCredentialModel.IssuedCredentialPurpose.OPCUA_SERVER,('The issued_credential_purpose should be OPCUA_SERVER')db_credential=IssuedCredentialModel.objects.get(pk=issued_credential.pk)assertdb_credential==issued_credential,'The credential should be saved correctly in the database'certificate=issued_credential.credential.get_certificate()san_extension=certificate.extensions.get_extension_for_class(SubjectAlternativeName).valuesan_uris=san_extension.get_values_for_type(UniformResourceIdentifier)assertapplication_uriinsan_uris,f'The application URI {application_uri} should be present in the SAN'san_ipv4_addresses=san_extension.get_values_for_type(IPAddress)foripinipv4_addresses:assertipinsan_ipv4_addresses,f'IPv4 address {ip} should be included in the SAN'san_dns_names=san_extension.get_values_for_type(DNSName)fordomainindomain_names:assertdomaininsan_dns_names,f'Domain name {domain} should be included in the SAN'cert_chain=issued_credential.credential.get_certificate_chain()assertisinstance(cert_chain,list),'The certificate chain should be a list'assertlen(cert_chain)>0,'The certificate chain should not be empty'assertall(certisnotNoneforcertincert_chain),'All certificates in the chain should be valid'