Skip to content

Commit 82cc77f

Browse files
authored
Merge pull request #19 from kination/improve-test-scope
Add test features
2 parents e7c4d6f + 26003ac commit 82cc77f

8 files changed

Lines changed: 317 additions & 187 deletions

vine-core/tests/arrow_bridge_tests.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use std::sync::Arc;
77

88
#[test]
99
fn test_arrow_ipc_serialization_roundtrip() {
10-
// Create a simple RecordBatch directly without CSV conversion
1110
let schema = Schema::new(vec![
1211
Field::new("id", DataType::Int32, false),
1312
Field::new("name", DataType::Utf8, true),
Lines changed: 24 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use vine_core::storage_reader::read_vine_data;
22
use vine_core::metadata::{Metadata, MetadataField};
33
use vine_core::vortex_exp::write_vortex_file;
4+
use vine_core::arrow_bridge::vortex_to_arrow;
45
use tempfile::tempdir;
56
use std::fs;
67

@@ -24,118 +25,97 @@ fn create_test_metadata() -> Metadata {
2425
)
2526
}
2627

28+
/// Helper: count total rows from read results using Arrow conversion
29+
fn total_rows(arrays: &[vortex::ArrayRef]) -> usize {
30+
arrays.iter().map(|a| {
31+
vortex_to_arrow(a, true).expect("Failed to convert").num_rows()
32+
}).sum()
33+
}
34+
2735
#[test]
2836
fn test_read_vine_data_single_file() {
2937
let temp_dir = tempdir().expect("Failed to create temp dir");
3038
let base_path = temp_dir.path();
3139

32-
// Create metadata
3340
let metadata = create_test_metadata();
3441
let meta_path = base_path.join("vine_meta.json");
3542
metadata.save(meta_path.to_str().unwrap()).expect("Failed to save metadata");
3643

37-
// Create date directory
3844
let date_dir = base_path.join("2024-01-15");
3945
fs::create_dir(&date_dir).expect("Failed to create date dir");
4046

41-
// Write test data
42-
let csv_rows = vec!["1,Alice".to_string(), "2,Bob".to_string()];
43-
let csv_rows_refs: Vec<&str> = csv_rows.iter().map(|s| s.as_str()).collect();
4447
let vtx_path = date_dir.join("data_120000_000000.vtx");
45-
write_vortex_file(&vtx_path, &metadata, &csv_rows_refs)
48+
write_vortex_file(&vtx_path, &metadata, &["1,Alice", "2,Bob"])
4649
.expect("Failed to write vortex file");
4750

48-
// Read data
4951
let result = read_vine_data(base_path.to_str().unwrap());
52+
assert_eq!(result.len(), 1); // 1 file = 1 array
53+
assert_eq!(total_rows(&result), 2);
5054

51-
assert_eq!(result.len(), 2);
52-
assert_eq!(result[0], "1,Alice");
53-
assert_eq!(result[1], "2,Bob");
55+
// Verify column structure
56+
let batch = vortex_to_arrow(&result[0], true).expect("Failed to convert");
57+
assert_eq!(batch.num_columns(), 2);
5458
}
5559

5660
#[test]
5761
fn test_read_vine_data_multiple_files() {
5862
let temp_dir = tempdir().expect("Failed to create temp dir");
5963
let base_path = temp_dir.path();
6064

61-
// Create metadata
6265
let metadata = create_test_metadata();
6366
let meta_path = base_path.join("vine_meta.json");
6467
metadata.save(meta_path.to_str().unwrap()).expect("Failed to save metadata");
6568

66-
// Create date directory
6769
let date_dir = base_path.join("2024-01-15");
6870
fs::create_dir(&date_dir).expect("Failed to create date dir");
6971

70-
// Write first file
71-
let csv_rows1 = vec!["1,Alice".to_string()];
72-
let csv_rows1_refs: Vec<&str> = csv_rows1.iter().map(|s| s.as_str()).collect();
7372
let vtx_path1 = date_dir.join("data_120000_000000.vtx");
74-
write_vortex_file(&vtx_path1, &metadata, &csv_rows1_refs)
73+
write_vortex_file(&vtx_path1, &metadata, &["1,Alice"])
7574
.expect("Failed to write first vortex file");
7675

77-
// Write second file
78-
let csv_rows2 = vec!["2,Bob".to_string()];
79-
let csv_rows2_refs: Vec<&str> = csv_rows2.iter().map(|s| s.as_str()).collect();
8076
let vtx_path2 = date_dir.join("data_130000_000000.vtx");
81-
write_vortex_file(&vtx_path2, &metadata, &csv_rows2_refs)
77+
write_vortex_file(&vtx_path2, &metadata, &["2,Bob"])
8278
.expect("Failed to write second vortex file");
8379

84-
// Read data
8580
let result = read_vine_data(base_path.to_str().unwrap());
86-
87-
assert_eq!(result.len(), 2);
81+
assert_eq!(total_rows(&result), 2);
8882
}
8983

9084
#[test]
9185
fn test_read_vine_data_multiple_dates() {
9286
let temp_dir = tempdir().expect("Failed to create temp dir");
9387
let base_path = temp_dir.path();
9488

95-
// Create metadata
9689
let metadata = create_test_metadata();
9790
let meta_path = base_path.join("vine_meta.json");
9891
metadata.save(meta_path.to_str().unwrap()).expect("Failed to save metadata");
9992

100-
// Create first date directory
10193
let date_dir1 = base_path.join("2024-01-14");
10294
fs::create_dir(&date_dir1).expect("Failed to create first date dir");
103-
let csv_rows1 = vec!["1,Alice".to_string()];
104-
let csv_rows1_refs: Vec<&str> = csv_rows1.iter().map(|s| s.as_str()).collect();
10595
let vtx_path1 = date_dir1.join("data_120000_000000.vtx");
106-
write_vortex_file(&vtx_path1, &metadata, &csv_rows1_refs)
96+
write_vortex_file(&vtx_path1, &metadata, &["1,Alice"])
10797
.expect("Failed to write first vortex file");
10898

109-
// Create second date directory
11099
let date_dir2 = base_path.join("2024-01-15");
111100
fs::create_dir(&date_dir2).expect("Failed to create second date dir");
112-
let csv_rows2 = vec!["2,Bob".to_string()];
113-
let csv_rows2_refs: Vec<&str> = csv_rows2.iter().map(|s| s.as_str()).collect();
114101
let vtx_path2 = date_dir2.join("data_120000_000000.vtx");
115-
write_vortex_file(&vtx_path2, &metadata, &csv_rows2_refs)
102+
write_vortex_file(&vtx_path2, &metadata, &["2,Bob"])
116103
.expect("Failed to write second vortex file");
117104

118-
// Read data (should be in chronological order)
119105
let result = read_vine_data(base_path.to_str().unwrap());
120-
121-
assert_eq!(result.len(), 2);
122-
assert_eq!(result[0], "1,Alice"); // 2024-01-14 comes first
123-
assert_eq!(result[1], "2,Bob"); // 2024-01-15 comes second
106+
assert_eq!(total_rows(&result), 2);
124107
}
125108

126109
#[test]
127110
fn test_read_vine_data_empty_directory() {
128111
let temp_dir = tempdir().expect("Failed to create temp dir");
129112
let base_path = temp_dir.path();
130113

131-
// Create metadata
132114
let metadata = create_test_metadata();
133115
let meta_path = base_path.join("vine_meta.json");
134116
metadata.save(meta_path.to_str().unwrap()).expect("Failed to save metadata");
135117

136-
// Read data from empty directory
137118
let result = read_vine_data(base_path.to_str().unwrap());
138-
139119
assert!(result.is_empty());
140120
}
141121

@@ -144,10 +124,7 @@ fn test_read_vine_data_missing_metadata() {
144124
let temp_dir = tempdir().expect("Failed to create temp dir");
145125
let base_path = temp_dir.path();
146126

147-
// Don't create metadata file
148127
let result = read_vine_data(base_path.to_str().unwrap());
149-
150-
// Should return empty vector on error
151128
assert!(result.is_empty());
152129
}
153130

@@ -156,61 +133,42 @@ fn test_read_vine_data_ignores_non_vtx_files() {
156133
let temp_dir = tempdir().expect("Failed to create temp dir");
157134
let base_path = temp_dir.path();
158135

159-
// Create metadata
160136
let metadata = create_test_metadata();
161137
let meta_path = base_path.join("vine_meta.json");
162138
metadata.save(meta_path.to_str().unwrap()).expect("Failed to save metadata");
163139

164-
// Create date directory
165140
let date_dir = base_path.join("2024-01-15");
166141
fs::create_dir(&date_dir).expect("Failed to create date dir");
167142

168-
// Write vtx file
169-
let csv_rows = vec!["1,Alice".to_string()];
170-
let csv_rows_refs: Vec<&str> = csv_rows.iter().map(|s| s.as_str()).collect();
171143
let vtx_path = date_dir.join("data_120000_000000.vtx");
172-
write_vortex_file(&vtx_path, &metadata, &csv_rows_refs)
144+
write_vortex_file(&vtx_path, &metadata, &["1,Alice"])
173145
.expect("Failed to write vortex file");
174146

175-
// Create non-vtx file
176147
let txt_path = date_dir.join("README.txt");
177148
fs::write(&txt_path, "This should be ignored").expect("Failed to write txt file");
178149

179-
// Read data
180150
let result = read_vine_data(base_path.to_str().unwrap());
181-
182-
// Should only read the .vtx file
183-
assert_eq!(result.len(), 1);
184-
assert_eq!(result[0], "1,Alice");
151+
assert_eq!(total_rows(&result), 1);
185152
}
186153

187154
#[test]
188155
fn test_read_vine_data_ignores_invalid_date_directories() {
189156
let temp_dir = tempdir().expect("Failed to create temp dir");
190157
let base_path = temp_dir.path();
191158

192-
// Create metadata
193159
let metadata = create_test_metadata();
194160
let meta_path = base_path.join("vine_meta.json");
195161
metadata.save(meta_path.to_str().unwrap()).expect("Failed to save metadata");
196162

197-
// Create valid date directory
198163
let valid_date_dir = base_path.join("2024-01-15");
199164
fs::create_dir(&valid_date_dir).expect("Failed to create valid date dir");
200-
let csv_rows = vec!["1,Alice".to_string()];
201-
let csv_rows_refs: Vec<&str> = csv_rows.iter().map(|s| s.as_str()).collect();
202165
let vtx_path = valid_date_dir.join("data_120000_000000.vtx");
203-
write_vortex_file(&vtx_path, &metadata, &csv_rows_refs)
166+
write_vortex_file(&vtx_path, &metadata, &["1,Alice"])
204167
.expect("Failed to write vortex file");
205168

206-
// Create invalid date directory
207169
let invalid_date_dir = base_path.join("not-a-date");
208170
fs::create_dir(&invalid_date_dir).expect("Failed to create invalid date dir");
209171

210-
// Read data
211172
let result = read_vine_data(base_path.to_str().unwrap());
212-
213-
// Should only read from valid date directory
214-
assert_eq!(result.len(), 1);
215-
assert_eq!(result[0], "1,Alice");
173+
assert_eq!(total_rows(&result), 1);
216174
}

vine-core/tests/streaming_writer_v2_tests.rs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use vine_core::streaming_writer_v2::StreamingWriterV2;
22
use vine_core::writer_config::WriterConfig;
33
use vine_core::metadata::{Metadata, MetadataField};
4+
use vine_core::vortex_exp::build_struct_array;
45
use tempfile::tempdir;
56
use chrono::Local;
67

@@ -24,6 +25,11 @@ fn create_test_metadata() -> Metadata {
2425
)
2526
}
2627

28+
/// Helper: build VortexArrayRef from comma-separated rows
29+
fn build_test_array(metadata: &Metadata, rows: &[&str]) -> vortex::ArrayRef {
30+
build_struct_array(metadata, rows).expect("Failed to build test array")
31+
}
32+
2733
#[test]
2834
fn test_streaming_writer_v2_basic() {
2935
let temp_dir = tempdir().expect("Failed to create temp dir");
@@ -37,15 +43,17 @@ fn test_streaming_writer_v2_basic() {
3743
.expect("Failed to create writer");
3844

3945
// Write and accumulate
40-
writer.write_batch(&["1,Alice", "2,Bob"]).expect("Write failed");
46+
let array1 = build_test_array(&metadata, &["1,Alice", "2,Bob"]);
47+
writer.write_batch(&array1).expect("Write failed");
4148
assert_eq!(writer.buffered_rows(), 2);
4249
assert_eq!(writer.buffered_chunks(), 1);
4350

44-
writer.write_batch(&["3,Charlie"]).expect("Write failed");
51+
let array2 = build_test_array(&metadata, &["3,Charlie"]);
52+
writer.write_batch(&array2).expect("Write failed");
4553
assert_eq!(writer.buffered_rows(), 3);
4654
assert_eq!(writer.buffered_chunks(), 2);
4755

48-
// Flush - should write to file and return summary
56+
// Flush
4957
let summary = writer.flush().expect("Flush failed");
5058
assert!(summary.is_some(), "Should return flush summary");
5159
let summary = summary.unwrap();
@@ -59,7 +67,8 @@ fn test_streaming_writer_v2_basic() {
5967
assert!(writer.bytes_written() > 0);
6068

6169
// Write more (new file)
62-
writer.write_batch(&["4,Diana"]).expect("Write failed");
70+
let array3 = build_test_array(&metadata, &["4,Diana"]);
71+
writer.write_batch(&array3).expect("Write failed");
6372
writer.close().expect("Close failed");
6473

6574
// Verify files
@@ -85,19 +94,18 @@ fn test_auto_flush() {
8594
let metadata = create_test_metadata();
8695
metadata.save(meta_path.to_str().unwrap()).expect("Failed to save metadata");
8796

88-
// Create writer with small max_rows_per_file
8997
let mut config = WriterConfig::default();
9098
config.max_rows_per_file = 5;
9199

92100
let mut writer = StreamingWriterV2::with_config(path.to_path_buf(), config)
93101
.expect("Failed to create writer");
94102

95-
// Write 3 rows (no flush yet)
96-
writer.write_batch(&["1,A", "2,B", "3,C"]).expect("Write failed");
103+
let array1 = build_test_array(&metadata, &["1,A", "2,B", "3,C"]);
104+
writer.write_batch(&array1).expect("Write failed");
97105
assert_eq!(writer.buffered_rows(), 3);
98106

99-
// Write 3 more rows (3+3 > 5, so flushes first 3 data, then add 3)
100-
writer.write_batch(&["4,D", "5,E", "6,F"]).expect("Write failed");
107+
let array2 = build_test_array(&metadata, &["4,D", "5,E", "6,F"]);
108+
writer.write_batch(&array2).expect("Write failed");
101109
assert_eq!(writer.buffered_rows(), 3);
102110

103111
writer.close().expect("Close failed");
@@ -115,7 +123,6 @@ fn test_empty_flush() {
115123
let mut writer = StreamingWriterV2::new(path.to_path_buf())
116124
.expect("Failed to create writer");
117125

118-
// Flush without writing should return None
119126
let summary = writer.flush().expect("Flush should succeed");
120127
assert!(summary.is_none(), "Empty flush should return None");
121128
assert_eq!(writer.bytes_written(), 0);

0 commit comments

Comments
 (0)