use crate::sources::news::aur::{extract_aur_pkg_from_url, render_aur_comments};
#[test]
fn test_extract_aur_pkg_from_url() {
assert_eq!(
extract_aur_pkg_from_url("https://aur.archlinux.org/packages/foo"),
Some("foo".to_string())
);
assert_eq!(
extract_aur_pkg_from_url("https://aur.archlinux.org/packages/foo/"),
Some("foo".to_string())
);
assert_eq!(
extract_aur_pkg_from_url("https://aur.archlinux.org/packages/foo-bar"),
Some("foo-bar".to_string())
);
assert_eq!(
extract_aur_pkg_from_url("https://aur.archlinux.org/packages/foo?query=bar"),
Some("foo".to_string())
);
assert_eq!(
extract_aur_pkg_from_url(
"https://aur.archlinux.org/packages/discord-canary#comment-1050019"
),
Some("discord-canary".to_string())
);
assert_eq!(
extract_aur_pkg_from_url("https://aur.archlinux.org/packages/foo#section"),
Some("foo".to_string())
);
assert_eq!(
extract_aur_pkg_from_url("https://archlinux.org/news/item"),
None
);
}
#[test]
fn test_render_aur_comments() {
use crate::state::types::AurComment;
use chrono::{Duration, Utc};
let now = Utc::now().timestamp();
let cutoff = now - Duration::days(7).num_seconds();
let comments = vec![
AurComment {
id: Some("c1".into()),
author: "user1".into(),
date: "2025-01-01 00:00 (UTC)".into(),
date_timestamp: Some(cutoff + 86400), date_url: Some("https://aur.archlinux.org/packages/foo#comment-1".into()),
content: "Recent comment".into(),
pinned: false,
},
AurComment {
id: Some("c2".into()),
author: "maintainer".into(),
date: "2024-12-01 00:00 (UTC)".into(),
date_timestamp: Some(cutoff - 86400), date_url: Some("https://aur.archlinux.org/packages/foo#comment-2".into()),
content: "Pinned comment".into(),
pinned: true,
},
];
let rendered = render_aur_comments("foo", &comments);
assert!(rendered.contains("AUR comments for foo"));
assert!(rendered.contains("[Pinned]"));
assert!(rendered.contains("Recent (last 7 days)"));
assert!(rendered.contains("Recent comment"));
assert!(rendered.contains("Pinned comment"));
}
#[test]
fn test_render_aur_comments_excludes_invalid_dates() {
use crate::state::types::AurComment;
use chrono::{Duration, Utc};
let now = Utc::now().timestamp();
let cutoff = now - Duration::days(7).num_seconds();
let comments = vec![
AurComment {
id: Some("c1".into()),
author: "user1".into(),
date: "2025-04-14 11:52 (UTC+2)".into(),
date_timestamp: None, date_url: Some("https://aur.archlinux.org/packages/foo#comment-1".into()),
content: "Comment with unparseable date".into(),
pinned: false,
},
AurComment {
id: Some("c2".into()),
author: "user2".into(),
date: "2025-12-25 00:00 (UTC)".into(),
date_timestamp: Some(now + Duration::days(365).num_seconds()), date_url: Some("https://aur.archlinux.org/packages/foo#comment-2".into()),
content: "Comment with future date".into(),
pinned: false,
},
AurComment {
id: Some("c3".into()),
author: "user3".into(),
date: "2024-01-01 00:00 (UTC)".into(),
date_timestamp: Some(cutoff - 86400), date_url: Some("https://aur.archlinux.org/packages/foo#comment-3".into()),
content: "Old comment".into(),
pinned: false,
},
AurComment {
id: Some("c4".into()),
author: "user4".into(),
date: "2025-01-01 00:00 (UTC)".into(),
date_timestamp: Some(cutoff + 86400), date_url: Some("https://aur.archlinux.org/packages/foo#comment-4".into()),
content: "Recent comment".into(),
pinned: false,
},
];
let rendered = render_aur_comments("foo", &comments);
assert!(rendered.contains("AUR comments for foo"));
assert!(rendered.contains("Recent (last 7 days)"));
assert!(rendered.contains("Recent comment")); assert!(!rendered.contains("Comment with unparseable date")); assert!(!rendered.contains("Comment with future date")); assert!(!rendered.contains("Old comment")); }
#[test]
fn test_render_aur_comments_fallback_label() {
use crate::state::types::AurComment;
use chrono::{Duration, Utc};
let now = Utc::now().timestamp();
let cutoff = now - Duration::days(7).num_seconds();
let comments = vec![AurComment {
id: Some("c1".into()),
author: "user1".into(),
date: "2024-01-01 00:00 (UTC)".into(),
date_timestamp: Some(cutoff - 86400), date_url: Some("https://aur.archlinux.org/packages/foo#comment-1".into()),
content: "Old comment".into(),
pinned: false,
}];
let rendered = render_aur_comments("foo", &comments);
assert!(rendered.contains("AUR comments for foo"));
assert!(rendered.contains("Latest comment")); assert!(!rendered.contains("Recent (last 7 days)")); assert!(rendered.contains("Old comment")); }