diff options
Diffstat (limited to 'src/test_utils.rs')
| -rw-r--r-- | src/test_utils.rs | 172 | 
1 files changed, 162 insertions, 10 deletions
| diff --git a/src/test_utils.rs b/src/test_utils.rs index 1fc7015..650e338 100644 --- a/src/test_utils.rs +++ b/src/test_utils.rs @@ -7,9 +7,9 @@ pub mod subjects      use syrette_macros::declare_interface; +    use crate::di_container::blocking::IDIContainer;      use crate::interfaces::injectable::Injectable;      use crate::ptr::TransientPtr; -    use crate::DIContainer;      pub trait IUserManager      { @@ -45,10 +45,12 @@ pub mod subjects      declare_interface!(UserManager -> IUserManager); -    impl Injectable for UserManager +    impl<DIContainerType> Injectable<DIContainerType> for UserManager +    where +        DIContainerType: IDIContainer,      {          fn resolve( -            _di_container: &Rc<DIContainer>, +            _di_container: &Rc<DIContainerType>,              _dependency_history: Vec<&'static str>,          ) -> Result<TransientPtr<Self>, crate::errors::injectable::InjectableError>          where @@ -109,10 +111,12 @@ pub mod subjects      declare_interface!(Number -> INumber); -    impl Injectable for Number +    impl<DIContainerType> Injectable<DIContainerType> for Number +    where +        DIContainerType: IDIContainer,      {          fn resolve( -            _di_container: &Rc<DIContainer>, +            _di_container: &Rc<DIContainerType>,              _dependency_history: Vec<&'static str>,          ) -> Result<TransientPtr<Self>, crate::errors::injectable::InjectableError>          where @@ -134,9 +138,9 @@ pub mod subjects_async      use async_trait::async_trait;      use syrette_macros::declare_interface; +    use crate::di_container::asynchronous::IAsyncDIContainer;      use crate::interfaces::async_injectable::AsyncInjectable;      use crate::ptr::TransientPtr; -    use crate::AsyncDIContainer;      pub trait IUserManager: Send + Sync      { @@ -173,10 +177,12 @@ pub mod subjects_async      declare_interface!(UserManager -> IUserManager);      #[async_trait] -    impl AsyncInjectable for UserManager +    impl<DIContainerType> AsyncInjectable<DIContainerType> for UserManager +    where +        DIContainerType: IAsyncDIContainer,      {          async fn resolve( -            _: &Arc<AsyncDIContainer>, +            _: &Arc<DIContainerType>,              _dependency_history: Vec<&'static str>,          ) -> Result<TransientPtr<Self>, crate::errors::injectable::InjectableError>          where @@ -238,10 +244,12 @@ pub mod subjects_async      declare_interface!(Number -> INumber, async = true);      #[async_trait] -    impl AsyncInjectable for Number +    impl<DIContainerType> AsyncInjectable<DIContainerType> for Number +    where +        DIContainerType: IAsyncDIContainer,      {          async fn resolve( -            _: &Arc<AsyncDIContainer>, +            _: &Arc<DIContainerType>,              _dependency_history: Vec<&'static str>,          ) -> Result<TransientPtr<Self>, crate::errors::injectable::InjectableError>          where @@ -251,3 +259,147 @@ pub mod subjects_async          }      }  } + +pub mod mocks +{ +    #![allow(clippy::ref_option_ref)] // Caused by Mockall +    #![allow(dead_code)] // Not all mock functions may be used + +    use mockall::mock; + +    pub mod blocking_di_container +    { +        use std::rc::Rc; + +        use super::*; +        use crate::di_container::blocking::binding::builder::BindingBuilder; +        use crate::di_container::blocking::details::DIContainerInternals; +        use crate::di_container::blocking::IDIContainer; +        use crate::errors::di_container::DIContainerError; +        use crate::provider::blocking::IProvider; +        use crate::ptr::SomePtr; + +        mock! { +            pub DIContainer {} + +            impl IDIContainer for DIContainer { +                fn bind<Interface>(self: &mut Rc<Self>) -> BindingBuilder<Interface, Self> +                where +                    Interface: 'static + ?Sized; + +                fn get<Interface>(self: &Rc<Self>) -> Result<SomePtr<Interface>, DIContainerError> +                where +                    Interface: 'static + ?Sized; + +                fn get_named<Interface>( +                    self: &Rc<Self>, +                    name: &'static str, +                ) -> Result<SomePtr<Interface>, DIContainerError> +                where +                    Interface: 'static + ?Sized; + +                #[doc(hidden)] +                fn get_bound<Interface>( +                    self: &Rc<Self>, +                    dependency_history: Vec<&'static str>, +                    name: Option<&'static str>, +                ) -> Result<SomePtr<Interface>, DIContainerError> +                where +                    Interface: 'static + ?Sized; +            } + +            impl DIContainerInternals for DIContainer +            { +                fn has_binding<Interface>(self: &Rc<Self>, name: Option<&'static str>) -> bool +                where +                    Interface: ?Sized + 'static; + +                #[doc(hidden)] +                fn set_binding<Interface>( +                    self: &Rc<Self>, +                    name: Option<&'static str>, +                    provider: Box<dyn IProvider<Self>>, +                ) where +                    Interface: 'static + ?Sized; + +                fn remove_binding<Interface>( +                    self: &Rc<Self>, +                    name: Option<&'static str>, +                ) -> Option<Box<dyn IProvider<Self>>> +                where +                    Interface: 'static + ?Sized; +            } +        } +    } + +    #[cfg(feature = "async")] +    pub mod async_di_container +    { +        use std::sync::Arc; + +        use super::*; +        use crate::di_container::asynchronous::binding::builder::AsyncBindingBuilder; +        use crate::di_container::asynchronous::details::DIContainerInternals; +        use crate::di_container::asynchronous::IAsyncDIContainer; +        use crate::errors::async_di_container::AsyncDIContainerError; +        use crate::provider::r#async::IAsyncProvider; +        use crate::ptr::SomeThreadsafePtr; + +        mock! { +            pub AsyncDIContainer {} + +            #[async_trait::async_trait] +            impl IAsyncDIContainer for AsyncDIContainer { +                fn bind<Interface>(self: &mut Arc<Self>) -> AsyncBindingBuilder<Interface, Self> +                where +                    Interface: 'static + ?Sized + Send + Sync; + +                async fn get<Interface>( +                    self: &Arc<Self>, +                ) -> Result<SomeThreadsafePtr<Interface>, AsyncDIContainerError> +                where +                    Interface: 'static + ?Sized + Send + Sync; + +                async fn get_named<Interface>( +                    self: &Arc<Self>, +                    name: &'static str, +                ) -> Result<SomeThreadsafePtr<Interface>, AsyncDIContainerError> +                where +                    Interface: 'static + ?Sized + Send + Sync; + +                #[doc(hidden)] +                async fn get_bound<Interface>( +                    self: &Arc<Self>, +                    dependency_history: Vec<&'static str>, +                    name: Option<&'static str>, +                ) -> Result<SomeThreadsafePtr<Interface>, AsyncDIContainerError> +                where +                    Interface: 'static + ?Sized + Send + Sync; +            } + +            #[async_trait::async_trait] +            impl DIContainerInternals for AsyncDIContainer { +                async fn has_binding<Interface>( +                    self: &Arc<Self>, +                    name: Option<&'static str>, +                ) -> bool +                where +                    Interface: ?Sized + 'static; + +                async fn set_binding<Interface>( +                    self: &Arc<Self>, +                    name: Option<&'static str>, +                    provider: Box<dyn IAsyncProvider<Self>>, +                ) where +                    Interface: 'static + ?Sized; + +                async fn remove_binding<Interface>( +                    self: &Arc<Self>, +                    name: Option<&'static str>, +                ) -> Option<Box<dyn IAsyncProvider<Self>>> +                where +                    Interface: 'static + ?Sized; +            } +        } +    } +} | 
