diff --git a/lib/src/source.rs b/lib/src/source.rs index f549c9c..633a22e 100644 --- a/lib/src/source.rs +++ b/lib/src/source.rs @@ -448,6 +448,118 @@ pub mod reader_async { SourceQuestionsZipReaderAsync::new(self) } } + + #[cfg(test)] + mod test { + use crate::source::SourceQuestion; + + use super::*; + use async_zip::{base::write::ZipFileWriter, ZipEntryBuilder}; + use core::fmt::Debug; + use futures_util::StreamExt; + use std::path::Path; + use tempfile::tempdir; + use tokio::fs; + + fn sample_batch() -> SourceQuestionsBatch { + SourceQuestionsBatch { + description: "Тестовый".into(), + date: "00-000-2000".into(), + questions: vec![ + SourceQuestion { + id: "Вопрос 1".into(), + description: "Сколько будет (2 * 2 * 2 + 2) * 2 * 2 + 2".into(), + answer: "42".into(), + ..Default::default() + }, + SourceQuestion { + id: "Вопрос 2".into(), + description: "Зимой и летом одним цветом".into(), + answer: "ёлка".into(), + ..Default::default() + }, + ], + ..Default::default() + } + } + + async fn write_sample_zip

(path: P) + where + P: AsRef, + { + let batch = sample_batch(); + let z_file = fs::File::create(path).await.expect("crerate zip file"); + let mut zip_file = ZipFileWriter::with_tokio(z_file); + let entry = + ZipEntryBuilder::new("test.json".into(), async_zip::Compression::Zstd).build(); + zip_file + .write_entry_whole(entry, serde_json::to_vec(&batch).unwrap().as_slice()) + .await + .expect("write entry"); + zip_file.close().await.expect("close zip"); + } + + async fn assert_data_rref_eq((x, y): (T, &T)) + where + T: PartialEq + Debug, + { + assert_eq!(x, *y); + } + + #[tokio::test] + async fn test_source_questions_stream() { + let expected_batch = sample_batch(); + let dir = tempdir().expect("tempdir"); + + // write sample + let tmpfile_zip = dir.path().join("test.zip"); + write_sample_zip(&tmpfile_zip).await; + + let mut z_file = fs::File::open(tmpfile_zip).await.expect("open zip file"); + let zip_file = ZipFileReader::with_tokio(&mut z_file) + .await + .expect("open zip file reader"); + + let expected_count = expected_batch.questions.len(); + let expected_stream = futures::stream::iter(expected_batch.questions.iter()); + let mut actual_source = zip_file.source_questions(); + let actual_stream = actual_source.stream(); + let mut actual_count: usize = 0; + + actual_stream + .flat_map(|x| futures::stream::iter(x.1.expect("parse batch").questions)) + .zip(expected_stream) + .map(|x| { + actual_count += 1; + x + }) + .for_each(assert_data_rref_eq::) + .await; + assert_eq!(actual_count, expected_count); + } + + #[tokio::test] + async fn test_source_questions_get() { + let expected_batch = sample_batch(); + let dir = tempdir().expect("tempdir"); + + // write sample + let tmpfile_zip = dir.path().join("test.zip"); + write_sample_zip(&tmpfile_zip).await; + + let mut z_file = fs::File::open(tmpfile_zip).await.expect("open zip file"); + let zip_file = ZipFileReader::with_tokio(&mut z_file) + .await + .expect("open zip file reader"); + + let mut source = zip_file.source_questions(); + assert_eq!(source.len(), 1); + + let actual = source.get(0).await.expect("get batch"); + assert_eq!(actual.0, "test.json"); + assert_eq!(actual.1.expect("parse batch"), expected_batch); + } + } } #[cfg(any(feature = "convert_async", feature = "source_async"))] pub use reader_async::{ReadSourceQuestionsBatchesAsync, SourceQuestionsZipReaderAsync};