@@ -469,6 +469,7 @@ mod tests {
469469
470470 use crate :: ops:: webauthn:: MakeCredentialRequest ;
471471 use crate :: ops:: webauthn:: RelyingPartyId ;
472+ use crate :: proto:: ctap2:: Ctap2PublicKeyCredentialType ;
472473
473474 use super :: * ;
474475
@@ -537,11 +538,102 @@ mod tests {
537538 serde_json:: to_string ( & v) . unwrap ( )
538539 }
539540
541+ fn test_request_from_json_required_field ( field : & str ) {
542+ let rpid = RelyingPartyId :: try_from ( "example.org" ) . unwrap ( ) ;
543+ let req_json = json_field_rm ( REQUEST_BASE_JSON , field) ;
544+
545+ let result = MakeCredentialRequest :: from_json ( & rpid, & req_json) ;
546+ assert ! ( matches!(
547+ result,
548+ Err ( MakeCredentialRequestParsingError :: EncodingError ( _) )
549+ ) ) ;
550+ }
551+
540552 #[ test]
541553 fn test_request_from_json_base ( ) {
542554 let rpid = RelyingPartyId :: try_from ( "example.org" ) . unwrap ( ) ;
543555 let req: MakeCredentialRequest =
544556 MakeCredentialRequest :: from_json ( & rpid, REQUEST_BASE_JSON ) . unwrap ( ) ;
545557 assert_eq ! ( req, request_base( ) ) ;
546558 }
559+
560+ #[ test]
561+ fn test_request_from_json_require_rp ( ) {
562+ test_request_from_json_required_field ( "rp" ) ;
563+ }
564+
565+ #[ test]
566+ fn test_request_from_json_require_user ( ) {
567+ test_request_from_json_required_field ( "user" ) ;
568+ }
569+
570+ #[ test]
571+ fn test_request_from_json_require_pub_key_cred_params ( ) {
572+ test_request_from_json_required_field ( "pubKeyCredParams" ) ;
573+ }
574+
575+ #[ test]
576+ fn test_request_from_json_require_challenge ( ) {
577+ test_request_from_json_required_field ( "challenge" ) ;
578+ }
579+
580+ #[ test]
581+ #[ ignore] // FIXME(#134): Add validation for challenges
582+ fn test_request_from_json_challenge_empty ( ) {
583+ let rpid = RelyingPartyId :: try_from ( "example.org" ) . unwrap ( ) ;
584+ let req_json: String = json_field_rm ( REQUEST_BASE_JSON , "challenge" ) ;
585+ let req_json = json_field_add ( & req_json, "challenge" , r#""""# ) ;
586+
587+ let result = MakeCredentialRequest :: from_json ( & rpid, & req_json) ;
588+ assert ! ( matches!(
589+ result,
590+ Err ( MakeCredentialRequestParsingError :: EncodingError ( _) )
591+ ) ) ;
592+ }
593+
594+ #[ test]
595+ fn test_request_from_json_prf_extension ( ) {
596+ let rpid = RelyingPartyId :: try_from ( "example.org" ) . unwrap ( ) ;
597+ let req_json = json_field_add (
598+ REQUEST_BASE_JSON ,
599+ "extensions" ,
600+ r#"{"prf": {"eval": {"first": "second"}}}"# ,
601+ ) ;
602+
603+ let req: MakeCredentialRequest =
604+ MakeCredentialRequest :: from_json ( & rpid, & req_json) . unwrap ( ) ;
605+ assert ! ( matches!(
606+ req. extensions,
607+ Some ( MakeCredentialsRequestExtensions { prf: Some ( _) , .. } )
608+ ) ) ;
609+ }
610+
611+ #[ test]
612+ fn test_request_from_json_unknown_pub_key_cred_params ( ) {
613+ let rpid = RelyingPartyId :: try_from ( "example.org" ) . unwrap ( ) ;
614+ let req_json = json_field_add (
615+ REQUEST_BASE_JSON ,
616+ "pubKeyCredParams" ,
617+ r#"[{"type": "something", "alg": -12345}]"# ,
618+ ) ;
619+ let req: MakeCredentialRequest =
620+ MakeCredentialRequest :: from_json ( & rpid, & req_json) . unwrap ( ) ;
621+ assert_eq ! (
622+ req. algorithms,
623+ vec![ Ctap2CredentialType {
624+ algorithm: Ctap2COSEAlgorithmIdentifier :: Unknown , // FIXME(#148): Passhtrough unknown algorithms
625+ public_key_type: Ctap2PublicKeyCredentialType :: Unknown ,
626+ } ]
627+ ) ;
628+ }
629+
630+ #[ test]
631+ fn test_request_from_json_default_timeout ( ) {
632+ let rpid = RelyingPartyId :: try_from ( "example.org" ) . unwrap ( ) ;
633+ let req_json = json_field_rm ( REQUEST_BASE_JSON , "timeout" ) ;
634+
635+ let req: MakeCredentialRequest =
636+ MakeCredentialRequest :: from_json ( & rpid, & req_json) . unwrap ( ) ;
637+ assert_eq ! ( req. timeout, DEFAULT_TIMEOUT ) ;
638+ }
547639}
0 commit comments