use ratatui::{Terminal, backend::TestBackend, widgets::Paragraph}; use ui_agregator::app::Tab; use ui_agregator::data::{Album, AlbumStatus, Artist, MonitorState}; use ui_agregator::ui::library::{LibraryFocus, LibraryState, render_library}; use ui_agregator::ui::modals::render_help_modal; use ui_agregator::ui::progress_bar::progress_bar; use ui_agregator::ui::topbar::render_topbar; fn test_artists() -> Vec { vec![ Artist { id: "1".to_string(), name: "Radiohead".to_string(), country: "UK".to_string(), genres: vec!["Alternative".to_string()], monitor_state: MonitorState::Monitored, path: "/music/Radiohead".to_string(), quality: "FLAC".to_string(), size_gb: 2.5, albums: vec![ Album { id: "a1".to_string(), title: "OK Computer".to_string(), year: 1997, album_type: "Album".to_string(), monitored: true, total: 12, have: 12, quality: "FLAC".to_string(), status: AlbumStatus::Complete, }, Album { id: "a2".to_string(), title: "Kid A".to_string(), year: 2000, album_type: "Album".to_string(), monitored: true, total: 10, have: 5, quality: "FLAC".to_string(), status: AlbumStatus::Partial, }, ], }, Artist { id: "2".to_string(), name: "Pink Floyd".to_string(), country: "UK".to_string(), genres: vec!["Progressive Rock".to_string()], monitor_state: MonitorState::Monitored, path: "/music/Pink Floyd".to_string(), quality: "FLAC".to_string(), size_gb: 5.2, albums: vec![Album { id: "a3".to_string(), title: "The Dark Side of the Moon".to_string(), year: 1973, album_type: "Album".to_string(), monitored: true, total: 10, have: 0, quality: "—".to_string(), status: AlbumStatus::Wanted, }], }, ] } mod progress_bar_snapshots { use super::*; #[test] fn complete() { let mut terminal = Terminal::new(TestBackend::new(12, 1)).unwrap(); terminal .draw(|f| { let bar = progress_bar(10, 10, 10, AlbumStatus::Complete); f.render_widget(Paragraph::new(bar), f.area()); }) .unwrap(); insta::assert_snapshot!(terminal.backend()); } #[test] fn partial() { let mut terminal = Terminal::new(TestBackend::new(12, 1)).unwrap(); terminal .draw(|f| { let bar = progress_bar(5, 10, 10, AlbumStatus::Partial); f.render_widget(Paragraph::new(bar), f.area()); }) .unwrap(); insta::assert_snapshot!(terminal.backend()); } #[test] fn empty() { let mut terminal = Terminal::new(TestBackend::new(12, 1)).unwrap(); terminal .draw(|f| { let bar = progress_bar(0, 10, 10, AlbumStatus::Wanted); f.render_widget(Paragraph::new(bar), f.area()); }) .unwrap(); insta::assert_snapshot!(terminal.backend()); } } mod topbar_snapshots { use super::*; #[test] fn library_active() { let mut terminal = Terminal::new(TestBackend::new(100, 1)).unwrap(); terminal .draw(|f| { render_topbar(f, f.area(), Tab::Library, 0, 0, 0, false); }) .unwrap(); insta::assert_snapshot!(terminal.backend()); } #[test] fn with_badges() { let mut terminal = Terminal::new(TestBackend::new(100, 1)).unwrap(); terminal .draw(|f| { render_topbar(f, f.area(), Tab::Queue, 5, 12, 3, false); }) .unwrap(); insta::assert_snapshot!(terminal.backend()); } #[test] fn notifications_open() { let mut terminal = Terminal::new(TestBackend::new(100, 1)).unwrap(); terminal .draw(|f| { render_topbar(f, f.area(), Tab::Library, 0, 0, 5, true); }) .unwrap(); insta::assert_snapshot!(terminal.backend()); } } mod library_snapshots { use super::*; #[test] fn empty() { let mut terminal = Terminal::new(TestBackend::new(100, 30)).unwrap(); let mut state = LibraryState::new(vec![]); terminal .draw(|f| { render_library(f, f.area(), &mut state); }) .unwrap(); insta::assert_snapshot!(terminal.backend()); } #[test] fn with_artists() { let mut terminal = Terminal::new(TestBackend::new(100, 30)).unwrap(); let mut state = LibraryState::new(test_artists()); terminal .draw(|f| { render_library(f, f.area(), &mut state); }) .unwrap(); insta::assert_snapshot!(terminal.backend()); } #[test] fn albums_focused() { let mut terminal = Terminal::new(TestBackend::new(100, 30)).unwrap(); let mut state = LibraryState::new(test_artists()); state.focus = LibraryFocus::Albums; terminal .draw(|f| { render_library(f, f.area(), &mut state); }) .unwrap(); insta::assert_snapshot!(terminal.backend()); } } mod help_modal_snapshots { use super::*; #[test] fn normal_viewport() { let mut terminal = Terminal::new(TestBackend::new(100, 30)).unwrap(); terminal .draw(|f| { render_help_modal(f, f.area()); }) .unwrap(); insta::assert_snapshot!(terminal.backend()); } #[test] fn small_viewport() { let mut terminal = Terminal::new(TestBackend::new(60, 20)).unwrap(); terminal .draw(|f| { render_help_modal(f, f.area()); }) .unwrap(); insta::assert_snapshot!(terminal.backend()); } } mod library_state { use super::*; #[test] fn navigation() { let mut state = LibraryState::new(test_artists()); assert_eq!(state.selected_artist_index(), Some(0)); assert_eq!(state.focus, LibraryFocus::Artists); state.move_down(); assert_eq!(state.selected_artist_index(), Some(1)); state.focus_right(); assert_eq!(state.focus, LibraryFocus::Albums); state.focus_left(); assert_eq!(state.focus, LibraryFocus::Artists); } #[test] fn cycle_focus() { let mut state = LibraryState::new(test_artists()); assert_eq!(state.focus, LibraryFocus::Artists); state.cycle_focus(); assert_eq!(state.focus, LibraryFocus::Albums); state.cycle_focus(); assert_eq!(state.focus, LibraryFocus::Tracks); state.cycle_focus(); assert_eq!(state.focus, LibraryFocus::Artists); } }