@@ -310,267 +310,4 @@ impl TryFrom<&str> for Data {
310
310
}
311
311
312
312
#[ 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.\n File: {path:?}\n Row: {row}\n Error: {e:?}\n Serialized 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