Skip to content

Commit

Permalink
Fix: sort the episodes in the embed (#9)
Browse files Browse the repository at this point in the history
  • Loading branch information
cbackas committed Jul 31, 2023
1 parent f3291f6 commit c7b07bf
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 89 deletions.
4 changes: 2 additions & 2 deletions src/env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,14 +73,14 @@ mod tests {

#[test]
#[serial]
fn custom_url() {
fn custom() {
std::env::set_var("HOOKBUFFER_DESTINATION_URL", "https://example.com");
assert_eq!(get_destination_url(), "https://example.com/");
}

#[test]
#[serial]
fn custom_url_no_trailing_slash() {
fn custom_no_trailing_slash() {
std::env::set_var("HOOKBUFFER_DESTINATION_URL", "https://example.com");
assert_eq!(get_destination_url(), "https://example.com/");
}
Expand Down
189 changes: 102 additions & 87 deletions src/sonarr_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ fn convert_group_to_webhook(sonarr_data: &[SonarrRequestBody]) -> DiscordWebhook
_ => format!("{}: {} Season {:02}", content, series_title, season_number),
};

let description = sonarr_data
let mut episodes_with_quality: Vec<_> = sonarr_data
.iter()
.flat_map(|request| {
let quality = request
Expand All @@ -237,13 +237,17 @@ fn convert_group_to_webhook(sonarr_data: &[SonarrRequestBody]) -> DiscordWebhook
.map(|episode_file| episode_file.quality.clone())
.or_else(|| request.release.clone()?.quality)
.unwrap_or_else(|| "None".to_string());
request.episodes.iter().map(move |episode| {
format!(
"{:02}x{:02} - {} [{}]",
episode.season_number, episode.episode_number, episode.title, quality
)
})
request
.episodes
.iter()
.map(move |episode| (episode.season_number, episode.episode_number, episode.title.clone(), quality.clone()))
})
.collect();
episodes_with_quality.sort_by(|a, b| a.0.cmp(&b.0).then(a.1.cmp(&b.1)).then(a.2.cmp(&b.2)).then(a.3.cmp(&b.3)));

let description = episodes_with_quality
.into_iter()
.map(|(season_number, episode_number, title, quality)| format!("{:02}x{:02} - {} [{}]", season_number, episode_number, title, quality))
.collect::<Vec<_>>()
.join("\n");

Expand Down Expand Up @@ -346,91 +350,102 @@ mod tests {
}
}

#[test]
fn test_group_sonarr_requests() {
let mut queue = vec![
// group 1
create_episode_request("Fake Series 1", "Fake Episode 1", 1, 1, SonarrEventType::Grab),
create_episode_request("Fake Series 1", "Fake Episode 2", 1, 2, SonarrEventType::Grab),
// group 2
create_episode_request("Fake Series 1", "Fake Episode 1", 1, 1, SonarrEventType::Download),
create_episode_request("Fake Series 1", "Fake Episode 2", 1, 2, SonarrEventType::Download),
// group 3
create_episode_request("Fake Series 1", "Fake Episode 1", 1, 1, SonarrEventType::Upgrade),
create_episode_request("Fake Series 1", "Fake Episode 2", 1, 2, SonarrEventType::Upgrade),
// group 4
create_episode_request("The Fakest Show", "Fake Episode 1", 1, 1, SonarrEventType::Grab),
create_episode_request("The Fakest Show", "Fake Episode 2", 1, 2, SonarrEventType::Grab),
// group 5
create_episode_request("The Fakest Show", "Fake Episode 1", 1, 1, SonarrEventType::Download),
create_episode_request("The Fakest Show", "Fake Episode 2", 1, 2, SonarrEventType::Download),
// group 6
create_episode_request("The Fakest Show", "Fake Episode 1", 1, 1, SonarrEventType::Upgrade),
create_episode_request("The Fakest Show", "Fake Episode 2", 1, 2, SonarrEventType::Upgrade),
];

let result = group_sonarr_requests(&mut queue);

assert_eq!(result.len(), 6);
assert_eq!(queue.len(), 0);
mod group_sonarr_requests {
use super::*;

#[test]
fn episode_sorting() {
let mut queue = vec![
// group 1
create_episode_request("Fake Series 1", "Fake Episode 1", 1, 1, SonarrEventType::Grab),
create_episode_request("Fake Series 1", "Fake Episode 2", 1, 2, SonarrEventType::Grab),
// group 2
create_episode_request("Fake Series 1", "Fake Episode 1", 1, 1, SonarrEventType::Download),
create_episode_request("Fake Series 1", "Fake Episode 2", 1, 2, SonarrEventType::Download),
// group 3
create_episode_request("Fake Series 1", "Fake Episode 1", 1, 1, SonarrEventType::Upgrade),
create_episode_request("Fake Series 1", "Fake Episode 2", 1, 2, SonarrEventType::Upgrade),
// group 4
create_episode_request("The Fakest Show", "Fake Episode 1", 1, 1, SonarrEventType::Grab),
create_episode_request("The Fakest Show", "Fake Episode 2", 1, 2, SonarrEventType::Grab),
// group 5
create_episode_request("The Fakest Show", "Fake Episode 1", 1, 1, SonarrEventType::Download),
create_episode_request("The Fakest Show", "Fake Episode 2", 1, 2, SonarrEventType::Download),
// group 6
create_episode_request("The Fakest Show", "Fake Episode 1", 1, 1, SonarrEventType::Upgrade),
create_episode_request("The Fakest Show", "Fake Episode 2", 1, 2, SonarrEventType::Upgrade),
];

let result = group_sonarr_requests(&mut queue);

assert_eq!(result.len(), 6);
assert_eq!(queue.len(), 0);
}
}

#[test]
fn test_convert_group_to_webhook() {
let requests = vec![
create_episode_request("Fake Series 1", "Fake Episode 1", 1, 1, SonarrEventType::Grab),
create_episode_request("Fake Series 1", "Fake Episode 2", 1, 2, SonarrEventType::Grab),
];

let webhook = convert_group_to_webhook(&requests);

assert_eq!(webhook.embeds.len(), 1);
assert_eq!(webhook.content, "Grabbed: Fake Series 1 Season 01");
assert_eq!(webhook.embeds[0].title, Some("Fake Series 1".to_string()));
assert_eq!(
webhook.embeds[0].description,
Some("01x01 - Fake Episode 1 [Fake Quality]\n01x02 - Fake Episode 2 [Fake Quality]".to_string())
);
}
mod convert_group_to_webhook {
use super::*;
#[test]
fn multiple_episodes() {
let requests = vec![
create_episode_request("Fake Series 1", "Fake Episode 4", 1, 4, SonarrEventType::Grab),
create_episode_request("Fake Series 1", "Fake Episode 3", 1, 3, SonarrEventType::Grab),
create_episode_request("Fake Series 1", "Fake Episode 6", 1, 6, SonarrEventType::Grab),
create_episode_request("Fake Series 1", "Fake Episode 1", 1, 1, SonarrEventType::Grab),
create_episode_request("Fake Series 1", "Fake Episode 2", 1, 2, SonarrEventType::Grab),
create_episode_request("Fake Series 1", "Fake Episode 5", 1, 5, SonarrEventType::Grab),
];

let webhook = convert_group_to_webhook(&requests);

assert_eq!(webhook.embeds.len(), 1);
assert_eq!(webhook.content, "Grabbed: Fake Series 1 Season 01");
assert_eq!(webhook.embeds[0].title, Some("Fake Series 1".to_string()));
assert_eq!(
webhook.embeds[0].description,
Some("01x01 - Fake Episode 1 [Fake Quality]\n01x02 - Fake Episode 2 [Fake Quality]\n01x03 - Fake Episode 3 [Fake Quality]\n01x04 - Fake Episode 4 [Fake Quality]\n01x05 - Fake Episode 5 [Fake Quality]\n01x06 - Fake Episode 6 [Fake Quality]".to_string())
);
}

#[test]
fn test_convert_group_to_webhook_single_episode() {
let requests = vec![create_episode_request("Fake Series", "Fake Episode 1", 1, 1, SonarrEventType::Grab)];
#[test]
fn single_episode() {
let requests = vec![create_episode_request("Fake Series", "Fake Episode 1", 1, 1, SonarrEventType::Grab)];

let webhook = convert_group_to_webhook(&requests);
let webhook = convert_group_to_webhook(&requests);

assert_eq!(webhook.embeds.len(), 1);
assert_eq!(webhook.content, "Grabbed: Fake Series - 01x01 - Fake Episode 1");
assert_eq!(webhook.embeds[0].title, Some("Fake Series".to_string()));
assert_eq!(webhook.embeds[0].description, Some("01x01 - Fake Episode 1 [Fake Quality]".to_string()));
}
assert_eq!(webhook.embeds.len(), 1);
assert_eq!(webhook.content, "Grabbed: Fake Series - 01x01 - Fake Episode 1");
assert_eq!(webhook.embeds[0].title, Some("Fake Series".to_string()));
assert_eq!(webhook.embeds[0].description, Some("01x01 - Fake Episode 1 [Fake Quality]".to_string()));
}

#[test]
fn test_convert_group_to_webhooks_colors() {
let grab_webhook = convert_group_to_webhook(&vec![create_episode_request(
"Fake Series",
"Fake Episode 1",
1,
1,
SonarrEventType::Grab,
)]);
let download_webhook = convert_group_to_webhook(&vec![create_episode_request(
"Fake Series",
"Fake Episode 1",
1,
1,
SonarrEventType::Download,
)]);
let upgrade_webhook = convert_group_to_webhook(&vec![create_episode_request(
"Fake Series",
"Fake Episode 1",
1,
1,
SonarrEventType::Upgrade,
)]);

assert_eq!(grab_webhook.embeds[0].color, Some(0xFFC130));
assert_eq!(download_webhook.embeds[0].color, Some(0x29A44C));
assert_eq!(upgrade_webhook.embeds[0].color, Some(0x3E6800));
#[test]
fn colors() {
let grab_webhook = convert_group_to_webhook(&vec![create_episode_request(
"Fake Series",
"Fake Episode 1",
1,
1,
SonarrEventType::Grab,
)]);
let download_webhook = convert_group_to_webhook(&vec![create_episode_request(
"Fake Series",
"Fake Episode 1",
1,
1,
SonarrEventType::Download,
)]);
let upgrade_webhook = convert_group_to_webhook(&vec![create_episode_request(
"Fake Series",
"Fake Episode 1",
1,
1,
SonarrEventType::Upgrade,
)]);

assert_eq!(grab_webhook.embeds[0].color, Some(0xFFC130));
assert_eq!(download_webhook.embeds[0].color, Some(0x29A44C));
assert_eq!(upgrade_webhook.embeds[0].color, Some(0x3E6800));
}
}
}

0 comments on commit c7b07bf

Please sign in to comment.