From f10bcb59c3fb29f778ec6dcadf9aa034a1d77819 Mon Sep 17 00:00:00 2001 From: Sunjay Varma Date: Sun, 17 Dec 2017 13:20:46 -0700 Subject: [PATCH 1/4] Fixes #945 --- src/krate/mod.rs | 1 + src/tests/all.rs | 11 ++++ ...krate_publish_after_removing_documentation | 1 + src/tests/krate.rs | 64 +++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 src/tests/http-data/krate_publish_after_removing_documentation diff --git a/src/krate/mod.rs b/src/krate/mod.rs index 95830c24290..048e7bef98e 100644 --- a/src/krate/mod.rs +++ b/src/krate/mod.rs @@ -130,6 +130,7 @@ pub struct CrateLinks { #[derive(Insertable, AsChangeset, Default, Debug)] #[table_name = "crates"] +#[changeset_options(treat_none_as_null = "true")] #[primary_key(name, max_upload_size)] // This is actually just to skip updating them pub struct NewCrate<'a> { pub name: &'a str, diff --git a/src/tests/all.rs b/src/tests/all.rs index 9e6db0918ee..2da166ced38 100644 --- a/src/tests/all.rs +++ b/src/tests/all.rs @@ -544,6 +544,17 @@ fn new_req(app: Arc, krate: &str, version: &str) -> MockRequest { new_req_full(app, ::krate(krate), version, Vec::new()) } +fn new_req_with_documentation( + app: Arc, + krate: &str, + version: &str, + documentation: Option, +) -> MockRequest { + let mut krate = ::krate(krate); + krate.documentation = documentation; + new_req_full(app, krate, version, Vec::new()) +} + fn new_req_full( app: Arc, krate: Crate, diff --git a/src/tests/http-data/krate_publish_after_removing_documentation b/src/tests/http-data/krate_publish_after_removing_documentation new file mode 100644 index 00000000000..d6b7622395a --- /dev/null +++ b/src/tests/http-data/krate_publish_after_removing_documentation @@ -0,0 +1 @@ +[{"request":{"uri":"http://alexcrichton-test.s3.amazonaws.com/crates/docscrate/docscrate-0.2.1.crate","method":"PUT","headers":[["Proxy-Connection","Keep-Alive"],["Content-Type","application/x-tar"],["Accept","*/*"],["Date","Fri, 15 Sep 2017 07:53:06 -0700"],["Authorization","AWS AKIAICL5IWUZYWWKA7JA:RkpxRf+NUDyzjWrEMc1ikasbtZI="],["Content-Length","35"],["Host","alexcrichton-test.s3.amazonaws.com"]],"body":[31,139,8,0,0,0,0,0,0,255,237,192,1,1,0,0,0,130,32,255,175,110,72,80,192,171,1,46,175,181,239,0,4,0,0]},"response":{"status":200,"headers":[["ETag","\"f9016ad360cebb4fe2e6e96e5949f022\""],["Content-Length","0"],["Date","Fri, 15 Sep 2017 14:53:07 GMT"],["x-amz-id-2","Es2wWCc+tXkMbbp+bEcjLFQn6yGqPeAUiBI5XqXZ8mAZUIpe7vYiCfBfoU727trNpEFMymyhgZY="],["Server","AmazonS3"],["x-amz-request-id","98298F12367C7A0B"]],"body":[]}},{"request":{"uri":"http://alexcrichton-test.s3.amazonaws.com/crates/docscrate/docscrate-0.2.2.crate","method":"PUT","headers":[["Date","Fri, 15 Sep 2017 07:53:06 -0700"],["Authorization","AWS AKIAICL5IWUZYWWKA7JA:umuWs3XoGqsDipgMq04QAhq9Spc="],["Content-Type","application/x-tar"],["Host","alexcrichton-test.s3.amazonaws.com"],["Accept","*/*"],["Proxy-Connection","Keep-Alive"],["Content-Length","35"]],"body":[31,139,8,0,0,0,0,0,0,255,237,192,1,1,0,0,0,130,32,255,175,110,72,80,192,171,1,46,175,181,239,0,4,0,0]},"response":{"status":200,"headers":[["x-amz-request-id","2E4EDB9109077234"],["x-amz-id-2","gnBA5fngpIAF7AVe+goe2YZkL6gB7yRp25LNjBl7wqyMNeIXGMLTyWd/46bkoVNv/S9t9BZ5IB4="],["ETag","\"f9016ad360cebb4fe2e6e96e5949f022\""],["Date","Fri, 15 Sep 2017 14:53:07 GMT"],["Server","AmazonS3"],["Content-Length","0"]],"body":[]}}] diff --git a/src/tests/krate.rs b/src/tests/krate.rs index 414dc92280b..8dbb3b312f0 100644 --- a/src/tests/krate.rs +++ b/src/tests/krate.rs @@ -1576,6 +1576,70 @@ fn publish_after_yank_max_version() { assert_eq!(json.krate.max_version, "2.0.0"); } +#[test] +fn publish_after_removing_documentation() { + let (_b, app, middle) = ::app(); + + let user; + + // 1. Start with a crate with no documentation + { + let conn = app.diesel_database.get().unwrap(); + user = ::new_user("foo").create_or_update(&conn).unwrap(); + ::CrateBuilder::new("docscrate", user.id) + .version("0.2.0") + .expect_build(&conn); + } + + // Verify that crates start without any documentation so the next assertion can *prove* + // that it was the one that added the documentation + { + let mut req = ::req(app.clone(), Method::Get, "/api/v1/crates/docscrate"); + let mut response = ok_resp!(middle.call(&mut req)); + let json: CrateResponse = ::json(&mut response); + assert_eq!(json.krate.documentation, None); + } + + // 2. Add documentation + { + let mut req = ::new_req_with_documentation( + app.clone(), + "docscrate", + "0.2.1", + Some("http://foo.rs".to_owned()), + ); + ::sign_in_as(&mut req, &user); + let mut response = ok_resp!(middle.call(&mut req)); + let json: GoodCrate = ::json(&mut response); + assert_eq!(json.krate.documentation, Some("http://foo.rs".to_owned())); + } + + // Ensure latest version also has the same documentation + { + let mut req = ::req(app.clone(), Method::Get, "/api/v1/crates/docscrate"); + let mut response = ok_resp!(middle.call(&mut req)); + let json: CrateResponse = ::json(&mut response); + assert_eq!(json.krate.documentation, Some("http://foo.rs".to_owned())); + } + + // 3. Remove the documentation + { + let mut req = ::new_req_with_documentation(app.clone(), "docscrate", "0.2.2", None); + ::sign_in_as(&mut req, &user); + let mut response = ok_resp!(middle.call(&mut req)); + let json: GoodCrate = ::json(&mut response); + assert_eq!(json.krate.documentation, None); + } + + // Ensure latest version no longer has documentation + { + let mut req = ::req(app.clone(), Method::Get, "/api/v1/crates/docscrate"); + let mut response = ok_resp!(middle.call(&mut req)); + let json: CrateResponse = ::json(&mut response); + assert_eq!(json.krate.documentation, None); + } +} + #[test] fn bad_keywords() { let (_b, app, middle) = ::app(); From b73a797c0d653659c629b42698514025f7fa1b58 Mon Sep 17 00:00:00 2001 From: Sunjay Varma Date: Sun, 17 Dec 2017 15:32:08 -0700 Subject: [PATCH 2/4] Fixed clippy errors --- src/tests/krate.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/tests/krate.rs b/src/tests/krate.rs index 8dbb3b312f0..40245b544d6 100644 --- a/src/tests/krate.rs +++ b/src/tests/krate.rs @@ -1594,7 +1594,7 @@ fn publish_after_removing_documentation() { // Verify that crates start without any documentation so the next assertion can *prove* // that it was the one that added the documentation { - let mut req = ::req(app.clone(), Method::Get, "/api/v1/crates/docscrate"); + let mut req = ::req(Arc::clone(&app), Method::Get, "/api/v1/crates/docscrate"); let mut response = ok_resp!(middle.call(&mut req)); let json: CrateResponse = ::json(&mut response); assert_eq!(json.krate.documentation, None); @@ -1603,7 +1603,7 @@ fn publish_after_removing_documentation() { // 2. Add documentation { let mut req = ::new_req_with_documentation( - app.clone(), + Arc::clone(&app), "docscrate", "0.2.1", Some("http://foo.rs".to_owned()), @@ -1616,7 +1616,7 @@ fn publish_after_removing_documentation() { // Ensure latest version also has the same documentation { - let mut req = ::req(app.clone(), Method::Get, "/api/v1/crates/docscrate"); + let mut req = ::req(Arc::clone(&app), Method::Get, "/api/v1/crates/docscrate"); let mut response = ok_resp!(middle.call(&mut req)); let json: CrateResponse = ::json(&mut response); assert_eq!(json.krate.documentation, Some("http://foo.rs".to_owned())); @@ -1624,7 +1624,7 @@ fn publish_after_removing_documentation() { // 3. Remove the documentation { - let mut req = ::new_req_with_documentation(app.clone(), "docscrate", "0.2.2", None); + let mut req = ::new_req_with_documentation(Arc::clone(&app), "docscrate", "0.2.2", None); ::sign_in_as(&mut req, &user); let mut response = ok_resp!(middle.call(&mut req)); let json: GoodCrate = ::json(&mut response); @@ -1633,7 +1633,7 @@ fn publish_after_removing_documentation() { // Ensure latest version no longer has documentation { - let mut req = ::req(app.clone(), Method::Get, "/api/v1/crates/docscrate"); + let mut req = ::req(Arc::clone(&app), Method::Get, "/api/v1/crates/docscrate"); let mut response = ok_resp!(middle.call(&mut req)); let json: CrateResponse = ::json(&mut response); assert_eq!(json.krate.documentation, None); From adb071512dd7c877285ead5c86396d18920cb9dd Mon Sep 17 00:00:00 2001 From: "Carol (Nichols || Goulding)" Date: Wed, 14 Mar 2018 19:04:21 -0400 Subject: [PATCH 3/4] Have the test fn req_with_documentation always take documentation Otherwise, it isn't really with documentation :) We can use new_req to create a version without a documentation link. --- src/tests/all.rs | 4 ++-- src/tests/krate.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tests/all.rs b/src/tests/all.rs index 6a74e7201a2..93547f94507 100644 --- a/src/tests/all.rs +++ b/src/tests/all.rs @@ -552,10 +552,10 @@ fn new_req_with_documentation( app: Arc, krate: &str, version: &str, - documentation: Option, + documentation: &str, ) -> MockRequest { let mut krate = ::krate(krate); - krate.documentation = documentation; + krate.documentation = Some(documentation.into()); new_req_full(app, krate, version, Vec::new()) } diff --git a/src/tests/krate.rs b/src/tests/krate.rs index 6aa77663406..e9d8c1999fd 100644 --- a/src/tests/krate.rs +++ b/src/tests/krate.rs @@ -1603,7 +1603,7 @@ fn publish_after_removing_documentation() { Arc::clone(&app), "docscrate", "0.2.1", - Some("http://foo.rs".to_owned()), + "http://foo.rs", ); ::sign_in_as(&mut req, &user); let mut response = ok_resp!(middle.call(&mut req)); @@ -1621,7 +1621,7 @@ fn publish_after_removing_documentation() { // 3. Remove the documentation { - let mut req = ::new_req_with_documentation(Arc::clone(&app), "docscrate", "0.2.2", None); + let mut req = ::new_req(Arc::clone(&app), "docscrate", "0.2.2"); ::sign_in_as(&mut req, &user); let mut response = ok_resp!(middle.call(&mut req)); let json: GoodCrate = ::json(&mut response); From 59da18d4854ed30055fe148ed2c167ff5920607a Mon Sep 17 00:00:00 2001 From: "Carol (Nichols || Goulding)" Date: Wed, 14 Mar 2018 21:31:56 -0400 Subject: [PATCH 4/4] rustfmt --- src/tests/krate.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/tests/krate.rs b/src/tests/krate.rs index e9d8c1999fd..de46ad4aea2 100644 --- a/src/tests/krate.rs +++ b/src/tests/krate.rs @@ -1599,12 +1599,8 @@ fn publish_after_removing_documentation() { // 2. Add documentation { - let mut req = ::new_req_with_documentation( - Arc::clone(&app), - "docscrate", - "0.2.1", - "http://foo.rs", - ); + let mut req = + ::new_req_with_documentation(Arc::clone(&app), "docscrate", "0.2.1", "http://foo.rs"); ::sign_in_as(&mut req, &user); let mut response = ok_resp!(middle.call(&mut req)); let json: GoodCrate = ::json(&mut response);