use postgrest::Postgrest; use std::error::Error; const REST_URL: &str = "http://localhost:3000"; #[tokio::test] async fn basic_data() -> Result<(), Box> { let client = Postgrest::new(REST_URL); let resp = client .from("users") .select("username") .eq("status", "OFFLINE") .execute() .await?; let body = resp.text().await?; let body = json::parse(&body)?; assert_eq!(body[0]["username"], "kiwicopple"); Ok(()) } #[tokio::test] async fn special_characters_eq() -> Result<(), Box> { let client = Postgrest::new(REST_URL); let resp = client .from("users") .select("username") .eq("username", "ihave.special,c:haracter(s)") .execute() .await?; let body = resp.text().await?; let body = json::parse(&body)?; assert_eq!(body[0]["username"], "ihave.special,c:haracter(s)"); Ok(()) } #[tokio::test] async fn special_characters_neq() -> Result<(), Box> { let client = Postgrest::new(REST_URL); let resp = client .from("users") .select("username") .neq("username", "ihave.special,c:haracter(s)") .and("catchphrase.eq.fat bat") .execute() .await?; let body = resp.text().await?; let body = json::parse(&body)?; assert!(body.is_empty()); Ok(()) } #[tokio::test] async fn relational_join() -> Result<(), Box> { let client = Postgrest::new(REST_URL); let resp = client .from("channels") .select("slug, messages(message)") .eq("slug", "public") .execute() .await?; let body = resp.text().await?; let body = json::parse(&body)?; assert_eq!(body[0]["messages"][0]["message"], "Hello World 👋"); assert_eq!(body[0]["slug"], "public"); Ok(()) } #[tokio::test] async fn insert() -> Result<(), Box> { let client = Postgrest::new(REST_URL); let resp = client .from("messages") .insert(r#"[{"message": "Test message 0", "channel_id": 1, "username": "kiwicopple"}]"#) .execute() .await?; let status = resp.status(); assert_eq!(status.as_u16(), 201); Ok(()) } #[tokio::test] async fn upsert() -> Result<(), Box> { let client = Postgrest::new(REST_URL); let resp = client .from("users") .upsert( r#"[{"username": "dragarcia", "status": "OFFLINE"}, {"username": "supabot2", "status": "ONLINE"}]"#, ) .execute() .await?; let body = resp.text().await?; let body = json::parse(&body)?; assert_eq!(body[0]["username"], "dragarcia"); assert_eq!(body[1]["username"], "supabot2"); Ok(()) } #[tokio::test] async fn upsert_existing() -> Result<(), Box> { let client = Postgrest::new(REST_URL); let resp = client .from("users") .upsert(r#"{"username": "dragarcia", "status": "ONLINE"}"#) .on_conflict("username") .execute() .await?; let body = resp.text().await?; let body = json::parse(&body)?; assert_eq!(body[0]["username"], "dragarcia"); assert_eq!(body[0]["status"], "ONLINE"); Ok(()) } #[tokio::test] async fn upsert_nonexisting() -> Result<(), Box> { let client = Postgrest::new(REST_URL); let resp = client .from("users") .upsert(r#"{"username": "supabot3", "status": "ONLINE"}"#) .execute() .await?; let body = resp.text().await?; let body = json::parse(&body)?; assert_eq!(body[0]["username"], "supabot3"); assert_eq!(body[0]["status"], "ONLINE"); Ok(()) } #[tokio::test] async fn update() -> Result<(), Box> { let client = Postgrest::new(REST_URL); let resp = client .from("users") .eq("status", "ONLINE") .update(r#"{"status": "ONLINE"}"#) .execute() .await?; let status = resp.status(); let body = resp.text().await?; let body = json::parse(&body)?; assert_eq!(status.as_u16(), 200); assert_eq!(body[0]["status"], "ONLINE"); Ok(()) } #[tokio::test] async fn delete() -> Result<(), Box> { let client = Postgrest::new(REST_URL); let resp = client .from("messages") .neq("username", "supabot") .delete() .execute() .await?; let status = resp.status(); assert_eq!(status.as_u16(), 200); Ok(()) } #[tokio::test] async fn rpc() -> Result<(), Box> { let client = Postgrest::new(REST_URL); let resp = client .rpc("get_status", r#"{"name_param": "leroyjenkins"}"#) .execute() .await?; let body = resp.text().await?; let body = json::parse(&body)?; assert!(body.is_null()); Ok(()) }