|
1 |
| -//! Source code browser |
2 |
| -
|
3 | 1 | use super::{error::AxumResult, match_version_axum};
|
4 | 2 | use crate::{
|
5 | 3 | db::Pool,
|
@@ -307,8 +305,21 @@ pub(crate) async fn source_browser_handler(
|
307 | 305 | mod tests {
|
308 | 306 | use crate::test::*;
|
309 | 307 | use crate::web::cache::CachePolicy;
|
| 308 | + use kuchiki::traits::TendrilSink; |
310 | 309 | use test_case::test_case;
|
311 | 310 |
|
| 311 | + fn get_file_list_links(body: &str) -> Vec<String> { |
| 312 | + let dom = kuchiki::parse_html().one(body); |
| 313 | + |
| 314 | + dom.select(".package-menu > ul > li > a") |
| 315 | + .expect("invalid selector") |
| 316 | + .map(|el| { |
| 317 | + let attributes = el.attributes.borrow(); |
| 318 | + attributes.get("href").unwrap().to_string() |
| 319 | + }) |
| 320 | + .collect() |
| 321 | + } |
| 322 | + |
312 | 323 | #[test_case(true)]
|
313 | 324 | #[test_case(false)]
|
314 | 325 | fn fetch_source_file_content(archive_storage: bool) {
|
@@ -508,8 +519,72 @@ mod tests {
|
508 | 519 | .to_str()
|
509 | 520 | .unwrap()
|
510 | 521 | .starts_with("text/html"));
|
511 |
| - assert!(response.text()?.starts_with(r#"<!DOCTYPE html>"#)); |
512 | 522 |
|
| 523 | + let text = response.text()?; |
| 524 | + assert!(text.starts_with(r#"<!DOCTYPE html>"#)); |
| 525 | + |
| 526 | + // file list doesn't show "../" |
| 527 | + assert_eq!(get_file_list_links(&text), vec!["./config.json"]); |
| 528 | + |
| 529 | + Ok(()) |
| 530 | + }); |
| 531 | + } |
| 532 | + |
| 533 | + #[test] |
| 534 | + fn root_file_list() { |
| 535 | + wrapper(|env| { |
| 536 | + env.fake_release() |
| 537 | + .name("fake") |
| 538 | + .version("0.1.0") |
| 539 | + .source_file("folder1/some_filename.rs", b"some_random_content") |
| 540 | + .source_file("folder2/another_filename.rs", b"some_random_content") |
| 541 | + .source_file("root_filename.rs", b"some_random_content") |
| 542 | + .create()?; |
| 543 | + |
| 544 | + let web = env.frontend(); |
| 545 | + let response = web.get("/crate/fake/0.1.0/source/").send()?; |
| 546 | + assert!(response.status().is_success()); |
| 547 | + assert_cache_control( |
| 548 | + &response, |
| 549 | + CachePolicy::ForeverInCdnAndStaleInBrowser, |
| 550 | + &env.config(), |
| 551 | + ); |
| 552 | + |
| 553 | + assert_eq!( |
| 554 | + get_file_list_links(&response.text()?), |
| 555 | + vec!["./folder1/", "./folder2/", "./root_filename.rs"] |
| 556 | + ); |
| 557 | + Ok(()) |
| 558 | + }); |
| 559 | + } |
| 560 | + |
| 561 | + #[test] |
| 562 | + fn child_file_list() { |
| 563 | + wrapper(|env| { |
| 564 | + env.fake_release() |
| 565 | + .name("fake") |
| 566 | + .version("0.1.0") |
| 567 | + .source_file("folder1/some_filename.rs", b"some_random_content") |
| 568 | + .source_file("folder1/more_filenames.rs", b"some_random_content") |
| 569 | + .source_file("folder2/another_filename.rs", b"some_random_content") |
| 570 | + .source_file("root_filename.rs", b"some_random_content") |
| 571 | + .create()?; |
| 572 | + |
| 573 | + let web = env.frontend(); |
| 574 | + let response = web |
| 575 | + .get("/crate/fake/0.1.0/source/folder1/some_filename.rs") |
| 576 | + .send()?; |
| 577 | + assert!(response.status().is_success()); |
| 578 | + assert_cache_control( |
| 579 | + &response, |
| 580 | + CachePolicy::ForeverInCdnAndStaleInBrowser, |
| 581 | + &env.config(), |
| 582 | + ); |
| 583 | + |
| 584 | + assert_eq!( |
| 585 | + get_file_list_links(&response.text()?), |
| 586 | + vec!["../", "./more_filenames.rs", "./some_filename.rs"], |
| 587 | + ); |
513 | 588 | Ok(())
|
514 | 589 | });
|
515 | 590 | }
|
|
0 commit comments