Skip to main content

armature_testing/
test_container.rs

1// Test Container for Dependency Injection
2
3use armature_core::{Container, Provider};
4
5/// Test container with enhanced testing capabilities
6pub struct TestContainer {
7    container: Container,
8}
9
10impl TestContainer {
11    /// Create a new test container
12    pub fn new() -> Self {
13        Self {
14            container: Container::new(),
15        }
16    }
17
18    /// Register a provider
19    pub fn register<T: Provider + Clone + 'static>(&self, provider: T) {
20        self.container.register(provider);
21    }
22
23    /// Register a mock provider
24    pub fn register_mock<T: Provider + Clone + 'static>(&self, mock: T) {
25        self.container.register(mock);
26    }
27
28    /// Get a provider from the container.
29    ///
30    /// Delegates to the underlying `armature_core::Container`. Returns
31    /// `None` if no provider of type `T` was registered via `register`/
32    /// `register_mock`.
33    pub fn get<T: Provider + Clone + 'static>(&self) -> Option<T> {
34        self.container.get::<T>().ok().map(|arc| (*arc).clone())
35    }
36
37    /// Clear all providers
38    pub fn clear(&mut self) {
39        self.container = Container::new();
40    }
41
42    /// Get the underlying container
43    pub fn inner(&self) -> &Container {
44        &self.container
45    }
46}
47
48impl Default for TestContainer {
49    fn default() -> Self {
50        Self::new()
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57
58    #[test]
59    fn test_container_creation() {
60        let _container = TestContainer::new();
61    }
62
63    #[derive(Clone)]
64    struct Widget {
65        value: u32,
66    }
67
68    #[test]
69    fn registered_provider_is_retrievable() {
70        let container = TestContainer::new();
71        container.register(Widget { value: 5 });
72
73        let widget = container
74            .get::<Widget>()
75            .expect("Widget should be registered");
76        assert_eq!(widget.value, 5);
77    }
78
79    #[test]
80    fn mock_provider_is_retrievable() {
81        let container = TestContainer::new();
82        container.register_mock(Widget { value: 11 });
83
84        let widget = container
85            .get::<Widget>()
86            .expect("Widget mock should be registered");
87        assert_eq!(widget.value, 11);
88    }
89
90    #[test]
91    fn unregistered_provider_returns_none() {
92        let container = TestContainer::new();
93        assert!(container.get::<Widget>().is_none());
94    }
95
96    #[test]
97    fn clear_removes_previously_registered_providers() {
98        let mut container = TestContainer::new();
99        container.register(Widget { value: 1 });
100        assert!(container.get::<Widget>().is_some());
101
102        container.clear();
103        assert!(container.get::<Widget>().is_none());
104    }
105}