#[cfg(test)]
mod snapshot_tests {
  use crate::app::App;
  use crate::handlers::populate_keymapping_table;
  use crate::models::servarr_data::Notification;
  use crate::models::servarr_data::lidarr::lidarr_data::ActiveLidarrBlock;
  use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
  use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock;
  use crate::ui;
  use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app};

  #[test]
  fn test_radarr_ui_renders_library_tab() {
    let mut app = App::test_default_fully_populated();
    app.push_navigation_stack(ActiveRadarrBlock::default().into());

    let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
      ui(f, app);
    });

    insta::assert_snapshot!(output);
  }

  #[test]
  fn test_radarr_ui_renders_library_tab_with_error() {
    let mut app = App::test_default_fully_populated();
    app.error = "Some error".into();
    app.push_navigation_stack(ActiveRadarrBlock::default().into());

    let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
      ui(f, app);
    });

    insta::assert_snapshot!(output);
  }

  #[test]
  fn test_radarr_ui_renders_library_tab_error_popup() {
    let mut app = App::test_default_fully_populated();
    populate_keymapping_table(&mut app);
    app.push_navigation_stack(ActiveRadarrBlock::default().into());

    let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
      ui(f, app);
    });

    insta::assert_snapshot!(output);
  }

  #[test]
  fn test_radarr_ui_renders_notification_success_popup() {
    let mut app = App::test_default_fully_populated();
    app.notification = Some(Notification::new(
      "Download Result".to_owned(),
      "Download request sent successfully".to_owned(),
      true,
    ));
    app.push_navigation_stack(ActiveRadarrBlock::default().into());

    let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
      ui(f, app);
    });

    insta::assert_snapshot!(output);
  }

  #[test]
  fn test_radarr_ui_renders_notification_failure_popup() {
    let mut app = App::test_default_fully_populated();
    app.notification = Some(Notification::new(
      "Download Failed".to_owned(),
      "Request failed. Received 500 response code".to_owned(),
      false,
    ));
    app.push_navigation_stack(ActiveRadarrBlock::default().into());

    let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
      ui(f, app);
    });

    insta::assert_snapshot!(output);
  }

  #[test]
  fn test_sonarr_ui_renders_library_tab() {
    let mut app = App::test_default_fully_populated();
    app.push_navigation_stack(ActiveSonarrBlock::default().into());

    let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
      ui(f, app);
    });

    insta::assert_snapshot!(output);
  }

  #[test]
  fn test_sonarr_ui_renders_library_tab_with_error() {
    let mut app = App::test_default_fully_populated();
    app.push_navigation_stack(ActiveSonarrBlock::default().into());
    app.error = "Some error".into();

    let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
      ui(f, app);
    });

    insta::assert_snapshot!(output);
  }

  #[test]
  fn test_sonarr_ui_renders_library_tab_error_popup() {
    let mut app = App::test_default_fully_populated();
    populate_keymapping_table(&mut app);
    app.push_navigation_stack(ActiveSonarrBlock::default().into());

    let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
      ui(f, app);
    });

    insta::assert_snapshot!(output);
  }

  #[test]
  fn test_sonarr_ui_renders_notification_success_popup() {
    let mut app = App::test_default_fully_populated();
    app.notification = Some(Notification::new(
      "Download Result".to_owned(),
      "Download request sent successfully".to_owned(),
      true,
    ));
    app.push_navigation_stack(ActiveSonarrBlock::default().into());

    let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
      ui(f, app);
    });

    insta::assert_snapshot!(output);
  }

  #[test]
  fn test_lidarr_ui_renders_library_tab() {
    let mut app = App::test_default_fully_populated();
    app.push_navigation_stack(ActiveLidarrBlock::default().into());

    let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
      ui(f, app);
    });

    insta::assert_snapshot!(output);
  }

  #[test]
  fn test_lidarr_ui_renders_library_tab_with_error() {
    let mut app = App::test_default_fully_populated();
    app.push_navigation_stack(ActiveLidarrBlock::default().into());
    app.error = "Some error".into();

    let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
      ui(f, app);
    });

    insta::assert_snapshot!(output);
  }

  #[test]
  fn test_lidarr_ui_renders_notification_success_popup() {
    let mut app = App::test_default_fully_populated();
    app.notification = Some(Notification::new(
      "Download Result".to_owned(),
      "Download request sent successfully".to_owned(),
      true,
    ));
    app.push_navigation_stack(ActiveLidarrBlock::default().into());

    let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
      ui(f, app);
    });

    insta::assert_snapshot!(output);
  }

  #[test]
  fn test_lidarr_ui_renders_library_tab_error_popup() {
    let mut app = App::test_default_fully_populated();
    populate_keymapping_table(&mut app);
    app.push_navigation_stack(ActiveLidarrBlock::default().into());

    let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
      ui(f, app);
    });

    insta::assert_snapshot!(output);
  }
}
