diff --git a/lib/src/source.rs b/lib/src/source.rs index f5bbbde..f549c9c 100644 --- a/lib/src/source.rs +++ b/lib/src/source.rs @@ -239,6 +239,99 @@ pub mod reader_sync { SourceQuestionsZipReader::new(self) } } + #[cfg(test)] + mod test { + use crate::source::SourceQuestion; + + use super::*; + use std::fs; + use std::{io::Write, iter, path::Path}; + use tempfile::tempdir; + + use super::SourceQuestionsBatch; + + 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() + } + } + + fn write_sample_zip

(path: P) + where + P: AsRef, + { + let batch = sample_batch(); + let z_file = fs::File::create(path).expect("crerate zip file"); + let mut zip_file = zip::ZipWriter::new(z_file); + let options = + zip::write::FileOptions::default().compression_method(zip::CompressionMethod::Zstd); + zip_file + .start_file("test.json", options) + .expect("zip start file"); + zip_file + .write(serde_json::to_vec(&batch).unwrap().as_slice()) + .expect("write entry"); + zip_file.finish().expect("finish zip file"); + } + + #[test] + 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); + + let z_file = fs::File::open(tmpfile_zip).expect("open zip file"); + let zip_file = zip::ZipArchive::new(z_file).expect("open zip file reader"); + + let mut source = zip_file.source_questions(); + assert_eq!(source.len(), 1); + + let actual = source.nth(0).expect("get batch"); + assert_eq!(actual.0, "test.json"); + assert_eq!(actual.1.expect("parse batch"), expected_batch); + } + + #[test] + fn test_source_questions_iter() { + 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); + + let z_file = fs::File::open(tmpfile_zip).expect("open zip file"); + let zip_file = zip::ZipArchive::new(z_file).expect("open zip file reader"); + + let source = zip_file.source_questions(); + assert_eq!(source.len(), 1); + + let expected_iter = iter::once((String::from("test.json"), Ok(expected_batch))); + + assert!(source + .map(|x| (x.0, x.1.map_err(|e| e.to_string()))) + .eq(expected_iter)); + } + } } #[cfg(any(feature = "convert", feature = "source"))]