#![expect(clippy::panic, reason = "test scaffolding")]
use std::fs;
use std::path::Path;
const MANIFEST_DIR: &str = env!("CARGO_MANIFEST_DIR");
fn read(rel: &str) -> String {
let path = Path::new(MANIFEST_DIR).join(rel);
fs::read_to_string(&path).unwrap_or_else(|e| panic!("read {}: {e}", path.display()))
}
const FRONTMATTER: &str = "\
---
id: changelog
title: Changelog
slug: /changelog
sidebar_label: Changelog
---
{/* GENERATED FILE — do not edit by hand. Regenerate with `scripts/sync-changelog-doc.sh`. */}
";
fn expected_site_changelog(changelog: &str) -> String {
let before_urls = if let Some(idx) = changelog.find("<!-- next-url -->") {
&changelog[..idx]
} else {
changelog
};
let stripped = before_urls
.lines()
.filter(|line| !line.starts_with("<!-- next-header -->"))
.collect::<Vec<_>>()
.join("\n");
let body = stripped.trim();
format!("{FRONTMATTER}{body}\n")
}
#[test]
fn docs_changelog_in_sync_with_root() {
let changelog = read("CHANGELOG.md");
let site_changelog = read("website/docs/changelog.md");
let expected = expected_site_changelog(&changelog);
assert_eq!(
site_changelog, expected,
"website/docs/changelog.md is out of sync with CHANGELOG.md.\n\
Run `scripts/sync-changelog-doc.sh` and commit the result."
);
}
#[test]
fn docs_changelog_has_no_machine_markers() {
let site_changelog = read("website/docs/changelog.md");
for marker in &["<!-- next-header -->", "<!-- next-url -->"] {
assert!(
!site_changelog.contains(marker),
"website/docs/changelog.md contains cargo-release marker `{marker}` \
which must be stripped. Run `scripts/sync-changelog-doc.sh`."
);
}
}
#[test]
fn docs_changelog_has_frontmatter() {
let site_changelog = read("website/docs/changelog.md");
assert!(
site_changelog.starts_with("---\n"),
"website/docs/changelog.md must start with YAML frontmatter"
);
assert!(
site_changelog.contains("title: Changelog"),
"website/docs/changelog.md frontmatter must include `title: Changelog`"
);
}