Skip to content

Commit 28055c3

Browse files
committed
Convert owner tests to use the TestHelper API
1 parent de52fa9 commit 28055c3

File tree

3 files changed

+65
-139
lines changed

3 files changed

+65
-139
lines changed

src/tests/all.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@ pub struct OwnerTeamsResponse {
110110
teams: Vec<EncodableOwner>,
111111
}
112112
#[derive(Deserialize)]
113+
pub struct OwnersResponse {
114+
users: Vec<EncodableOwner>,
115+
}
116+
#[derive(Deserialize)]
113117
pub struct OkBool {
114118
ok: bool,
115119
}

src/tests/owners.rs

Lines changed: 53 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
use crate::{
2-
add_team_to_crate, app,
2+
add_team_to_crate,
33
builders::{CrateBuilder, PublishBuilder},
4-
new_team, new_user, req, sign_in_as,
4+
new_team,
55
util::RequestHelper,
66
TestApp,
77
};
88
use cargo_registry::{
9-
models::{Crate, NewCrateOwnerInvitation},
10-
schema::crate_owner_invitations,
11-
views::{
12-
EncodableCrateOwnerInvitation, EncodableOwner, EncodablePublicUser, InvitationResponse,
13-
},
9+
models::Crate,
10+
views::{EncodableCrateOwnerInvitation, EncodableOwner, InvitationResponse},
1411
};
1512

16-
use conduit::{Handler, Method};
1713
use diesel::prelude::*;
1814

1915
#[derive(Deserialize)]
@@ -56,6 +52,31 @@ impl crate::util::MockCookieUser {
5652
assert_eq!(crate_owner_invite.crate_owner_invitation.crate_id, krate_id);
5753
}
5854

55+
/// As the currently logged in user, decline an invitation to become an owner of the named
56+
/// crate.
57+
fn decline_ownership_invitation(&self, krate_name: &str, krate_id: i32) {
58+
let body = json!({
59+
"crate_owner_invite": {
60+
"invited_by_username": "",
61+
"crate_name": krate_name,
62+
"crate_id": krate_id,
63+
"created_at": "",
64+
"accepted": false
65+
}
66+
});
67+
68+
#[derive(Deserialize)]
69+
struct CrateOwnerInvitation {
70+
crate_owner_invitation: InvitationResponse,
71+
}
72+
73+
let url = format!("/api/v1/me/crate_owner_invitations/{}", krate_id);
74+
let crate_owner_invite: CrateOwnerInvitation =
75+
self.put(&url, body.to_string().as_bytes()).good();
76+
assert!(!crate_owner_invite.crate_owner_invitation.accepted);
77+
assert_eq!(crate_owner_invite.crate_owner_invitation.crate_id, krate_id);
78+
}
79+
5980
/// As the currently logged in user, list my pending invitations.
6081
fn list_invitations(&self) -> InvitationListResponse {
6182
self.get("/api/v1/me/crate_owner_invitations").good()
@@ -228,76 +249,23 @@ fn invitations_list() {
228249
*/
229250
#[test]
230251
fn test_accept_invitation() {
231-
#[derive(Deserialize)]
232-
struct Q {
233-
users: Vec<EncodablePublicUser>,
234-
}
252+
let (app, anon, owner, owner_token) = TestApp::init().with_token();
253+
let owner = owner.as_model();
254+
let invited_user = app.db_new_user("user_bar");
255+
let krate = app.db(|conn| CrateBuilder::new("accept_invitation", owner.id).expect_build(conn));
235256

236-
#[derive(Deserialize)]
237-
struct T {
238-
crate_owner_invitation: InvitationResponse,
239-
}
257+
// Invite a new owner
258+
owner_token.add_user_owner("accept_invitation", invited_user.as_model());
240259

241-
let (app, middle) = app();
242-
let mut req = req(Method::Get, "/api/v1/me/crate_owner_invitations");
243-
let (krate, user) = {
244-
let conn = app.diesel_database.get().unwrap();
245-
let owner = new_user("inviting_user").create_or_update(&conn).unwrap();
246-
let user = new_user("invited_user").create_or_update(&conn).unwrap();
247-
let krate = CrateBuilder::new("invited_crate", owner.id).expect_build(&conn);
248-
249-
// This should be replaced by an actual call to the route that `owner --add` hits once
250-
// that route creates an invitation.
251-
diesel::insert_into(crate_owner_invitations::table)
252-
.values(&NewCrateOwnerInvitation {
253-
invited_by_user_id: owner.id,
254-
invited_user_id: user.id,
255-
crate_id: krate.id,
256-
})
257-
.execute(&*conn)
258-
.unwrap();
259-
(krate, user)
260-
};
261-
sign_in_as(&mut req, &user);
262-
263-
let body = json!({
264-
"crate_owner_invite": {
265-
"invited_by_username": "inviting_user",
266-
"crate_name": "invited_crate",
267-
"crate_id": krate.id,
268-
"created_at": "",
269-
"accepted": true
270-
}
271-
});
260+
// New owner accepts the invitation
261+
invited_user.accept_ownership_invitation(&krate.name, krate.id);
272262

273-
// first check that response from inserting new crate owner
274-
// and deleting crate_owner_invitation is okay
275-
let mut response = ok_resp!(middle.call(
276-
req.with_path(&format!("api/v1/me/crate_owner_invitations/{}", krate.id))
277-
.with_method(Method::Put)
278-
.with_body(body.to_string().as_bytes()),
279-
));
280-
281-
let json: T = crate::json(&mut response);
282-
assert_eq!(json.crate_owner_invitation.accepted, true);
283-
assert_eq!(json.crate_owner_invitation.crate_id, krate.id);
284-
285-
// then check to make sure that accept_invite did what it
286-
// was supposed to
287-
// crate_owner_invitation was deleted
288-
let mut response = ok_resp!(middle.call(
289-
req.with_path("api/v1/me/crate_owner_invitations")
290-
.with_method(Method::Get)
291-
));
292-
let json: InvitationListResponse = crate::json(&mut response);
263+
// New owner's invitation list should now be empty
264+
let json = invited_user.list_invitations();
293265
assert_eq!(json.crate_owner_invitations.len(), 0);
294266

295-
// new crate owner was inserted
296-
let mut response = ok_resp!(middle.call(
297-
req.with_path("/api/v1/crates/invited_crate/owners")
298-
.with_method(Method::Get)
299-
));
300-
let json: Q = crate::json(&mut response);
267+
// New owner is now listed as an owner, so the crate has two owners
268+
let json = anon.show_crate_owners("accept_invitation");
301269
assert_eq!(json.users.len(), 2);
302270
}
303271

@@ -308,75 +276,22 @@ fn test_accept_invitation() {
308276
*/
309277
#[test]
310278
fn test_decline_invitation() {
311-
#[derive(Deserialize)]
312-
struct Q {
313-
users: Vec<EncodablePublicUser>,
314-
}
279+
let (app, anon, owner, owner_token) = TestApp::init().with_token();
280+
let owner = owner.as_model();
281+
let invited_user = app.db_new_user("user_bar");
282+
let krate = app.db(|conn| CrateBuilder::new("decline_invitation", owner.id).expect_build(conn));
315283

316-
#[derive(Deserialize)]
317-
struct T {
318-
crate_owner_invitation: InvitationResponse,
319-
}
284+
// Invite a new owner
285+
owner_token.add_user_owner("decline_invitation", invited_user.as_model());
320286

321-
let (app, middle) = app();
322-
let mut req = req(Method::Get, "/api/v1/me/crate_owner_invitations");
323-
let (krate, user) = {
324-
let conn = app.diesel_database.get().unwrap();
325-
let owner = new_user("inviting_user").create_or_update(&conn).unwrap();
326-
let user = new_user("invited_user").create_or_update(&conn).unwrap();
327-
let krate = CrateBuilder::new("invited_crate", owner.id).expect_build(&conn);
328-
329-
// This should be replaced by an actual call to the route that `owner --add` hits once
330-
// that route creates an invitation.
331-
diesel::insert_into(crate_owner_invitations::table)
332-
.values(&NewCrateOwnerInvitation {
333-
invited_by_user_id: owner.id,
334-
invited_user_id: user.id,
335-
crate_id: krate.id,
336-
})
337-
.execute(&*conn)
338-
.unwrap();
339-
(krate, user)
340-
};
341-
sign_in_as(&mut req, &user);
342-
343-
let body = json!({
344-
"crate_owner_invite": {
345-
"invited_by_username": "inviting_user",
346-
"crate_name": "invited_crate",
347-
"crate_id": krate.id,
348-
"created_at": "",
349-
"accepted": false
350-
}
351-
});
287+
// Invited user declines the invitation
288+
invited_user.decline_ownership_invitation(&krate.name, krate.id);
352289

353-
// first check that response from deleting
354-
// crate_owner_invitation is okay
355-
let mut response = ok_resp!(middle.call(
356-
req.with_path(&format!("api/v1/me/crate_owner_invitations/{}", krate.id))
357-
.with_method(Method::Put)
358-
.with_body(body.to_string().as_bytes()),
359-
));
360-
361-
let json: T = crate::json(&mut response);
362-
assert_eq!(json.crate_owner_invitation.accepted, false);
363-
assert_eq!(json.crate_owner_invitation.crate_id, krate.id);
364-
365-
// then check to make sure that decline_invite did what it
366-
// was supposed to
367-
// crate_owner_invitation was deleted
368-
let mut response = ok_resp!(middle.call(
369-
req.with_path("api/v1/me/crate_owner_invitations")
370-
.with_method(Method::Get)
371-
));
372-
let json: InvitationListResponse = crate::json(&mut response);
290+
// Invited user's invitation list should now be empty
291+
let json = invited_user.list_invitations();
373292
assert_eq!(json.crate_owner_invitations.len(), 0);
374293

375-
// new crate owner was not inserted
376-
let mut response = ok_resp!(middle.call(
377-
req.with_path("/api/v1/crates/invited_crate/owners")
378-
.with_method(Method::Get)
379-
));
380-
let json: Q = crate::json(&mut response);
294+
// Invited user is NOT listed as an owner, so the crate still only has one owner
295+
let json = anon.show_crate_owners("decline_invitation");
381296
assert_eq!(json.users.len(), 1);
382297
}

src/tests/util.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
//! to the underlying database model value (`User` and `ApiToken` respectively).
2121
2222
use crate::{
23-
builders::PublishBuilder, record, CrateList, CrateResponse, GoodCrate, OkBool, VersionResponse,
23+
builders::PublishBuilder, record, CrateList, CrateResponse, GoodCrate,
24+
OkBool, OwnersResponse, VersionResponse,
2425
};
2526
use cargo_registry::{
2627
background_jobs::Environment,
@@ -382,6 +383,12 @@ pub trait RequestHelper {
382383
self.get(&url).good()
383384
}
384385

386+
/// Request the JSON used to list a crate's owners
387+
fn show_crate_owners(&self, krate_name: &str) -> OwnersResponse {
388+
let url = format!("/api/v1/crates/{}/owners", krate_name);
389+
self.get(&url).good()
390+
}
391+
385392
/// Request the JSON used for a crate version's page
386393
fn show_version(&self, krate_name: &str, version: &str) -> VersionResponse {
387394
let url = format!("/api/v1/crates/{}/{}", krate_name, version);

0 commit comments

Comments
 (0)