#[cfg(test)]
mod tests {
  use crate::app::App;
  use crate::app::key_binding::DEFAULT_KEYBINDINGS;
  use crate::event::Key;
  use crate::handlers::KeyEventHandler;
  use crate::handlers::KeybindingHandler;
  use crate::models::servarr_data::ActiveKeybindingBlock;
  use crate::models::stateful_table::StatefulTable;
  use rstest::rstest;

  mod test_handle_esc {
    use super::*;
    use crate::assert_modal_absent;
    use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
    use pretty_assertions::assert_eq;

    const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key;

    #[test]
    fn test_esc_empties_keymapping_table() {
      let mut app = App::test_default();
      app.is_loading = true;
      app.push_navigation_stack(ActiveRadarrBlock::Movies.into());

      KeybindingHandler::new(ESC_KEY, &mut app, ActiveKeybindingBlock::Help, None).handle();

      assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into());
      assert_modal_absent!(app.keymapping_table);
    }
  }

  #[test]
  fn test_keybinding_handler_accepts() {
    assert!(KeybindingHandler::accepts(ActiveKeybindingBlock::Help));
  }

  #[test]
  fn test_keybinding_handler_not_ready_when_keybinding_is_empty() {
    let mut app = App::test_default();
    app.is_loading = false;

    let handler = KeybindingHandler::new(
      DEFAULT_KEYBINDINGS.esc.key,
      &mut app,
      ActiveKeybindingBlock::Help,
      None,
    );

    assert!(!handler.is_ready());
  }

  #[rstest]
  fn test_keybinding_handler_ready_when_keymapping_table_is_not_empty(
    #[values(true, false)] is_loading: bool,
  ) {
    let mut app = App::test_default();
    app.keymapping_table = Some(StatefulTable::default());
    app.is_loading = is_loading;

    let handler = KeybindingHandler::new(
      DEFAULT_KEYBINDINGS.esc.key,
      &mut app,
      ActiveKeybindingBlock::Help,
      None,
    );

    assert!(handler.is_ready());
  }
}
