clickhouse_orm/
lib.rs

1mod query_builder;
2mod client;
3mod error;
4
5pub use query_builder::ClickHouseQueryBuilder;
6pub use client::{DeserializeError, ClickhouseClient, DatabaseError};
7pub use error::Error;
8
9#[cfg(test)]
10mod tests {
11    use sea_query::{Alias, Condition, Expr, Query};
12    use serde_json::Value;
13    use crate::client::ClickhouseClient;
14    use crate::error::Error;
15    use crate::query_builder::ClickHouseQueryBuilder;
16
17    #[test]
18    fn basic_select()  {
19        let query = Query::select()
20            .from(Alias::new("users"))
21            .column(Alias::new("name"))
22            .to_string(ClickHouseQueryBuilder);
23        assert_eq!("SELECT \"name\" FROM \"users\"", query);
24    }
25
26    #[test]
27    fn basic_select_count()  {
28        let query = Query::select()
29            .from(Alias::new("users"))
30            .expr_as(Expr::value(Expr::col(Alias::new("name")).count()), Alias::new("count"))
31            .to_string(ClickHouseQueryBuilder);
32        assert_eq!("SELECT COUNT(\"name\") AS \"count\" FROM \"users\"", query);
33    }
34
35    #[test]
36    fn select_with_eq() {
37        let query = Query::select()
38            .from(Alias::new("users"))
39            .column(Alias::new("name"))
40            .cond_where(Condition::all().add(Expr::col(Alias::new("name")).eq("serega")))
41            .to_string(ClickHouseQueryBuilder);
42        assert_eq!("SELECT \"name\" FROM \"users\" WHERE \"name\" = 'serega'", query);
43    }
44
45    #[tokio::test(flavor = "current_thread")]
46    async fn fetch_many() -> Result<(), Error> {
47        dotenv::dotenv().ok();
48        let client = ClickhouseClient::from_env()?;
49        let sql = Query::select()
50            .expr(Expr::asterisk())
51            .from(Alias::new("service_cycles"))
52            .limit(100)
53            .to_string(ClickHouseQueryBuilder);
54        let _ = client.fetch_many::<Value>(&sql).await?;
55        Ok(())
56    }
57    #[tokio::test(flavor = "current_thread")]
58    async fn fetch_one() -> Result<(), Error> {
59        dotenv::dotenv().ok();
60        let client = ClickhouseClient::from_env()?;
61        let sql = Query::select()
62            .expr(Expr::asterisk())
63            .from(Alias::new("service_cycles"))
64            .limit(1)
65            .to_string(ClickHouseQueryBuilder);
66        let _ = client.fetch_one::<Value>(&sql).await?;
67        Ok(())
68    }
69    #[tokio::test(flavor = "current_thread")]
70    async fn handle_database_error() -> Result<(), Error> {
71        dotenv::dotenv().ok();
72        let client = ClickhouseClient::from_env()?;
73        let sql = Query::select()
74            .expr(Expr::asterisk())
75            .from(Alias::new("service_cycles_exception"))
76            .limit(1)
77            .to_string(ClickHouseQueryBuilder);
78        let error = client.fetch_one::<Value>(&sql).await;
79        let is_database_error =  match error {
80            Err(Error::Database(_)) => true,
81            _ => false
82        };
83        assert!(is_database_error);
84        Ok(())
85    }
86    #[tokio::test(flavor = "current_thread")]
87    async fn handle_deserialize_error() -> Result<(), Error> {
88        dotenv::dotenv().ok();
89        let client = ClickhouseClient::from_env()?;
90        let sql = Query::select()
91            .expr(Expr::asterisk())
92            .from(Alias::new("service_cycles"))
93            .limit(1)
94            .to_string(ClickHouseQueryBuilder);
95        let error = client.fetch_one::<i32>(&sql).await;
96        let is_deserialize_error =  match error {
97            Err(Error::DeserializeError(error)) => {
98                println!("{}", error);
99                true
100            },
101            _ => false
102        };
103        assert!(is_deserialize_error);
104        Ok(())
105    }
106}