vanikam/src/identity/application/services/mark_user_verified/service.rs
Aravinth Manivannan 50bd3db7b3
Some checks failed
ci/woodpecker/pr/woodpecker Pipeline failed
ci/woodpecker/push/woodpecker Pipeline failed
fix: replace username with first and last name and use user_id UUID for primary keys
2024-07-14 21:00:20 +05:30

94 lines
2.8 KiB
Rust

// SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net>
//
// SPDX-License-Identifier: AGPL-3.0-or-later
use derive_builder::Builder;
use super::*;
use crate::identity::application::port::output::db::{
delete_verification_secret::*, verification_secret_exists::*,
};
#[derive(Builder)]
pub struct MarkUserVerifiedService {
db_verification_secret_exists_adapter: VerificationSecretExistsOutDBPortObj,
db_delete_verification_secret_adapter: DeleteVerificationSecretOutDBPortObj,
}
#[async_trait::async_trait]
impl MarkUserVerifiedUseCase for MarkUserVerifiedService {
async fn mark_user_verified(
&self,
cmd: command::MarkUserVerifiedCommand,
) -> IdentityResult<()> {
let msg = VerifySecretExistsMsgBuilder::default()
.user_id(cmd.user_id().clone())
.secret(cmd.secret().into())
.build()
.unwrap();
if !self
.db_verification_secret_exists_adapter
.verification_secret_exists(&msg)
.await
.unwrap()
{
return Err(IdentityError::VerificationOTPSecretNotFound);
}
self.db_delete_verification_secret_adapter
.delete_verification_secret(&msg.into())
.await
.unwrap();
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{tests::bdd::*, utils::uuid::tests::UUID};
#[actix_rt::test]
async fn test_service() {
let user_id = UUID;
let secret = "password";
let cmd = command::MarkUserVerifiedCommand::new(user_id.clone(), secret.into()).unwrap();
// happy case
{
let s = MarkUserVerifiedServiceBuilder::default()
.db_verification_secret_exists_adapter(mock_verification_secret_exists_db_port(
IS_CALLED_ONLY_ONCE,
RETURNS_TRUE,
))
.db_delete_verification_secret_adapter(mock_delete_verification_secret_db_port(
IS_CALLED_ONLY_ONCE,
))
.build()
.unwrap();
s.mark_user_verified(cmd.clone()).await.unwrap();
}
// error: secret doesn't exist
{
let s = MarkUserVerifiedServiceBuilder::default()
.db_verification_secret_exists_adapter(mock_verification_secret_exists_db_port(
IS_CALLED_ONLY_ONCE,
RETURNS_FALSE,
))
.db_delete_verification_secret_adapter(mock_delete_verification_secret_db_port(
IS_NEVER_CALLED,
))
.build()
.unwrap();
assert_eq!(
s.mark_user_verified(cmd.clone()).await.err(),
Some(IdentityError::VerificationOTPSecretNotFound)
);
}
}
}