Skip to main content

dbctl_core/
lib.rs

1pub mod config;
2pub mod db;
3pub mod docker;
4pub mod error;
5pub mod output;
6pub mod utils;
7
8#[cfg(test)]
9mod tests {
10    use crate::db::{Database, Postgres};
11    use crate::docker::DockerEngine;
12
13    /*
14     * @Test the Postgres struct
15     * @checking the default values
16     * @checking the env vars
17     * @checking the connection url
18     */
19
20    #[test]
21    fn test_postgres_defaults() {
22        let pg = Postgres::default();
23        assert_eq!(pg.name(), "pg-default");
24        assert_eq!(pg.image(), "postgres:15");
25        assert_eq!(pg.port(), 5432);
26        assert_eq!(
27            pg.connection_url(),
28            "postgres://admin:secret@localhost:5432/mypg"
29        );
30    }
31
32    #[test]
33    fn test_postgres_env_vars() {
34        let pg = Postgres::default();
35
36        let env_vars = pg.env_vars();
37
38        assert!(env_vars.contains(&("POSTGRES_USER".into(), "admin".into())));
39        assert!(env_vars.contains(&("POSTGRES_PASSWORD".into(), "secret".into())));
40        assert!(env_vars.contains(&("POSTGRES_DB".into(), "mypg".into())));
41    }
42
43    /*
44     * @Docker Engine Test(Unit Test)
45     * @Checking if the docker engine is running
46     * @Creating a moke postgres database
47     */
48
49    #[derive(Clone)]
50    struct MockDatabase {
51        name: String,
52
53        image: String,
54        port: u16,
55    }
56
57    impl Database for MockDatabase {
58        fn name(&self) -> &str {
59            &self.name
60        }
61
62        fn image(&self) -> &str {
63            &self.image
64        }
65
66        fn port(&self) -> u16 {
67            self.port
68        }
69
70        fn env_vars(&self) -> Vec<(String, String)> {
71            let mut env_vars = Vec::new();
72            env_vars.push(("POSTGRES_PASSWORD".to_string(), "secret".to_string()));
73            env_vars
74        }
75
76        fn connection_url(&self) -> String {
77            format!("postgres://user:password@localhost:{}/dbname", self.port())
78        }
79
80        fn default() -> Self {
81            MockDatabase {
82                name: "default-db".to_string(),
83                image: "postgres:latest".to_string(),
84
85                port: 5432,
86            }
87        }
88    }
89
90    // @Test Docker Engine creation
91    #[tokio::test]
92    async fn test_docker_engine_creation() {
93        let engine = DockerEngine::new().await;
94        assert!(engine.docker.ping().await.is_ok()); // Check if Docker is reachable
95    }
96
97    // @Test starting a mock database container
98    #[tokio::test]
99    async fn test_start_container() {
100        let engine = DockerEngine::new().await;
101        let db = MockDatabase::default(); // Use default database setup
102        let result = engine.start_container(db).await;
103
104        assert!(result.is_ok());
105    }
106}