tmux-sessionizer 0.6.1

Tmux Sessionizer is a cli tool to fuzzy find all git repositories in a list of specified folders and open them as a new tmux session. Also, for git worktrees, this tool opens all checked out worktrees as new windows.
Documentation
use assert_cmd::Command;
use pretty_assertions::assert_eq;
use ratatui::style::Color;
use std::{fs, str::FromStr};
use tempfile::tempdir;
use tms::configs::{
    CloneRepoSwitchConfig, Config, PickerColorConfig, SearchDirectory, SessionSortOrderConfig,
};

#[test]
fn tms_fails_with_missing_config() -> anyhow::Result<()> {
    let dir = tempdir()?;
    let file_path = dir.path().join("config.toml");

    let mut tms = Command::cargo_bin("tms")?;

    tms.env("TMS_CONFIG_FILE", file_path);

    tms.assert()
        .failure()
        .code(1)
        .stderr(predicates::str::contains("Error"))
        .stderr(predicates::str::contains(
            "No default search path was found",
        ));

    Ok(())
}

#[test]
fn tms_config() -> anyhow::Result<()> {
    let directory = tempdir()?;
    let config_file_path = directory.path().join("config.toml");

    let depth = 1;
    let default_session = String::from("my_default_session");
    let excluded_dir = String::from("/exclude/this/directory");
    let picker_highlight_color = Color::from_str("#aaaaaa")?;
    let picker_highlight_text_color = Color::from_str("#bbbbbb")?;
    let picker_border_color = Color::from_str("#cccccc")?;
    let picker_info_color = Color::from_str("green")?;
    let picker_prompt_color = Color::from_str("#eeeeee")?;

    let expected_config = Config {
        default_session: Some(default_session.clone()),
        display_full_path: Some(false),
        search_submodules: Some(false),
        recursive_submodules: Some(false),
        switch_filter_unknown: Some(false),
        session_sort_order: Some(SessionSortOrderConfig::Alphabetical),
        excluded_dirs: Some(vec![excluded_dir.clone()]),
        search_paths: None,
        search_dirs: Some(vec![SearchDirectory::new(
            fs::canonicalize(directory.path())?,
            depth,
        )]),
        sessions: None,
        picker_colors: Some(PickerColorConfig {
            highlight_color: Some(picker_highlight_color),
            highlight_text_color: Some(picker_highlight_text_color),
            border_color: Some(picker_border_color),
            info_color: Some(picker_info_color),
            prompt_color: Some(picker_prompt_color),
        }),
        shortcuts: None,
        bookmarks: None,
        session_configs: None,
        marks: None,
        clone_repo_switch: Some(CloneRepoSwitchConfig::Always),
        vcs_providers: None,
        input_position: None,
    };

    let mut tms = Command::cargo_bin("tms")?;

    tms.env("TMS_CONFIG_FILE", &config_file_path)
        .arg("config")
        .args([
            "--paths",
            directory.path().to_str().unwrap(),
            "--max-depths",
            &depth.to_string(),
            "--session",
            &default_session,
            "--full-path",
            "false",
            "--search-submodules",
            "false",
            "--recursive-submodules",
            "false",
            "--switch-filter-unknown",
            "false",
            "--session-sort-order",
            "Alphabetical",
            "--excluded",
            &excluded_dir,
            "--picker-highlight-color",
            &picker_highlight_color.to_string(),
            "--picker-highlight-text-color",
            &picker_highlight_text_color.to_string(),
            "--picker-border-color",
            &picker_border_color.to_string(),
            "--picker-info-color",
            &picker_info_color.to_string(),
            "--picker-prompt-color",
            &picker_prompt_color.to_string(),
            "--clone-repo-switch",
            "Always",
        ]);

    tms.assert().success().code(0);

    let actual_config: Config = toml::from_str(&fs::read_to_string(&config_file_path).unwrap())?;

    assert_eq!(
        expected_config, actual_config,
        "tms config behaves as intended"
    );

    Ok(())
}