Skip to content

Commit b0b4276

Browse files
committed
Auto merge of #1760 - integer32llc:finish-updating-tests, r=jtgeibel
Finish updating tests This converts the remaining tests to the newer test API, so that we can continue to move forward with improvements without some of the tests lagging behind. I do think there's more to be done to make the tests easier to read, write, and debug, and I am introducing some duplication and abstractions I'm not happy with. Next pass though.
2 parents 9de5691 + 9e79038 commit b0b4276

File tree

5 files changed

+368
-554
lines changed

5 files changed

+368
-554
lines changed

src/tests/all.rs

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ extern crate serde_json;
1717

1818
use crate::util::{Bad, RequestHelper, TestApp};
1919
use cargo_registry::{
20-
middleware::current_user::AuthenticationSource,
2120
models::{Crate, CrateOwner, Dependency, NewCategory, NewTeam, NewUser, Team, User, Version},
2221
schema::crate_owners,
2322
util::CargoResult,
24-
views::{EncodableCrate, EncodableKeyword, EncodableOwner, EncodableVersion, GoodCrate},
23+
views::{
24+
EncodableCategory, EncodableCategoryWithSubcategories, EncodableCrate, EncodableKeyword,
25+
EncodableOwner, EncodableVersion, GoodCrate,
26+
},
2527
App, Config, Env, Replica, Uploader,
2628
};
2729
use std::{
@@ -32,7 +34,6 @@ use std::{
3234
},
3335
};
3436

35-
use conduit::Request;
3637
use conduit_test::MockRequest;
3738
use diesel::prelude::*;
3839
use reqwest::{Client, Proxy};
@@ -47,26 +48,6 @@ macro_rules! t {
4748
};
4849
}
4950

50-
macro_rules! ok_resp {
51-
($e:expr) => {{
52-
let resp = t!($e);
53-
if !crate::ok_resp(&resp) {
54-
panic!("bad response: {:?}", resp.status);
55-
}
56-
resp
57-
}};
58-
}
59-
60-
macro_rules! bad_resp {
61-
($e:expr) => {{
62-
let mut resp = t!($e);
63-
match crate::bad_resp(&mut resp) {
64-
None => panic!("ok response: {:?}", resp.status),
65-
Some(b) => b,
66-
}
67-
}};
68-
}
69-
7051
mod badge;
7152
mod builders;
7253
mod categories;
@@ -110,6 +91,23 @@ pub struct OwnerTeamsResponse {
11091
teams: Vec<EncodableOwner>,
11192
}
11293
#[derive(Deserialize)]
94+
pub struct OwnersResponse {
95+
users: Vec<EncodableOwner>,
96+
}
97+
#[derive(Deserialize)]
98+
pub struct CategoryResponse {
99+
category: EncodableCategoryWithSubcategories,
100+
}
101+
#[derive(Deserialize)]
102+
pub struct CategoryListResponse {
103+
categories: Vec<EncodableCategory>,
104+
meta: CategoryMeta,
105+
}
106+
#[derive(Deserialize)]
107+
pub struct CategoryMeta {
108+
total: i32,
109+
}
110+
#[derive(Deserialize)]
113111
pub struct OkBool {
114112
ok: bool,
115113
}
@@ -254,12 +252,6 @@ fn add_team_to_crate(t: &Team, krate: &Crate, u: &User, conn: &PgConnection) ->
254252
Ok(())
255253
}
256254

257-
fn sign_in_as(req: &mut dyn Request, user: &User) {
258-
req.mut_extensions().insert(user.clone());
259-
req.mut_extensions()
260-
.insert(AuthenticationSource::SessionCookie);
261-
}
262-
263255
fn new_dependency(conn: &PgConnection, version: &Version, krate: &Crate) -> Dependency {
264256
use cargo_registry::schema::dependencies::dsl::*;
265257
use diesel::insert_into;
@@ -285,10 +277,6 @@ fn new_category<'a>(category: &'a str, slug: &'a str, description: &'a str) -> N
285277
}
286278
}
287279

288-
fn logout(req: &mut dyn Request) {
289-
req.mut_extensions().pop::<User>();
290-
}
291-
292280
#[test]
293281
fn multiple_live_references_to_the_same_connection_can_be_checked_out() {
294282
use std::ptr;

src/tests/category.rs

Lines changed: 71 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,8 @@
1-
use crate::{app, builders::CrateBuilder, new_category, new_user, req, RequestHelper, TestApp};
2-
use cargo_registry::{
3-
models::Category,
4-
views::{EncodableCategory, EncodableCategoryWithSubcategories},
1+
use crate::{
2+
builders::CrateBuilder, new_category, util::MockAnonymousUser, RequestHelper, TestApp,
53
};
4+
use cargo_registry::{models::Category, views::EncodableCategoryWithSubcategories};
65

7-
use conduit::{Handler, Method};
8-
9-
#[derive(Deserialize)]
10-
struct CategoryList {
11-
categories: Vec<EncodableCategory>,
12-
meta: CategoryMeta,
13-
}
14-
#[derive(Deserialize)]
15-
struct CategoryMeta {
16-
total: i32,
17-
}
18-
#[derive(Deserialize)]
19-
struct GoodCategory {
20-
category: EncodableCategory,
21-
}
226
#[derive(Deserialize)]
237
struct CategoryWithSubcategories {
248
category: EncodableCategoryWithSubcategories,
@@ -27,10 +11,9 @@ struct CategoryWithSubcategories {
2711
#[test]
2812
fn index() {
2913
let (app, anon) = TestApp::init().empty();
30-
let url = "/api/v1/categories";
3114

3215
// List 0 categories if none exist
33-
let json: CategoryList = anon.get(url).good();
16+
let json = anon.show_category_list();
3417
assert_eq!(json.categories.len(), 0);
3518
assert_eq!(json.meta.total, 0);
3619

@@ -45,7 +28,7 @@ fn index() {
4528
});
4629

4730
// Only the top-level categories should be on the page
48-
let json: CategoryList = anon.get(url).good();
31+
let json = anon.show_category_list();
4932
assert_eq!(json.categories.len(), 1);
5033
assert_eq!(json.meta.total, 1);
5134
assert_eq!(json.categories[0].category, "foo");
@@ -76,94 +59,76 @@ fn show() {
7659
#[test]
7760
#[allow(clippy::cognitive_complexity)]
7861
fn update_crate() {
79-
let (app, middle) = app();
80-
let mut req = req(Method::Get, "/api/v1/categories/foo");
81-
macro_rules! cnt {
82-
($req:expr, $cat:expr) => {{
83-
$req.with_path(&format!("/api/v1/categories/{}", $cat));
84-
let mut response = ok_resp!(middle.call($req));
85-
crate::json::<GoodCategory>(&mut response)
86-
.category
87-
.crates_cnt as usize
88-
}};
62+
// Convenience function to get the number of crates in a category
63+
fn count(anon: &MockAnonymousUser, category: &str) -> usize {
64+
let json = anon.show_category(category);
65+
json.category.crates_cnt as usize
8966
}
9067

91-
let krate = {
92-
let conn = t!(app.diesel_database.get());
93-
let user = t!(new_user("foo").create_or_update(&conn));
94-
t!(new_category("cat1", "cat1", "Category 1 crates").create_or_update(&conn));
95-
t!(new_category("Category 2", "category-2", "Category 2 crates").create_or_update(&conn));
96-
CrateBuilder::new("foo_crate", user.id).expect_build(&conn)
97-
};
68+
let (app, anon, user) = TestApp::init().with_user();
69+
let user = user.as_model();
9870

99-
// Updating with no categories has no effect
100-
Category::update_crate(&app.diesel_database.get().unwrap(), &krate, &[]).unwrap();
101-
assert_eq!(cnt!(&mut req, "cat1"), 0);
102-
assert_eq!(cnt!(&mut req, "category-2"), 0);
103-
104-
// Happy path adding one category
105-
Category::update_crate(&app.diesel_database.get().unwrap(), &krate, &["cat1"]).unwrap();
106-
assert_eq!(cnt!(&mut req, "cat1"), 1);
107-
assert_eq!(cnt!(&mut req, "category-2"), 0);
108-
109-
// Replacing one category with another
110-
Category::update_crate(&app.diesel_database.get().unwrap(), &krate, &["category-2"]).unwrap();
111-
assert_eq!(cnt!(&mut req, "cat1"), 0);
112-
assert_eq!(cnt!(&mut req, "category-2"), 1);
113-
114-
// Removing one category
115-
Category::update_crate(&app.diesel_database.get().unwrap(), &krate, &[]).unwrap();
116-
assert_eq!(cnt!(&mut req, "cat1"), 0);
117-
assert_eq!(cnt!(&mut req, "category-2"), 0);
118-
119-
// Adding 2 categories
120-
Category::update_crate(
121-
&app.diesel_database.get().unwrap(),
122-
&krate,
123-
&["cat1", "category-2"],
124-
)
125-
.unwrap();
126-
assert_eq!(cnt!(&mut req, "cat1"), 1);
127-
assert_eq!(cnt!(&mut req, "category-2"), 1);
128-
129-
// Removing all categories
130-
Category::update_crate(&app.diesel_database.get().unwrap(), &krate, &[]).unwrap();
131-
assert_eq!(cnt!(&mut req, "cat1"), 0);
132-
assert_eq!(cnt!(&mut req, "category-2"), 0);
133-
134-
// Attempting to add one valid category and one invalid category
135-
let invalid_categories = Category::update_crate(
136-
&app.diesel_database.get().unwrap(),
137-
&krate,
138-
&["cat1", "catnope"],
139-
)
140-
.unwrap();
141-
assert_eq!(invalid_categories, vec!["catnope"]);
142-
assert_eq!(cnt!(&mut req, "cat1"), 1);
143-
assert_eq!(cnt!(&mut req, "category-2"), 0);
144-
145-
// Does not add the invalid category to the category list
146-
// (unlike the behavior of keywords)
147-
req.with_path("/api/v1/categories");
148-
let mut response = ok_resp!(middle.call(&mut req));
149-
let json: CategoryList = crate::json(&mut response);
150-
assert_eq!(json.categories.len(), 2);
151-
assert_eq!(json.meta.total, 2);
152-
153-
// Attempting to add a category by display text; must use slug
154-
Category::update_crate(&app.diesel_database.get().unwrap(), &krate, &["Category 2"]).unwrap();
155-
assert_eq!(cnt!(&mut req, "cat1"), 0);
156-
assert_eq!(cnt!(&mut req, "category-2"), 0);
157-
158-
// Add a category and its subcategory
159-
{
160-
let conn = t!(app.diesel_database.get());
161-
t!(new_category("cat1::bar", "cat1::bar", "bar crates").create_or_update(&conn,));
71+
app.db(|conn| {
72+
t!(new_category("cat1", "cat1", "Category 1 crates").create_or_update(conn));
73+
t!(new_category("Category 2", "category-2", "Category 2 crates").create_or_update(conn));
74+
let krate = CrateBuilder::new("foo_crate", user.id).expect_build(&conn);
75+
76+
// Updating with no categories has no effect
77+
Category::update_crate(conn, &krate, &[]).unwrap();
78+
assert_eq!(count(&anon, "cat1"), 0);
79+
assert_eq!(count(&anon, "category-2"), 0);
80+
81+
// Happy path adding one category
82+
Category::update_crate(conn, &krate, &["cat1"]).unwrap();
83+
assert_eq!(count(&anon, "cat1"), 1);
84+
assert_eq!(count(&anon, "category-2"), 0);
85+
86+
// Replacing one category with another
87+
Category::update_crate(conn, &krate, &["category-2"]).unwrap();
88+
assert_eq!(count(&anon, "cat1"), 0);
89+
assert_eq!(count(&anon, "category-2"), 1);
90+
91+
// Removing one category
92+
Category::update_crate(conn, &krate, &[]).unwrap();
93+
assert_eq!(count(&anon, "cat1"), 0);
94+
assert_eq!(count(&anon, "category-2"), 0);
95+
96+
// Adding 2 categories
97+
Category::update_crate(conn, &krate, &["cat1", "category-2"]).unwrap();
98+
assert_eq!(count(&anon, "cat1"), 1);
99+
assert_eq!(count(&anon, "category-2"), 1);
100+
101+
// Removing all categories
102+
Category::update_crate(conn, &krate, &[]).unwrap();
103+
assert_eq!(count(&anon, "cat1"), 0);
104+
assert_eq!(count(&anon, "category-2"), 0);
105+
106+
// Attempting to add one valid category and one invalid category
107+
let invalid_categories =
108+
Category::update_crate(conn, &krate, &["cat1", "catnope"]).unwrap();
109+
assert_eq!(invalid_categories, vec!["catnope"]);
110+
assert_eq!(count(&anon, "cat1"), 1);
111+
assert_eq!(count(&anon, "category-2"), 0);
112+
113+
// Does not add the invalid category to the category list
114+
// (unlike the behavior of keywords)
115+
let json = anon.show_category_list();
116+
assert_eq!(json.categories.len(), 2);
117+
assert_eq!(json.meta.total, 2);
118+
119+
// Attempting to add a category by display text; must use slug
120+
Category::update_crate(conn, &krate, &["Category 2"]).unwrap();
121+
assert_eq!(count(&anon, "cat1"), 0);
122+
assert_eq!(count(&anon, "category-2"), 0);
123+
124+
// Add a category and its subcategory
125+
t!(new_category("cat1::bar", "cat1::bar", "bar crates").create_or_update(conn));
162126
Category::update_crate(&conn, &krate, &["cat1", "cat1::bar"]).unwrap();
163-
}
164-
assert_eq!(cnt!(&mut req, "cat1"), 1);
165-
assert_eq!(cnt!(&mut req, "cat1::bar"), 1);
166-
assert_eq!(cnt!(&mut req, "category-2"), 0);
127+
128+
assert_eq!(count(&anon, "cat1"), 1);
129+
assert_eq!(count(&anon, "cat1::bar"), 1);
130+
assert_eq!(count(&anon, "category-2"), 0);
131+
});
167132
}
168133

169134
#[test]

0 commit comments

Comments
 (0)