Skip to content

Commit 39407a6

Browse files
committed
test: move tests to separate file
1 parent 32880e4 commit 39407a6

File tree

2 files changed

+262
-264
lines changed

2 files changed

+262
-264
lines changed

src/app/data.rs

Lines changed: 1 addition & 264 deletions
Original file line numberDiff line numberDiff line change
@@ -310,267 +310,4 @@ impl TryFrom<&str> for Data {
310310
}
311311

312312
#[cfg(test)]
313-
mod tests {
314-
use std::fmt::{Debug, Display};
315-
316-
use filter::Comparator;
317-
use insta::glob;
318-
use pretty_assertions::assert_eq;
319-
use rstest::{fixture, rstest};
320-
use strum::IntoEnumIterator;
321-
322-
use crate::app::data_display_options::DataDisplayOptions;
323-
324-
use super::*;
325-
326-
const PATH_PROJECT_ROOT: &str = "../../";
327-
const PATH_TEST_SAMPLES: &str = "tests/sample_logs/*.*";
328-
329-
/// Formats to test serializing with
330-
///
331-
/// Even though in the application only RON is used for serialization we do round
332-
/// trip testing on Json because it helps identify problems that are format specific
333-
/// and avoid unnecessary debugging
334-
enum SerdeFormat {
335-
Ron,
336-
Json,
337-
}
338-
339-
#[fixture]
340-
pub(crate) fn insta_settings() -> insta::Settings {
341-
let mut result = insta::Settings::clone_current();
342-
let cwd = std::env::current_dir().expect("failed to get cwd");
343-
let path = cwd.join("tests").join("snapshots");
344-
result.set_snapshot_path(path);
345-
result
346-
}
347-
348-
#[rstest]
349-
fn deserialize_rows_from_string(insta_settings: insta::Settings) {
350-
glob!(PATH_PROJECT_ROOT, PATH_TEST_SAMPLES, |path| {
351-
let input = std::fs::read_to_string(path).unwrap();
352-
let data = Data::try_from(&input[..]).unwrap();
353-
let log_filename = path.file_name().unwrap().to_string_lossy().to_string();
354-
insta_settings
355-
.bind(|| insta::assert_ron_snapshot!(format!("{log_filename}_ron"), data));
356-
insta_settings
357-
.bind(|| insta::assert_yaml_snapshot!(format!("{log_filename}_yaml"), data));
358-
insta_settings
359-
.bind(|| insta::assert_debug_snapshot!(format!("{log_filename}_debug"), data));
360-
});
361-
}
362-
363-
#[rstest]
364-
#[case::ron(SerdeFormat::Ron)]
365-
#[case::json(SerdeFormat::Json)]
366-
fn round_trip_from_samples(#[case] serde_format: SerdeFormat) {
367-
// Function needed because rustfmt doesn't play nicely with formatting long strings in macros
368-
fn fail_with(path: impl Debug, row: usize, e: impl Debug, s: impl Display) -> LogRow {
369-
panic!(
370-
"failed to deserialize back into struct.\nFile: {path:?}\nRow: {row}\nError: {e:?}\nSerialized Data: {s}"
371-
)
372-
}
373-
374-
glob!(PATH_PROJECT_ROOT, PATH_TEST_SAMPLES, |path| {
375-
let input = std::fs::read_to_string(path).unwrap();
376-
let rows_before = Data::try_from(&input[..]).unwrap();
377-
378-
// Test individual rows
379-
for (i, row_before) in rows_before.rows_iter().enumerate() {
380-
let as_string = match serde_format {
381-
SerdeFormat::Ron => ron::to_string(&row_before).unwrap(),
382-
SerdeFormat::Json => serde_json::to_string(&row_before).unwrap(),
383-
};
384-
385-
let row_after: LogRow = match serde_format {
386-
SerdeFormat::Ron => ron::from_str(&as_string)
387-
.unwrap_or_else(|e| fail_with(path, i, e, as_string)),
388-
SerdeFormat::Json => serde_json::from_str(&as_string)
389-
.unwrap_or_else(|e| fail_with(path, i, e, as_string)),
390-
};
391-
assert_eq!(&row_after, row_before);
392-
}
393-
394-
// Test composition of all rows
395-
let as_string = match serde_format {
396-
SerdeFormat::Ron => ron::to_string(&rows_before).unwrap(),
397-
SerdeFormat::Json => serde_json::to_string(&rows_before).unwrap(),
398-
};
399-
let rows_after: Data = match serde_format {
400-
SerdeFormat::Ron => ron::from_str(&dbg!(as_string)).unwrap(),
401-
SerdeFormat::Json => serde_json::from_str(&dbg!(as_string)).unwrap(),
402-
};
403-
assert_eq!(rows_after, rows_before);
404-
});
405-
}
406-
407-
pub fn create_log_row_no_extra() -> LogRow {
408-
let mut result = LogRow::default();
409-
result.data.insert("time".into(), "time value".into());
410-
result
411-
.data
412-
.insert("otel.name".into(), "HTTP GET /status".into());
413-
result
414-
}
415-
416-
pub fn create_log_row_with_extra() -> LogRow {
417-
let mut result = create_log_row_no_extra();
418-
result.data.insert("http.status_code".into(), 200.into());
419-
result
420-
}
421-
422-
#[rstest]
423-
fn round_trip_from_manual(
424-
#[values(SerdeFormat::Ron, SerdeFormat::Json)] serde_format: SerdeFormat,
425-
#[values(create_log_row_no_extra(), create_log_row_with_extra())] before: LogRow,
426-
) {
427-
let as_string = match serde_format {
428-
SerdeFormat::Ron => ron::to_string(&before).unwrap(),
429-
SerdeFormat::Json => serde_json::to_string(&before).unwrap(),
430-
};
431-
println!("Serialized data:\n{as_string}");
432-
let after: LogRow = match serde_format {
433-
SerdeFormat::Ron => ron::from_str(&as_string).unwrap(),
434-
SerdeFormat::Json => serde_json::from_str(&as_string).unwrap(),
435-
};
436-
assert_eq!(after, before);
437-
}
438-
439-
#[rstest]
440-
fn comparisons_specific_field(insta_settings: insta::Settings) {
441-
let row0 = create_log_row_no_extra();
442-
let row1 = create_log_row_with_extra();
443-
let mut data = Data {
444-
rows: vec![row0.clone(), row1.clone()],
445-
..Default::default()
446-
};
447-
448-
data.filter = Some(FilterConfig {
449-
search_key: "200".to_string(),
450-
filter_on: filter::FilterOn::Field(FieldSpecifier {
451-
name: "http.status_code".to_string(),
452-
}),
453-
is_case_sensitive: false,
454-
comparator: Default::default(),
455-
});
456-
457-
let display_options = DataDisplayOptions::default();
458-
let common_fields = display_options.common_fields();
459-
460-
for comparator in Comparator::iter() {
461-
data.filter.as_mut().unwrap().comparator = comparator;
462-
data.apply_filter(common_fields);
463-
insta_settings.bind(|| insta::assert_yaml_snapshot!(data));
464-
}
465-
}
466-
467-
#[rstest]
468-
fn comparisons_any(insta_settings: insta::Settings) {
469-
let row0 = create_log_row_no_extra();
470-
let row1 = create_log_row_with_extra();
471-
let mut data = Data {
472-
rows: vec![row0.clone(), row1.clone()],
473-
..Default::default()
474-
};
475-
476-
data.filter = Some(FilterConfig {
477-
search_key: "20".to_string(),
478-
filter_on: filter::FilterOn::Any,
479-
is_case_sensitive: false,
480-
comparator: Default::default(),
481-
});
482-
483-
let display_options = DataDisplayOptions::default();
484-
let common_fields = display_options.common_fields();
485-
486-
for comparator in Comparator::iter() {
487-
data.filter.as_mut().unwrap().comparator = comparator;
488-
data.apply_filter(common_fields);
489-
insta_settings.bind(|| insta::assert_yaml_snapshot!(data));
490-
}
491-
}
492-
493-
#[test]
494-
fn selected_maintenance_with_filtering() {
495-
let test_field = String::from("test field");
496-
let rows = (5..10)
497-
.map(|i| {
498-
let mut row = create_log_row_no_extra();
499-
row.data.insert(test_field.clone(), i.into());
500-
row
501-
})
502-
.collect();
503-
let mut data = Data {
504-
rows,
505-
..Default::default()
506-
};
507-
let display_options = DataDisplayOptions::default();
508-
let common_fields = display_options.common_fields();
509-
510-
// Set "7" as selected
511-
data.selected_row = Some(2);
512-
513-
// Save selected row from before
514-
let expected = data
515-
.selected_row_data_as_slice(common_fields)
516-
.unwrap()
517-
.to_vec();
518-
519-
data.filter = Some(FilterConfig {
520-
search_key: "7".to_string(),
521-
..Default::default()
522-
});
523-
data.apply_filter(DataDisplayOptions::default().common_fields());
524-
525-
// Test that 7 is still selected
526-
let actual = data
527-
.selected_row_data_as_slice(common_fields)
528-
.unwrap()
529-
.to_vec();
530-
531-
assert_eq!(actual, expected);
532-
533-
// Then reverse
534-
data.unfilter();
535-
536-
// Test that 7 is still selected
537-
let actual = data
538-
.selected_row_data_as_slice(common_fields)
539-
.unwrap()
540-
.to_vec();
541-
542-
assert_eq!(actual, expected);
543-
}
544-
545-
#[test]
546-
fn selected_unselected_when_not_present() {
547-
let test_field = String::from("test field");
548-
let rows = (5..10)
549-
.map(|i| {
550-
let mut row = create_log_row_no_extra();
551-
row.data.insert(test_field.clone(), i.into());
552-
row
553-
})
554-
.collect();
555-
let mut data = Data {
556-
rows,
557-
..Default::default()
558-
};
559-
let display_options = DataDisplayOptions::default();
560-
let common_fields = display_options.common_fields();
561-
562-
// Set "7" as selected
563-
data.selected_row = Some(2);
564-
565-
// Filter for 6, so 7 is not included
566-
data.filter = Some(FilterConfig {
567-
search_key: "6".to_string(),
568-
..Default::default()
569-
});
570-
data.apply_filter(DataDisplayOptions::default().common_fields());
571-
572-
let actual = data.selected_row_data_as_slice(common_fields);
573-
574-
assert!(actual.is_none());
575-
}
576-
}
313+
mod tests;

0 commit comments

Comments
 (0)