#![allow(clippy::needless_return)] mod common; use common::{get_pool, User}; use evento_query::{Cursor, PageInfo, PgQuery}; use tokio::sync::OnceCell; static SELECT_USERS: &str = "SELECT * FROM ev_user"; static ONCE: OnceCell> = OnceCell::const_new(); async fn get_users() -> &'static Vec { ONCE.get_or_init(|| async { let db = get_pool().await; sqlx::query_as::<_, User>("SELECT * FROM ev_user ORDER BY created_at ASC, age ASC, id ASC") .fetch_all(db) .await .unwrap() }) .await } #[tokio_shared_rt::test] async fn query_first() { let db = get_pool().await; let users = get_users().await; let query = PgQuery::::new(SELECT_USERS) .build(Default::default()) .fetch_all(db) .await .unwrap(); assert_eq!(query.edges.len(), 10); assert_eq!( query.page_info, PageInfo { has_next_page: false, end_cursor: Some(query.edges[9].cursor.to_owned()), ..Default::default() } ); assert_eq!(query.edges[0].node, users[0]); assert_eq!(query.edges[1].node, users[1]); assert_eq!(query.edges[2].node, users[2]); assert_eq!(query.edges[3].node, users[3]); assert_eq!(query.edges[4].node, users[4]); assert_eq!(query.edges[5].node, users[5]); assert_eq!(query.edges[6].node, users[6]); assert_eq!(query.edges[7].node, users[7]); assert_eq!(query.edges[8].node, users[8]); assert_eq!(query.edges[9].node, users[9]); } #[tokio_shared_rt::test] async fn query_first_3() { let db = get_pool().await; let users = get_users().await; let query = PgQuery::::new(SELECT_USERS) .forward(3, None) .fetch_all(db) .await .unwrap(); assert_eq!(query.edges.len(), 3); assert_eq!( query.page_info, PageInfo { has_next_page: true, end_cursor: Some(query.edges[2].cursor.to_owned()), ..Default::default() } ); assert_eq!(query.edges[0].node, users[0]); assert_eq!(query.edges[1].node, users[1]); assert_eq!(query.edges[2].node, users[2]); } #[tokio_shared_rt::test] async fn query_first_2_after_3() { let db = get_pool().await; let users = get_users().await; let query = PgQuery::::new(SELECT_USERS) .forward(2, Some(users[2].to_cursor())) .fetch_all(db) .await .unwrap(); assert_eq!(query.edges.len(), 2); assert_eq!( query.page_info, PageInfo { has_next_page: true, end_cursor: Some(query.edges[1].cursor.to_owned()), ..Default::default() } ); assert_eq!(query.edges[0].node, users[3]); assert_eq!(query.edges[1].node, users[4]); } #[tokio_shared_rt::test] async fn query_first_2_after_9() { let db = get_pool().await; let users = get_users().await; let query = PgQuery::::new(SELECT_USERS) .forward(2, Some(users[8].to_cursor())) .fetch_all(db) .await .unwrap(); assert_eq!(query.edges.len(), 1); assert_eq!( query.page_info, PageInfo { has_next_page: false, end_cursor: Some(query.edges[0].cursor.to_owned()), ..Default::default() } ); assert_eq!(query.edges[0].node, users[9]); } #[tokio_shared_rt::test] async fn query_first_3_after_5() { let db = get_pool().await; let users = get_users().await; let query = PgQuery::::new(SELECT_USERS) .forward(3, Some(users[4].to_cursor())) .fetch_all(db) .await .unwrap(); assert_eq!(query.edges.len(), 3); assert_eq!( query.page_info, PageInfo { has_next_page: true, end_cursor: Some(query.edges[2].cursor.to_owned()), ..Default::default() } ); assert_eq!(query.edges[0].node, users[5]); assert_eq!(query.edges[1].node, users[6]); assert_eq!(query.edges[2].node, users[7]); } #[tokio_shared_rt::test] async fn query_last() { let db = get_pool().await; let users = get_users().await; let query = PgQuery::::new(SELECT_USERS) .backward(20, None) .fetch_all(db) .await .unwrap(); assert_eq!(query.edges.len(), 10); assert_eq!( query.page_info, PageInfo { has_previous_page: false, start_cursor: Some(query.edges[0].cursor.to_owned()), ..Default::default() } ); assert_eq!(query.edges[0].node, users[0]); assert_eq!(query.edges[1].node, users[1]); assert_eq!(query.edges[2].node, users[2]); assert_eq!(query.edges[3].node, users[3]); assert_eq!(query.edges[4].node, users[4]); assert_eq!(query.edges[5].node, users[5]); assert_eq!(query.edges[6].node, users[6]); assert_eq!(query.edges[7].node, users[7]); assert_eq!(query.edges[8].node, users[8]); assert_eq!(query.edges[9].node, users[9]); } #[tokio_shared_rt::test] async fn query_last_3() { let db = get_pool().await; let users = get_users().await; let query = PgQuery::::new(SELECT_USERS) .backward(3, None) .fetch_all(db) .await .unwrap(); assert_eq!(query.edges.len(), 3); assert_eq!( query.page_info, PageInfo { has_previous_page: true, start_cursor: Some(query.edges[0].cursor.to_owned()), ..Default::default() } ); assert_eq!(query.edges[0].node, users[7]); assert_eq!(query.edges[1].node, users[8]); assert_eq!(query.edges[2].node, users[9]); } #[tokio_shared_rt::test] async fn query_last_2_before_4() { let db = get_pool().await; let users = get_users().await; let query = PgQuery::::new(SELECT_USERS) .backward(2, Some(users[3].to_cursor())) .fetch_all(db) .await .unwrap(); assert_eq!(query.edges.len(), 2); assert_eq!( query.page_info, PageInfo { has_previous_page: true, start_cursor: Some(query.edges[0].cursor.to_owned()), ..Default::default() } ); assert_eq!(query.edges[0].node, users[1]); assert_eq!(query.edges[1].node, users[2]); } #[tokio_shared_rt::test] async fn query_last_2_before_2() { let db = get_pool().await; let users = get_users().await; let query = PgQuery::::new(SELECT_USERS) .backward(2, Some(users[1].to_cursor())) .fetch_all(db) .await .unwrap(); assert_eq!(query.edges.len(), 1); assert_eq!( query.page_info, PageInfo { has_previous_page: false, start_cursor: Some(query.edges[0].cursor.to_owned()), ..Default::default() } ); assert_eq!(query.edges[0].node, users[0]); } #[tokio_shared_rt::test] async fn query_last_3_before_8() { let db = get_pool().await; let users = get_users().await; let query = PgQuery::::new(SELECT_USERS) .backward(3, Some(users[8].to_cursor())) .fetch_all(db) .await .unwrap(); assert_eq!(query.edges.len(), 3); assert_eq!( query.page_info, PageInfo { has_previous_page: true, start_cursor: Some(query.edges[0].cursor.to_owned()), ..Default::default() } ); assert_eq!(query.edges[0].node, users[5]); assert_eq!(query.edges[1].node, users[6]); assert_eq!(query.edges[2].node, users[7]); }