Skip to content

Commit 237a3ab

Browse files
Correctly set use_direct_platform_links field value depending if it is a crate root or not
1 parent 26cfbea commit 237a3ab

File tree

1 file changed

+68
-19
lines changed

1 file changed

+68
-19
lines changed

src/web/crate_details.rs

+68-19
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,11 @@ pub(crate) async fn get_all_platforms(
496496
Extension(pool): Extension<Pool>,
497497
uri: Uri,
498498
) -> AxumResult<AxumResponse> {
499+
let is_crate_root = params
500+
.path
501+
.as_ref()
502+
.map(|path| path == "index.html")
503+
.unwrap_or(true);
499504
let req_path: String = params.path.unwrap_or_default();
500505
let req_path: Vec<&str> = req_path.split('/').collect();
501506

@@ -618,7 +623,7 @@ pub(crate) async fn get_all_platforms(
618623
doc_targets,
619624
},
620625
inner_path,
621-
use_direct_platform_links: true,
626+
use_direct_platform_links: is_crate_root,
622627
current_target,
623628
};
624629
Ok(res.into_response())
@@ -1235,40 +1240,84 @@ mod tests {
12351240

12361241
#[test]
12371242
fn platform_links_are_direct_and_without_nofollow() {
1243+
fn check_links(response_text: String, ajax: bool, should_contain_redirect: bool) {
1244+
let platform_links: Vec<(String, String)> = kuchikiki::parse_html()
1245+
.one(response_text)
1246+
.select(&format!(r#"{}li a"#, if ajax { "" } else { "#platforms " }))
1247+
.expect("invalid selector")
1248+
.map(|el| {
1249+
let attributes = el.attributes.borrow();
1250+
let url = attributes.get("href").expect("href").to_string();
1251+
let rel = attributes.get("rel").unwrap_or("").to_string();
1252+
(url, rel)
1253+
})
1254+
.collect();
1255+
1256+
assert_eq!(platform_links.len(), 2);
1257+
1258+
for (url, rel) in platform_links {
1259+
assert_eq!(
1260+
url.contains("/target-redirect/"),
1261+
should_contain_redirect,
1262+
"ajax: {ajax:?}, should_contain_redirect: {should_contain_redirect:?}",
1263+
);
1264+
if !should_contain_redirect {
1265+
assert_eq!(rel, "");
1266+
} else {
1267+
assert_eq!(rel, "nofollow");
1268+
}
1269+
}
1270+
}
1271+
12381272
wrapper(|env| {
12391273
env.fake_release()
12401274
.name("dummy")
12411275
.version("0.4.0")
12421276
.rustdoc_file("dummy/index.html")
12431277
.rustdoc_file("x86_64-pc-windows-msvc/dummy/index.html")
1278+
.rustdoc_file("x86_64-pc-windows-msvc/dummy/struct.A.html")
12441279
.default_target("x86_64-unknown-linux-gnu")
12451280
.add_target("x86_64-pc-windows-msvc")
12461281
.create()?;
12471282

1283+
let response = env.frontend().get("/dummy/latest/dummy").send()?;
1284+
assert!(response.status().is_success());
1285+
check_links(response.text()?, false, true);
1286+
// Same test with AJAX endpoint.
12481287
let response = env
12491288
.frontend()
1250-
.get("/-/menus/platforms/dummy/0.4.0/x86_64-pc-windows-msvc")
1289+
.get("/-/menus/platforms/dummy/latest/dummy")
12511290
.send()?;
12521291
assert!(response.status().is_success());
1292+
check_links(response.text()?, true, false);
12531293

1254-
let platform_links: Vec<(String, String)> = kuchikiki::parse_html()
1255-
.one(response.text()?)
1256-
.select(r#"li a"#)
1257-
.expect("invalid selector")
1258-
.map(|el| {
1259-
let attributes = el.attributes.borrow();
1260-
let url = attributes.get("href").expect("href").to_string();
1261-
let rel = attributes.get("rel").unwrap_or("").to_string();
1262-
(url, rel)
1263-
})
1264-
.collect();
1265-
1266-
assert_eq!(platform_links.len(), 2);
1294+
let response = env
1295+
.frontend()
1296+
.get("/dummy/0.4.0/x86_64-pc-windows-msvc/dummy")
1297+
.send()?;
1298+
assert!(response.status().is_success());
1299+
check_links(response.text()?, false, true);
1300+
// Same test with AJAX endpoint.
1301+
let response = env
1302+
.frontend()
1303+
.get("/-/menus/platforms/dummy/0.4.0/x86_64-pc-windows-msvc/dummy")
1304+
.send()?;
1305+
assert!(response.status().is_success());
1306+
check_links(response.text()?, true, true);
12671307

1268-
for (url, rel) in platform_links {
1269-
assert!(!url.contains("/target-redirect/"));
1270-
assert_eq!(rel, "");
1271-
}
1308+
let response = env
1309+
.frontend()
1310+
.get("/dummy/0.4.0/x86_64-pc-windows-msvc/dummy/struct.A.html")
1311+
.send()?;
1312+
assert!(response.status().is_success());
1313+
check_links(response.text()?, false, true);
1314+
// Same test with AJAX endpoint.
1315+
let response = env
1316+
.frontend()
1317+
.get("/-/menus/platforms/dummy/0.4.0/x86_64-pc-windows-msvc/dummy/struct.A.html")
1318+
.send()?;
1319+
assert!(response.status().is_success());
1320+
check_links(response.text()?, true, true);
12721321

12731322
Ok(())
12741323
});

0 commit comments

Comments
 (0)