diff --git a/src/tests/http-data/krate_yanking_unyank_records_an_audit_action b/src/tests/http-data/routes_crates_versions_yank_unyank_unyank_records_an_audit_action similarity index 100% rename from src/tests/http-data/krate_yanking_unyank_records_an_audit_action rename to src/tests/http-data/routes_crates_versions_yank_unyank_unyank_records_an_audit_action diff --git a/src/tests/http-data/krate_yanking_yank_records_an_audit_action b/src/tests/http-data/routes_crates_versions_yank_unyank_yank_records_an_audit_action similarity index 100% rename from src/tests/http-data/krate_yanking_yank_records_an_audit_action rename to src/tests/http-data/routes_crates_versions_yank_unyank_yank_records_an_audit_action diff --git a/src/tests/krate/yanking.rs b/src/tests/krate/yanking.rs index 8ca2916b169..9417bb19305 100644 --- a/src/tests/krate/yanking.rs +++ b/src/tests/krate/yanking.rs @@ -1,43 +1,6 @@ -use crate::builders::{CrateBuilder, PublishBuilder}; +use crate::builders::PublishBuilder; +use crate::routes::crates::versions::yank_unyank::YankRequestHelper; use crate::util::{RequestHelper, TestApp}; -use crate::OkBool; -use http::StatusCode; - -impl crate::util::MockTokenUser { - /// Yank the specified version of the specified crate and run all pending background jobs - fn yank(&self, krate_name: &str, version: &str) -> crate::util::Response { - let url = format!("/api/v1/crates/{krate_name}/{version}/yank"); - let response = self.delete(&url); - self.app().run_pending_background_jobs(); - response - } - - /// Unyank the specified version of the specified crate and run all pending background jobs - fn unyank(&self, krate_name: &str, version: &str) -> crate::util::Response { - let url = format!("/api/v1/crates/{krate_name}/{version}/unyank"); - let response = self.put(&url, &[]); - self.app().run_pending_background_jobs(); - response - } -} - -impl crate::util::MockCookieUser { - /// Yank the specified version of the specified crate and run all pending background jobs - fn yank(&self, krate_name: &str, version: &str) -> crate::util::Response { - let url = format!("/api/v1/crates/{krate_name}/{version}/yank"); - let response = self.delete(&url); - self.app().run_pending_background_jobs(); - response - } - - /// Unyank the specified version of the specified crate and run all pending background jobs - fn unyank(&self, krate_name: &str, version: &str) -> crate::util::Response { - let url = format!("/api/v1/crates/{krate_name}/{version}/unyank"); - let response = self.put(&url, &[]); - self.app().run_pending_background_jobs(); - response - } -} #[test] #[allow(unknown_lints, clippy::bool_assert_comparison)] // for claim::assert_some_eq! with bool @@ -97,26 +60,6 @@ fn yank_works_as_intended() { assert!(!json.version.yanked); } -#[test] -fn yank_by_a_non_owner_fails() { - let (app, _, _, token) = TestApp::full().with_token(); - - let another_user = app.db_new_user("bar"); - let another_user = another_user.as_model(); - app.db(|conn| { - CrateBuilder::new("foo_not", another_user.id) - .version("1.0.0") - .expect_build(conn); - }); - - let response = token.yank("foo_not", "1.0.0"); - assert_eq!(response.status(), StatusCode::OK); - assert_eq!( - response.into_json(), - json!({ "errors": [{ "detail": "must already be an owner to yank or unyank" }] }) - ); -} - #[test] fn yank_max_version() { let (_, anon, _, token) = TestApp::full().with_token(); @@ -200,48 +143,3 @@ fn publish_after_yank_max_version() { let json = anon.show_crate("fyk_max"); assert_eq!(json.krate.max_version, "2.0.0"); } - -#[test] -fn yank_records_an_audit_action() { - let (_, anon, _, token) = TestApp::full().with_token(); - - // Upload a new crate, putting it in the git index - let crate_to_publish = PublishBuilder::new("fyk"); - token.publish_crate(crate_to_publish).good(); - - // Yank it - token.yank("fyk", "1.0.0").good(); - - // Make sure it has one publish and one yank audit action - let json = anon.show_version("fyk", "1.0.0"); - let actions = json.version.audit_actions; - - assert_eq!(actions.len(), 2); - let action = &actions[1]; - assert_eq!(action.action, "yank"); - assert_eq!(action.user.id, token.as_model().user_id); -} - -#[test] -fn unyank_records_an_audit_action() { - let (_, anon, _, token) = TestApp::full().with_token(); - - // Upload a new crate - let crate_to_publish = PublishBuilder::new("fyk"); - token.publish_crate(crate_to_publish).good(); - - // Yank version 1.0.0 - token.yank("fyk", "1.0.0").good(); - - // Unyank version 1.0.0 - token.unyank("fyk", "1.0.0").good(); - - // Make sure it has one publish, one yank, and one unyank audit action - let json = anon.show_version("fyk", "1.0.0"); - let actions = json.version.audit_actions; - - assert_eq!(actions.len(), 3); - let action = &actions[2]; - assert_eq!(action.action, "unyank"); - assert_eq!(action.user.id, token.as_model().user_id); -} diff --git a/src/tests/routes/crates/versions/mod.rs b/src/tests/routes/crates/versions/mod.rs index e390cf98a90..73deac5c613 100644 --- a/src/tests/routes/crates/versions/mod.rs +++ b/src/tests/routes/crates/versions/mod.rs @@ -2,3 +2,4 @@ mod authors; pub mod dependencies; pub mod download; mod read; +pub mod yank_unyank; diff --git a/src/tests/routes/crates/versions/yank_unyank.rs b/src/tests/routes/crates/versions/yank_unyank.rs new file mode 100644 index 00000000000..5a89bb9786a --- /dev/null +++ b/src/tests/routes/crates/versions/yank_unyank.rs @@ -0,0 +1,93 @@ +use crate::builders::{CrateBuilder, PublishBuilder}; +use crate::util::{RequestHelper, Response, TestApp}; +use crate::OkBool; +use http::StatusCode; + +pub trait YankRequestHelper { + /// Yank the specified version of the specified crate and run all pending background jobs + fn yank(&self, krate_name: &str, version: &str) -> Response; + + /// Unyank the specified version of the specified crate and run all pending background jobs + fn unyank(&self, krate_name: &str, version: &str) -> Response; +} + +impl YankRequestHelper for T { + fn yank(&self, krate_name: &str, version: &str) -> Response { + let url = format!("/api/v1/crates/{krate_name}/{version}/yank"); + let response = self.delete(&url); + self.app().run_pending_background_jobs(); + response + } + + fn unyank(&self, krate_name: &str, version: &str) -> Response { + let url = format!("/api/v1/crates/{krate_name}/{version}/unyank"); + let response = self.put(&url, &[]); + self.app().run_pending_background_jobs(); + response + } +} + +#[test] +fn yank_by_a_non_owner_fails() { + let (app, _, _, token) = TestApp::full().with_token(); + + let another_user = app.db_new_user("bar"); + let another_user = another_user.as_model(); + app.db(|conn| { + CrateBuilder::new("foo_not", another_user.id) + .version("1.0.0") + .expect_build(conn); + }); + + let response = token.yank("foo_not", "1.0.0"); + assert_eq!(response.status(), StatusCode::OK); + assert_eq!( + response.into_json(), + json!({ "errors": [{ "detail": "must already be an owner to yank or unyank" }] }) + ); +} + +#[test] +fn yank_records_an_audit_action() { + let (_, anon, _, token) = TestApp::full().with_token(); + + // Upload a new crate, putting it in the git index + let crate_to_publish = PublishBuilder::new("fyk"); + token.publish_crate(crate_to_publish).good(); + + // Yank it + token.yank("fyk", "1.0.0").good(); + + // Make sure it has one publish and one yank audit action + let json = anon.show_version("fyk", "1.0.0"); + let actions = json.version.audit_actions; + + assert_eq!(actions.len(), 2); + let action = &actions[1]; + assert_eq!(action.action, "yank"); + assert_eq!(action.user.id, token.as_model().user_id); +} + +#[test] +fn unyank_records_an_audit_action() { + let (_, anon, _, token) = TestApp::full().with_token(); + + // Upload a new crate + let crate_to_publish = PublishBuilder::new("fyk"); + token.publish_crate(crate_to_publish).good(); + + // Yank version 1.0.0 + token.yank("fyk", "1.0.0").good(); + + // Unyank version 1.0.0 + token.unyank("fyk", "1.0.0").good(); + + // Make sure it has one publish, one yank, and one unyank audit action + let json = anon.show_version("fyk", "1.0.0"); + let actions = json.version.audit_actions; + + assert_eq!(actions.len(), 3); + let action = &actions[2]; + assert_eq!(action.action, "unyank"); + assert_eq!(action.user.id, token.as_model().user_id); +}