Skip to content

Commit c444b63

Browse files
robinhundtJoshua Nelson
authored and
Joshua Nelson
committed
Added tests for CrateNotFound and VersionNotFound errors
1 parent 501fe2a commit c444b63

File tree

2 files changed

+102
-15
lines changed

2 files changed

+102
-15
lines changed

src/web/error.rs

Lines changed: 90 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,37 @@ mod tests {
113113
use kuchiki::traits::TendrilSink;
114114

115115
#[test]
116-
fn check_404_page_content() {
116+
fn check_404_page_content_crate() {
117117
wrapper(|env| {
118118
let page = kuchiki::parse_html().one(
119119
env.frontend()
120-
.get("/page-which-doesnt-exist")
120+
.get("/crate-which-doesnt-exist")
121+
.send()?
122+
.text()?,
123+
);
124+
assert_eq!(page.select("#crate-title").unwrap().count(), 1);
125+
assert_eq!(
126+
page.select("#crate-title")
127+
.unwrap()
128+
.next()
129+
.unwrap()
130+
.text_contents(),
131+
"The requested crate does not exist",
132+
);
133+
134+
Ok(())
135+
});
136+
}
137+
138+
#[test]
139+
fn check_404_page_content_resource() {
140+
// Resources with a `.js` and `.ico` extension are special cased in the
141+
// routes_handler which is currently run last. This means that `get("resource.exe")` will
142+
// fail with a `no so such crate` instead of 'no such resource'
143+
wrapper(|env| {
144+
let page = kuchiki::parse_html().one(
145+
env.frontend()
146+
.get("/resource-which-doesnt-exist.js")
121147
.send()?
122148
.text()?,
123149
);
@@ -134,4 +160,66 @@ mod tests {
134160
Ok(())
135161
});
136162
}
163+
164+
#[test]
165+
fn check_404_page_content_not_semver_version() {
166+
wrapper(|env| {
167+
env.fake_release().name("dummy").create()?;
168+
let page =
169+
kuchiki::parse_html().one(env.frontend().get("/dummy/not-semver").send()?.text()?);
170+
assert_eq!(page.select("#crate-title").unwrap().count(), 1);
171+
assert_eq!(
172+
page.select("#crate-title")
173+
.unwrap()
174+
.next()
175+
.unwrap()
176+
.text_contents(),
177+
"The requested version does not exist",
178+
);
179+
180+
Ok(())
181+
});
182+
}
183+
184+
#[test]
185+
fn check_404_page_content_nonexistent_version() {
186+
wrapper(|env| {
187+
env.fake_release().name("dummy").version("1.0.0").create()?;
188+
let page = kuchiki::parse_html().one(env.frontend().get("/dummy/2.0").send()?.text()?);
189+
assert_eq!(page.select("#crate-title").unwrap().count(), 1);
190+
assert_eq!(
191+
page.select("#crate-title")
192+
.unwrap()
193+
.next()
194+
.unwrap()
195+
.text_contents(),
196+
"The requested version does not exist",
197+
);
198+
199+
Ok(())
200+
});
201+
}
202+
203+
#[test]
204+
fn check_404_page_content_any_version_all_yanked() {
205+
wrapper(|env| {
206+
env.fake_release()
207+
.name("dummy")
208+
.version("1.0.0")
209+
.yanked(true)
210+
.create()?;
211+
let page = kuchiki::parse_html().one(env.frontend().get("/dummy/*").send()?.text()?);
212+
assert_eq!(page.select("#crate-title").unwrap().count(), 1);
213+
assert_eq!(
214+
page.select("#crate-title")
215+
.unwrap()
216+
.next()
217+
.unwrap()
218+
.text_contents(),
219+
"The requested version does not exist",
220+
);
221+
222+
Ok(())
223+
});
224+
}
137225
}

src/web/mod.rs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -346,18 +346,17 @@ fn match_version(
346346
let mut versions_sem: Vec<(Version, i32)> = Vec::with_capacity(versions.len());
347347

348348
for version in versions.iter().filter(|(_, _, yanked)| !yanked) {
349-
// in theory a crate must always have a semver compatible version, but check result just in case
350-
versions_sem.push((
351-
Version::parse(&version.0).map_err(|_| {
352-
log::error!(
353-
"invalid semver in database for crate {}: {}",
354-
name,
355-
version.0
356-
);
357-
Nope::InternalServerError
358-
})?,
359-
version.1,
360-
));
349+
// in theory a crate must always have a semver compatible version,
350+
// but check result just in case
351+
let version_sem = Version::parse(&version.0).map_err(|_| {
352+
log::error!(
353+
"invalid semver in database for crate {}: {}",
354+
name,
355+
version.0
356+
);
357+
Nope::InternalServerError
358+
})?;
359+
versions_sem.push((version_sem, version.1));
361360
}
362361

363362
versions_sem.sort();
@@ -375,7 +374,7 @@ fn match_version(
375374
});
376375
}
377376

378-
// semver is acting weird for '*' (any) range if a crate only have pre-release versions
377+
// semver is acting weird for '*' (any) range if a crate only has pre-release versions
379378
// return first non-yanked version if requested version is '*'
380379
if req_version == "*" {
381380
return versions_sem

0 commit comments

Comments
 (0)