From a52213556c8939abf37c010030ce1a4460e9869a Mon Sep 17 00:00:00 2001 From: Lin Yihai Date: Thu, 1 Feb 2024 05:51:17 +0800 Subject: [PATCH] test: Add test for optional suffix --- src/test/fakes.rs | 5 +++++ src/utils/cargo_metadata.rs | 19 +++++++++++++++++++ src/web/rustdoc.rs | 37 ++++++++++++++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/test/fakes.rs b/src/test/fakes.rs index c6bfdb091..4729d84bc 100644 --- a/src/test/fakes.rs +++ b/src/test/fakes.rs @@ -115,6 +115,11 @@ impl<'a> FakeRelease<'a> { self } + pub(crate) fn add_dependency(mut self, dependency: Dependency) -> Self { + self.package.dependencies.push(dependency); + self + } + pub(crate) fn release_time(mut self, new: DateTime) -> Self { self.registry_release_data.release_time = new; self diff --git a/src/utils/cargo_metadata.rs b/src/utils/cargo_metadata.rs index 41bb56015..551131801 100644 --- a/src/utils/cargo_metadata.rs +++ b/src/utils/cargo_metadata.rs @@ -130,6 +130,25 @@ pub(crate) struct Dependency { pub(crate) optional: bool, } +impl Dependency { + #[cfg(test)] + pub fn new(name: String, req: String) -> Dependency { + Dependency { + name, + req, + kind: None, + rename: None, + optional: false, + } + } + + #[cfg(test)] + pub fn set_optional(mut self, optional: bool) -> Self { + self.optional = optional; + self + } +} + #[derive(Deserialize, Serialize)] struct DeserializedMetadata { packages: Vec, diff --git a/src/web/rustdoc.rs b/src/web/rustdoc.rs index 694100c71..23f4f1f03 100644 --- a/src/web/rustdoc.rs +++ b/src/web/rustdoc.rs @@ -885,7 +885,7 @@ pub(crate) async fn static_asset_handler( #[cfg(test)] mod test { - use crate::{test::*, web::cache::CachePolicy, Config}; + use crate::{test::*, utils::Dependency, web::cache::CachePolicy, Config}; use anyhow::Context; use kuchikiki::traits::TendrilSink; use reqwest::{blocking::ClientBuilder, redirect, StatusCode}; @@ -2345,6 +2345,41 @@ mod test { }) } + #[test] + fn test_dependency_optional_suffix() { + wrapper(|env| { + env.fake_release() + .name("testing") + .version("0.1.0") + .rustdoc_file("testing/index.html") + .add_dependency( + Dependency::new("optional-dep".to_string(), "1.2.3".to_string()) + .set_optional(true), + ) + .create()?; + + let dom = kuchikiki::parse_html().one( + env.frontend() + .get("/testing/0.1.0/testing/") + .send()? + .text()?, + ); + assert!(dom + .select(r#"a[href="/optional-dep/1.2.3"] > i[class="dependencies normal"] + i"#) + .expect("shoud have optional dependency") + .any(|el| { el.text_contents().contains("optional") })); + let dom = kuchikiki::parse_html() + .one(env.frontend().get("/crate/testing/0.1.0").send()?.text()?); + assert!(dom + .select( + r#"a[href="/crate/optional-dep/1.2.3"] > i[class="dependencies normal"] + i"# + ) + .expect("shoud have optional dependency") + .any(|el| { el.text_contents().contains("optional") })); + Ok(()) + }) + } + #[test_case(true)] #[test_case(false)] fn test_missing_target_redirects_to_search(archive_storage: bool) {