From e94aef173b345e2ec6b4a0c95cc553a86e0a9f6a Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Fri, 9 Feb 2024 20:12:54 +0100 Subject: [PATCH] Fix invalid release link generation --- ...d0839fd63d13b08546c1506e7163bd363c19.json} | 10 ++- src/web/crate_details.rs | 74 ++++++++++++++++++- 2 files changed, 78 insertions(+), 6 deletions(-) rename .sqlx/{query-23457d8f5ff3b551d5c4039615b4e72a4609ebfb0390708f5a61f7ab66db8808.json => query-3f0fb7b26fb494e04dab61a8a831d0839fd63d13b08546c1506e7163bd363c19.json} (53%) diff --git a/.sqlx/query-23457d8f5ff3b551d5c4039615b4e72a4609ebfb0390708f5a61f7ab66db8808.json b/.sqlx/query-3f0fb7b26fb494e04dab61a8a831d0839fd63d13b08546c1506e7163bd363c19.json similarity index 53% rename from .sqlx/query-23457d8f5ff3b551d5c4039615b4e72a4609ebfb0390708f5a61f7ab66db8808.json rename to .sqlx/query-3f0fb7b26fb494e04dab61a8a831d0839fd63d13b08546c1506e7163bd363c19.json index 001f093f4..430c9b09a 100644 --- a/.sqlx/query-23457d8f5ff3b551d5c4039615b4e72a4609ebfb0390708f5a61f7ab66db8808.json +++ b/.sqlx/query-3f0fb7b26fb494e04dab61a8a831d0839fd63d13b08546c1506e7163bd363c19.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n crates.id AS crate_id,\n releases.doc_targets\n FROM crates\n INNER JOIN releases on crates.id = releases.crate_id\n WHERE crates.name = $1 and releases.version = $2;", + "query": "SELECT\n crates.id AS crate_id,\n releases.doc_targets,\n releases.target_name\n FROM crates\n INNER JOIN releases on crates.id = releases.crate_id\n WHERE crates.name = $1 and releases.version = $2;", "describe": { "columns": [ { @@ -12,6 +12,11 @@ "ordinal": 1, "name": "doc_targets", "type_info": "Json" + }, + { + "ordinal": 2, + "name": "target_name", + "type_info": "Varchar" } ], "parameters": { @@ -21,9 +26,10 @@ ] }, "nullable": [ + false, false, false ] }, - "hash": "23457d8f5ff3b551d5c4039615b4e72a4609ebfb0390708f5a61f7ab66db8808" + "hash": "3f0fb7b26fb494e04dab61a8a831d0839fd63d13b08546c1506e7163bd363c19" } diff --git a/src/web/crate_details.rs b/src/web/crate_details.rs index 1fc0973c7..75126d3ef 100644 --- a/src/web/crate_details.rs +++ b/src/web/crate_details.rs @@ -469,7 +469,8 @@ pub(crate) async fn get_all_releases( let row = sqlx::query!( "SELECT crates.id AS crate_id, - releases.doc_targets + releases.doc_targets, + releases.target_name FROM crates INNER JOIN releases on crates.id = releases.crate_id WHERE crates.name = $1 and releases.version = $2;", @@ -504,9 +505,9 @@ pub(crate) async fn get_all_releases( (target, inner.trim_end_matches('/')) }; let inner_path = if inner_path.is_empty() { - format!("{}/index.html", params.name) + format!("{}/index.html", row.target_name) } else { - format!("{}/{inner_path}", params.name) + format!("{}/{inner_path}", row.target_name) }; let target = if target.is_empty() { @@ -517,7 +518,7 @@ pub(crate) async fn get_all_releases( let res = ReleaseList { releases, - target: target.to_string(), + target, inner_path, crate_name: params.name, }; @@ -1484,6 +1485,71 @@ mod tests { }); } + #[test] + fn check_crate_name_in_redirect() { + fn check_links(env: &TestEnvironment, url: &str, links: Vec) { + let response = env + .frontend() + .get(url) + .send() + .unwrap(); + assert!(response.status().is_success()); + + let platform_links: Vec = kuchikiki::parse_html() + .one(response.text().unwrap()) + .select("li a") + .expect("invalid selector") + .map(|el| { + let attributes = el.attributes.borrow(); + let url = attributes.get("href").expect("href").to_string(); + url + }) + .collect(); + + assert_eq!( + platform_links, + links, + ); + } + + wrapper(|env| { + env.fake_release() + .name("dummy-ba") + .version("0.4.0") + .rustdoc_file("dummy-ba/index.html") + .rustdoc_file("x86_64-unknown-linux-gnu/dummy-ba/index.html") + .add_target("x86_64-unknown-linux-gnu") + .create()?; + env.fake_release() + .name("dummy-ba") + .version("0.5.0") + .rustdoc_file("dummy-ba/index.html") + .rustdoc_file("x86_64-unknown-linux-gnu/dummy-ba/index.html") + .add_target("x86_64-unknown-linux-gnu") + .create()?; + + check_links( + env, + "/crate/dummy-ba/latest/menus/releases/dummy_ba/index.html", + vec![ + "/crate/dummy-ba/0.5.0/target-redirect/dummy_ba/index.html".to_string(), + "/crate/dummy-ba/0.4.0/target-redirect/dummy_ba/index.html".to_string(), + ], + ); + + check_links( + env, + "/crate/dummy-ba/latest/menus/releases/x86_64-unknown-linux-gnu/dummy_ba/index.html", + vec![ + "/crate/dummy-ba/0.5.0/target-redirect/x86_64-unknown-linux-gnu/dummy_ba/index.html".to_string(), + "/crate/dummy-ba/0.4.0/target-redirect/x86_64-unknown-linux-gnu/dummy_ba/index.html".to_string(), + ], + ); + + Ok(()) + }); + } + // Ensure that if there are more than a given number of targets, it will not generate them in // the HTML directly (they will be loaded by AJAX if the user opens the menu). #[test]