5bee7092d3
- Add insta dev-dependency for visual regression testing - Create lib.rs to expose modules for integration tests - Add snapshot tests for progress_bar, topbar, library, help modal - Add unit tests for LibraryState navigation - Move all tests to tests/ directory (proper Rust convention) - Make build.rs skip proto compilation when protoc unavailable - Add docs/testing-possible-solutions.md with testing strategies
246 lines
7.3 KiB
Rust
246 lines
7.3 KiB
Rust
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<Artist> {
|
|
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);
|
|
}
|
|
}
|