diff --git a/src/api/common.rs b/src/api/common.rs index a2a33d06..9976e93d 100644 --- a/src/api/common.rs +++ b/src/api/common.rs @@ -261,12 +261,12 @@ mod tests { } } - /// Fake resource for pagination testing + /// Fake resource for pagination testing. struct FakeResource { pub id: String, } - /// Fake query params for pagination testing + /// Fake query params for pagination testing. #[derive(Clone, Default, Serialize)] struct FakeQueryParams { pub marker: Option, diff --git a/src/revoke/backend.rs b/src/revoke/backend.rs index e7a21867..e289017b 100644 --- a/src/revoke/backend.rs +++ b/src/revoke/backend.rs @@ -16,7 +16,7 @@ use async_trait::async_trait; use crate::keystone::ServiceState; -use crate::revoke::RevokeProviderError; +use crate::revoke::{RevokeProviderError, types::*}; use crate::token::types::Token; pub mod error; @@ -28,6 +28,13 @@ pub mod sql; #[cfg_attr(test, mockall::automock)] #[async_trait] pub trait RevokeBackend: Send + Sync { + /// Create revocation event. + async fn create_revocation_event( + &self, + state: &ServiceState, + event: RevocationEventCreate, + ) -> Result; + /// Check token revocation. /// /// Check whether there are existing revocation records that invalidate the diff --git a/src/revoke/backend/sql.rs b/src/revoke/backend/sql.rs index 43b851ff..dd2273be 100644 --- a/src/revoke/backend/sql.rs +++ b/src/revoke/backend/sql.rs @@ -52,6 +52,15 @@ impl TryFrom for RevocationEvent { #[async_trait] impl RevokeBackend for SqlBackend { + /// Create revocation event. + async fn create_revocation_event( + &self, + state: &ServiceState, + event: RevocationEventCreate, + ) -> Result { + Ok(create::create(&state.db, event).await?) + } + /// Check the token for being revoked. /// /// List not expired revocation records that invalidate the token and diff --git a/src/revoke/mock.rs b/src/revoke/mock.rs index fb3abdfc..af1d1ebd 100644 --- a/src/revoke/mock.rs +++ b/src/revoke/mock.rs @@ -18,8 +18,7 @@ use mockall::mock; use crate::config::Config; use crate::plugin_manager::PluginManager; -use crate::revoke::RevokeApi; -use crate::revoke::error::RevokeProviderError; +use crate::revoke::{RevokeApi, RevokeProviderError, types::*}; use crate::token::types::Token; use crate::keystone::ServiceState; @@ -32,6 +31,12 @@ mock! { #[async_trait] impl RevokeApi for RevokeProvider { + async fn create_revocation_event( + &self, + state: &ServiceState, + event: RevocationEventCreate + ) -> Result; + async fn is_token_revoked( &self, state: &ServiceState, diff --git a/src/revoke/mod.rs b/src/revoke/mod.rs index a87fa4a0..53b18611 100644 --- a/src/revoke/mod.rs +++ b/src/revoke/mod.rs @@ -48,9 +48,9 @@ use crate::config::Config; use crate::keystone::ServiceState; use crate::plugin_manager::PluginManager; use crate::revoke::backend::{RevokeBackend, sql::SqlBackend}; -use crate::revoke::error::RevokeProviderError; use crate::token::types::Token; +pub use error::RevokeProviderError; #[cfg(test)] pub use mock::MockRevokeProvider; pub use types::*; @@ -85,6 +85,18 @@ impl RevokeProvider { #[async_trait] impl RevokeApi for RevokeProvider { + /// Create revocation event. + #[tracing::instrument(level = "info", skip(self, state))] + async fn create_revocation_event( + &self, + state: &ServiceState, + event: RevocationEventCreate, + ) -> Result { + self.backend_driver + .create_revocation_event(state, event) + .await + } + /// Check whether the token has been revoked or not. /// /// Checks revocation events matching the token parameters and return @@ -111,3 +123,47 @@ impl RevokeApi for RevokeProvider { self.backend_driver.revoke_token(state, token).await } } + +#[cfg(test)] +mod tests { + use sea_orm::DatabaseConnection; + use std::sync::Arc; + + use super::backend::MockRevokeBackend; + use super::*; + use crate::config::Config; + use crate::keystone::Service; + use crate::policy::MockPolicyFactory; + use crate::provider::Provider; + + fn get_state_mock() -> Arc { + Arc::new( + Service::new( + Config::default(), + DatabaseConnection::Disconnected, + Provider::mocked_builder().build().unwrap(), + MockPolicyFactory::default(), + ) + .unwrap(), + ) + } + + #[tokio::test] + async fn test_create_revocation_event() { + let state = get_state_mock(); + let mut backend = MockRevokeBackend::default(); + backend + .expect_create_revocation_event() + .returning(|_, _| Ok(RevocationEvent::default())); + let provider = RevokeProvider { + backend_driver: Arc::new(backend), + }; + + assert!( + provider + .create_revocation_event(&state, RevocationEventCreate::default()) + .await + .is_ok() + ); + } +} diff --git a/src/revoke/types/provider_api.rs b/src/revoke/types/provider_api.rs index 06fcdac9..8e5754e9 100644 --- a/src/revoke/types/provider_api.rs +++ b/src/revoke/types/provider_api.rs @@ -17,12 +17,19 @@ use async_trait::async_trait; use crate::keystone::ServiceState; -use crate::revoke::RevokeProviderError; +use crate::revoke::{RevokeProviderError, types::*}; use crate::token::types::Token; /// Revocation Provider interface. #[async_trait] pub trait RevokeApi: Send + Sync { + /// Create revocation event. + async fn create_revocation_event( + &self, + state: &ServiceState, + event: RevocationEventCreate, + ) -> Result; + /// Check whether the token has been revoked of not. /// /// Checks revocation events matching the token parameters and return