Skip to content

Commit 6930a33

Browse files
committed
tests: Move GET /crates/:name/downloads tests to krate::downloads module
1 parent 9628148 commit 6930a33

File tree

2 files changed

+94
-88
lines changed

2 files changed

+94
-88
lines changed

src/tests/krate/downloads.rs

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
use crate::builders::{CrateBuilder, VersionBuilder};
2+
use crate::util::{RequestHelper, TestApp};
3+
use cargo_registry::views::EncodableVersionDownload;
4+
use chrono::{Duration, Utc};
5+
use http::StatusCode;
6+
7+
#[derive(Deserialize)]
8+
struct Downloads {
9+
version_downloads: Vec<EncodableVersionDownload>,
10+
}
11+
12+
#[test]
13+
fn download() {
14+
let (app, anon, user) = TestApp::init().with_user();
15+
let user = user.as_model();
16+
17+
app.db(|conn| {
18+
CrateBuilder::new("foo_download", user.id)
19+
.version(VersionBuilder::new("1.0.0"))
20+
.expect_build(conn);
21+
});
22+
23+
let assert_dl_count = |name_and_version: &str, query: Option<&str>, count: i32| {
24+
let url = format!("/api/v1/crates/{}/downloads", name_and_version);
25+
let downloads: Downloads = if let Some(query) = query {
26+
anon.get_with_query(&url, query).good()
27+
} else {
28+
anon.get(&url).good()
29+
};
30+
let total_downloads = downloads
31+
.version_downloads
32+
.iter()
33+
.map(|vd| vd.downloads)
34+
.sum::<i32>();
35+
assert_eq!(total_downloads, count);
36+
};
37+
38+
let download = |name_and_version: &str| {
39+
let url = format!("/api/v1/crates/{}/download", name_and_version);
40+
anon.get::<()>(&url).assert_status(StatusCode::FOUND);
41+
// TODO: test the with_json code path
42+
};
43+
44+
download("foo_download/1.0.0");
45+
assert_dl_count("foo_download/1.0.0", None, 1);
46+
assert_dl_count("foo_download", None, 1);
47+
48+
download("FOO_DOWNLOAD/1.0.0");
49+
assert_dl_count("FOO_DOWNLOAD/1.0.0", None, 2);
50+
assert_dl_count("FOO_DOWNLOAD", None, 2);
51+
52+
let yesterday = (Utc::today() + Duration::days(-1)).format("%F");
53+
let query = format!("before_date={}", yesterday);
54+
assert_dl_count("FOO_DOWNLOAD/1.0.0", Some(&query), 0);
55+
// crate/downloads always returns the last 90 days and ignores date params
56+
assert_dl_count("FOO_DOWNLOAD", Some(&query), 2);
57+
58+
let tomorrow = (Utc::today() + Duration::days(1)).format("%F");
59+
let query = format!("before_date={}", tomorrow);
60+
assert_dl_count("FOO_DOWNLOAD/1.0.0", Some(&query), 2);
61+
assert_dl_count("FOO_DOWNLOAD", Some(&query), 2);
62+
}
63+
64+
#[test]
65+
fn download_nonexistent_version_of_existing_crate_404s() {
66+
let (app, anon, user) = TestApp::init().with_user();
67+
let user = user.as_model();
68+
69+
app.db(|conn| {
70+
CrateBuilder::new("foo_bad", user.id).expect_build(conn);
71+
});
72+
73+
anon.get("/api/v1/crates/foo_bad/0.1.0/download")
74+
.assert_not_found();
75+
}
76+
77+
#[test]
78+
fn download_noncanonical_crate_name() {
79+
let (app, anon, user) = TestApp::init().with_user();
80+
let user = user.as_model();
81+
82+
app.db(|conn| {
83+
CrateBuilder::new("foo_download", user.id)
84+
.version(VersionBuilder::new("1.0.0"))
85+
.expect_build(conn);
86+
});
87+
88+
// Request download for "foo-download" with a dash instead of an underscore,
89+
// and assert that the correct download link is returned.
90+
anon.get::<()>("/api/v1/crates/foo-download/1.0.0/download")
91+
.assert_redirect_ends_with("/crates/foo_download/foo_download-1.0.0.crate");
92+
}

src/tests/krate/mod.rs

Lines changed: 2 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ use crate::{
55
use cargo_registry::{
66
models::Category,
77
schema::crates,
8-
views::{EncodableDependency, EncodableVersion, EncodableVersionDownload},
8+
views::{EncodableDependency, EncodableVersion},
99
};
1010

1111
use conduit::StatusCode;
1212
use diesel::{dsl::*, prelude::*, update};
1313

14+
mod downloads;
1415
mod publish;
1516
mod summary;
1617
mod versions;
@@ -25,10 +26,6 @@ struct RevDeps {
2526
versions: Vec<EncodableVersion>,
2627
meta: CrateMeta,
2728
}
28-
#[derive(Deserialize)]
29-
struct Downloads {
30-
version_downloads: Vec<EncodableVersionDownload>,
31-
}
3229

3330
impl crate::util::MockAnonymousUser {
3431
fn reverse_dependencies(&self, krate_name: &str) -> RevDeps {
@@ -640,89 +637,6 @@ fn yanked_versions_are_not_considered_for_max_version() {
640637
assert_eq!(json.crates[0].max_version, "1.0.0");
641638
}
642639

643-
#[test]
644-
fn download() {
645-
use chrono::{Duration, Utc};
646-
let (app, anon, user) = TestApp::init().with_user();
647-
let user = user.as_model();
648-
649-
app.db(|conn| {
650-
CrateBuilder::new("foo_download", user.id)
651-
.version(VersionBuilder::new("1.0.0"))
652-
.expect_build(conn);
653-
});
654-
655-
let assert_dl_count = |name_and_version: &str, query: Option<&str>, count: i32| {
656-
let url = format!("/api/v1/crates/{}/downloads", name_and_version);
657-
let downloads: Downloads = if let Some(query) = query {
658-
anon.get_with_query(&url, query).good()
659-
} else {
660-
anon.get(&url).good()
661-
};
662-
let total_downloads = downloads
663-
.version_downloads
664-
.iter()
665-
.map(|vd| vd.downloads)
666-
.sum::<i32>();
667-
assert_eq!(total_downloads, count);
668-
};
669-
670-
let download = |name_and_version: &str| {
671-
let url = format!("/api/v1/crates/{}/download", name_and_version);
672-
anon.get::<()>(&url).assert_status(StatusCode::FOUND);
673-
// TODO: test the with_json code path
674-
};
675-
676-
download("foo_download/1.0.0");
677-
assert_dl_count("foo_download/1.0.0", None, 1);
678-
assert_dl_count("foo_download", None, 1);
679-
680-
download("FOO_DOWNLOAD/1.0.0");
681-
assert_dl_count("FOO_DOWNLOAD/1.0.0", None, 2);
682-
assert_dl_count("FOO_DOWNLOAD", None, 2);
683-
684-
let yesterday = (Utc::today() + Duration::days(-1)).format("%F");
685-
let query = format!("before_date={}", yesterday);
686-
assert_dl_count("FOO_DOWNLOAD/1.0.0", Some(&query), 0);
687-
// crate/downloads always returns the last 90 days and ignores date params
688-
assert_dl_count("FOO_DOWNLOAD", Some(&query), 2);
689-
690-
let tomorrow = (Utc::today() + Duration::days(1)).format("%F");
691-
let query = format!("before_date={}", tomorrow);
692-
assert_dl_count("FOO_DOWNLOAD/1.0.0", Some(&query), 2);
693-
assert_dl_count("FOO_DOWNLOAD", Some(&query), 2);
694-
}
695-
696-
#[test]
697-
fn download_nonexistent_version_of_existing_crate_404s() {
698-
let (app, anon, user) = TestApp::init().with_user();
699-
let user = user.as_model();
700-
701-
app.db(|conn| {
702-
CrateBuilder::new("foo_bad", user.id).expect_build(conn);
703-
});
704-
705-
anon.get("/api/v1/crates/foo_bad/0.1.0/download")
706-
.assert_not_found();
707-
}
708-
709-
#[test]
710-
fn download_noncanonical_crate_name() {
711-
let (app, anon, user) = TestApp::init().with_user();
712-
let user = user.as_model();
713-
714-
app.db(|conn| {
715-
CrateBuilder::new("foo_download", user.id)
716-
.version(VersionBuilder::new("1.0.0"))
717-
.expect_build(conn);
718-
});
719-
720-
// Request download for "foo-download" with a dash instead of an underscore,
721-
// and assert that the correct download link is returned.
722-
anon.get::<()>("/api/v1/crates/foo-download/1.0.0/download")
723-
.assert_redirect_ends_with("/crates/foo_download/foo_download-1.0.0.crate");
724-
}
725-
726640
#[test]
727641
fn dependencies() {
728642
let (app, anon, user) = TestApp::init().with_user();

0 commit comments

Comments
 (0)