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}