operation::{ admin_create_user::AdminCreateUserOutput, admin_set_user_password::AdminSetUserPasswordOutput, list_users::ListUsersOutput, }, types::{AttributeType, UserType}, }; use aws_sdk_dynamodb::{ Client as DynamodbClient, operation::{ delete_item::DeleteItemOutput, put_item::PutItemOutput, }, primitives::DateTime, types::AttributeValue, }; use aws_smithy_mocks::{mock, mock_client, RuleMode}; use std::collections::HashMap; use std::time::SystemTime; #[tokio::test] async fn finish_registration_of_legitimate_new_user() { // Cognito の挙動をモックする let list_users_empty = mock!(CognitoClient::list_users) .then_output(|| ListUsersOutput::builder().build()); let admin_create_user_ok = mock!(CognitoClient::admin_create_user) .then_output(|| AdminCreateUserOutput::builder() .user(UserType::builder() .attributes(AttributeType::builder() .name("sub") .value("dummy-sub-123") .build() .unwrap()) .build()) .build()); let admin_set_user_password_ok = mock!(CognitoClient::admin_set_user_password) .then_output(|| AdminSetUserPasswordOutput::builder().build()); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 // DynamoDB の挙動をモックする let delete_item_session = mock!(DynamodbClient::delete_item) .then_output(|| { let ttl = DateTime::from(SystemTime::now()).secs() + 300; DeleteItemOutput::builder() .attributes("ttl", AttributeValue::N(format!("{}", ttl))) .attributes("state", AttributeValue::S(OK_PASSKEY_REGISTRATION.to_string())) .attributes("userId", AttributeValue::S("8TZ_kg_dp_pr0t7SDvGJiw".to_string())) .attributes("userInfo", AttributeValue::M(HashMap::from([ ("username".to_string(), AttributeValue::S("test".to_string())), ("displayName".to_string(), AttributeValue::S("Test User".to_string())), ]))) .build() }); let put_item_ok = mock!(DynamodbClient::put_item) .then_output(|| PutItemOutput::builder().build()); // SharedState を初期化する let shared_state = SharedStateBuilder::default() .webauthn(ConstantWebauthn::new(OK_PASSKEY)) .cognito(cognito) .dynamodb(dynamodb) .build() .unwrap(); let shared_state = Arc::new(shared_state); // 関数を検証する let res = finish_registration( shared_state, FinishRegistrationSession { session_id: "dummy-session-id".to_string(), public_key_credential: serde_json::from_str( OK_REGISTER_PUBLIC_KEY_CREDENTIAL, ).unwrap(), }, ).await.unwrap(); assert_eq!(res.user_id, "8TZ_kg_dp_pr0t7SDvGJiw"); } 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78