use assert_cmd::Command;
use serde_json::Value;
#[test]
fn get_item_survives_rolled_window_and_accepts_guid_url() {
let mut server = mockito::Server::new();
let body = r#"<rss version="2.0"><channel><title>x</title>
<item><title>Post</title>
<link>https://ex.test/p/abc/</link>
<guid>t3_abc</guid>
<pubDate>Mon, 02 Jun 2026 00:00:00 GMT</pubDate>
<description>full body here</description></item>
</channel></rss>"#;
let m1 = server
.mock("GET", "/feed.xml")
.with_status(200)
.with_body(body)
.expect(1)
.create();
let url = format!("{}/feed.xml", server.url());
let cache = tempfile::tempdir().unwrap();
let cache_arg = cache.path().to_str().unwrap();
let out = Command::cargo_bin("rss")
.unwrap()
.args(["--cache-dir", cache_arg, "fetch", &url, "--format", "json"])
.assert()
.success()
.get_output()
.stdout
.clone();
let json: Value = serde_json::from_slice(&out).unwrap();
let item = &json["feeds"][0]["items"][0];
let id = item["id"].as_str().unwrap().to_string();
assert_eq!(item["guid"].as_str(), Some("t3_abc"));
Command::cargo_bin("rss")
.unwrap()
.args(["--cache-dir", cache_arg, "show", &url, "--id", &id])
.assert()
.success()
.stdout(predicates::str::contains("full body here"));
Command::cargo_bin("rss")
.unwrap()
.args(["--cache-dir", cache_arg, "show", &url, "--id", "t3_abc"])
.assert()
.success()
.stdout(predicates::str::contains("full body here"));
Command::cargo_bin("rss")
.unwrap()
.args([
"--cache-dir",
cache_arg,
"show",
&url,
"--id",
"https://ex.test/p/abc/",
])
.assert()
.success()
.stdout(predicates::str::contains("full body here"));
m1.assert();
}