Source code for devices.tests.test_credential_download
"""Test cases for Remote Device Credential Download."""importdatetimeimportsecretsfromtypingimportAnyimportpytestfromdevices.modelsimportRemoteDeviceCredentialDownloadModel
[docs]deftest_otp_generation(mock_models:dict[str,Any])->None:"""Test that a valid OTP is generated on save."""remote_credential_download_model=mock_models['remote_credential_download']assertremote_credential_download_model.otp==''remote_credential_download_model.save()assertlen(remote_credential_download_model.otp)==len(secrets.token_urlsafe(8))
[docs]deftest_token_invalidation(mock_models:dict[str,Any])->None:"""Test that a download token is no longer valid after the token validity period."""rcd=mock_models['remote_credential_download']# no token present at initializationrcd.save()assertrcd.download_token==''assertrcd.check_otp(rcd.otp)assertrcd.download_token!=''assertrcd.check_token(rcd.download_token)rcd.token_created_at=rcd.token_created_at-rcd.TOKEN_VALIDITY-datetime.timedelta(minutes=1)assertnotrcd.check_token(rcd.download_token)# ensure model was deletedwithpytest.raises(RemoteDeviceCredentialDownloadModel.DoesNotExist):RemoteDeviceCredentialDownloadModel.objects.get(id=rcd.id)
[docs]deftest_otp_use_once(mock_models:dict[str,Any])->None:"""Test that an OTP can only be used once."""rcd=mock_models['remote_credential_download']rcd.save()otp=rcd.otpassertrcd.check_otp(otp)assertnotrcd.check_otp(otp)assertlen(rcd.otp)<2# noqa: PLR2004
[docs]deftest_otp_max_attempts(mock_models:dict[str,Any])->None:"""Test that the OTP is invalidated after too many incorrect attempts."""rcd=mock_models['remote_credential_download']rcd.save()valid_otp=rcd.otpfor_inrange(rcd.BROWSER_MAX_OTP_ATTEMPTS):assertnotrcd.check_otp('invalid_otp')assertnotrcd.check_otp(valid_otp)# ensure model was deletedwithpytest.raises(RemoteDeviceCredentialDownloadModel.DoesNotExist):RemoteDeviceCredentialDownloadModel.objects.get(id=rcd.id)