Skip to content

Commit 4fb2684

Browse files
committed
Add integration tests for 'query_unpaged' and 'execute_unpaged' APIs
1 parent c839847 commit 4fb2684

File tree

1 file changed

+165
-1
lines changed

1 file changed

+165
-1
lines changed

scylla/tests/integration/query_result.rs

Lines changed: 165 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use assert_matches::assert_matches;
22
use futures::TryStreamExt;
3-
use scylla::errors::PagerExecutionError;
3+
use scylla::errors::{ExecutionError, PagerExecutionError};
44
use scylla::{
55
batch::{Batch, BatchType},
66
client::session::Session,
77
query::Query,
8+
response::query_result::QueryResult,
89
};
910
use scylla_cql::frame::request::query::{PagingState, PagingStateResponse};
1011

@@ -295,3 +296,166 @@ async fn execute_iter_serialization_error() {
295296
Err(PagerExecutionError::SerializationError(_))
296297
)
297298
}
299+
300+
async fn create_session(table_name: &str) -> Session {
301+
let session: Session = create_new_session_builder().build().await.unwrap();
302+
let ks = unique_keyspace_name();
303+
304+
let cql_create_ks = format!(
305+
"CREATE KEYSPACE IF NOT EXISTS {} WITH REPLICATION =\
306+
{{'class' : 'NetworkTopologyStrategy', 'replication_factor' : 1}}",
307+
ks
308+
);
309+
session.ddl(cql_create_ks).await.unwrap();
310+
session.use_keyspace(ks, false).await.unwrap();
311+
312+
let cql_create_table = format!(
313+
"CREATE TABLE IF NOT EXISTS {} (id int PRIMARY KEY, val int)",
314+
table_name,
315+
);
316+
session.ddl(cql_create_table).await.unwrap();
317+
318+
session
319+
}
320+
321+
async fn check_query_unpaged(insert_num: u64, use_prepared_statements: bool) {
322+
let table_name = if use_prepared_statements {
323+
"execute_unpaged"
324+
} else {
325+
"query_unpaged"
326+
};
327+
let session: Session = create_session(table_name).await;
328+
329+
for i in 0..insert_num {
330+
if use_prepared_statements {
331+
let prepared_statement = session
332+
.prepare(format!("INSERT INTO {}(id, val) VALUES (?, ?)", table_name))
333+
.await
334+
.unwrap();
335+
session
336+
.execute_unpaged(&prepared_statement, &vec![i as i32, i as i32])
337+
.await
338+
.unwrap();
339+
} else {
340+
let cql = format!("INSERT INTO {}(id, val) VALUES ({}, {})", table_name, i, i);
341+
session.query_unpaged(cql, &[]).await.unwrap();
342+
}
343+
}
344+
345+
let query_result: QueryResult;
346+
if use_prepared_statements {
347+
let prepared_statement = session
348+
.prepare(format!("SELECT * FROM {}", table_name))
349+
.await
350+
.unwrap();
351+
query_result = session
352+
.execute_unpaged(&prepared_statement, &[])
353+
.await
354+
.unwrap();
355+
} else {
356+
let select_query = Query::new(format!("SELECT * FROM {}", table_name)).with_page_size(5);
357+
query_result = session.query_unpaged(select_query, &[]).await.unwrap();
358+
}
359+
let rows = query_result.into_rows_result().unwrap();
360+
361+
// NOTE: check rows number using 'rows_num()' method.
362+
assert_eq!(rows.rows_num(), insert_num as usize);
363+
364+
// NOTE: check actual rows number.
365+
let actual_rows = rows
366+
.rows::<(i32, i32)>()
367+
.unwrap()
368+
.collect::<Result<Vec<_>, _>>()
369+
.unwrap();
370+
assert_eq!(actual_rows.len(), insert_num as usize);
371+
}
372+
373+
async fn unpaged_error(use_prepared_statements: bool) {
374+
let table_name = if use_prepared_statements {
375+
"execute_unpaged"
376+
} else {
377+
"query_unpaged"
378+
};
379+
let session: Session = create_session(table_name).await;
380+
381+
let query_result: Result<QueryResult, ExecutionError>;
382+
if use_prepared_statements {
383+
let prepared_statement = session
384+
.prepare(format!("SELECT * FROM {}", table_name))
385+
.await
386+
.unwrap();
387+
// NOTE: drop table to make the main query return error
388+
session
389+
.ddl(format!("DROP TABLE IF EXISTS {}", table_name))
390+
.await
391+
.unwrap();
392+
query_result = session.execute_unpaged(&prepared_statement, &[]).await;
393+
} else {
394+
let select_query = Query::new(format!("SELECT * FROM fake{}", table_name));
395+
query_result = session.query_unpaged(select_query, &[]).await;
396+
}
397+
match query_result {
398+
Ok(_) => panic!("Unexpected success"),
399+
Err(err) => println!("Table not found as expected: {:?}", err),
400+
}
401+
}
402+
403+
#[tokio::test]
404+
async fn test_query_unpaged_error() {
405+
unpaged_error(false).await
406+
}
407+
408+
#[tokio::test]
409+
async fn test_execute_unpaged_error() {
410+
unpaged_error(true).await
411+
}
412+
413+
#[tokio::test]
414+
async fn test_query_unpaged_no_rows() {
415+
check_query_unpaged(0, false).await;
416+
}
417+
418+
#[tokio::test]
419+
async fn test_query_unpaged_one_row() {
420+
check_query_unpaged(1, false).await;
421+
}
422+
423+
#[tokio::test]
424+
async fn test_query_unpaged_ten_rows() {
425+
check_query_unpaged(10, false).await;
426+
}
427+
428+
#[tokio::test]
429+
async fn test_query_unpaged_hundred_rows() {
430+
check_query_unpaged(100, false).await;
431+
}
432+
433+
#[tokio::test]
434+
async fn test_query_unpaged_thousand_rows() {
435+
check_query_unpaged(1000, false).await;
436+
}
437+
438+
#[tokio::test]
439+
async fn test_execute_unpaged_no_rows() {
440+
check_query_unpaged(0, true).await;
441+
}
442+
443+
#[tokio::test]
444+
async fn test_execute_unpaged_one_row() {
445+
check_query_unpaged(1, true).await;
446+
}
447+
448+
#[tokio::test]
449+
async fn test_execute_unpaged_ten_rows() {
450+
check_query_unpaged(10, true).await;
451+
}
452+
453+
#[tokio::test]
454+
async fn test_execute_unpaged_hundred_rows() {
455+
check_query_unpaged(100, true).await;
456+
}
457+
458+
#[tokio::test]
459+
async fn test_execute_unpaged_thousand_rows() {
460+
check_query_unpaged(1000, true).await;
461+
}

0 commit comments

Comments
 (0)