Skip to content

Commit 06f22af

Browse files
Merge #1032
1032: Don't list crates that teams/users used to own r=carols10cents I noticed that the cargo-canoe crate was still listed under my crates on /dashboard, even though alex changed all the ownership records except one to `deleted=true`. Turns out we didn't have that condition on here! The new tests with the ownership records changed to deleted failed before these changes and pass after.
2 parents 59a4bd5 + 6ac7881 commit 06f22af

File tree

3 files changed

+79
-0
lines changed

3 files changed

+79
-0
lines changed

src/krate.rs

+2
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,7 @@ pub fn index(req: &mut Request) -> CargoResult<Response> {
673673
crate_owners::table
674674
.select(crate_owners::crate_id)
675675
.filter(crate_owners::owner_id.eq(user_id))
676+
.filter(crate_owners::deleted.eq(false))
676677
.filter(crate_owners::owner_kind.eq(OwnerKind::User as i32)),
677678
),
678679
);
@@ -682,6 +683,7 @@ pub fn index(req: &mut Request) -> CargoResult<Response> {
682683
crate_owners::table
683684
.select(crate_owners::crate_id)
684685
.filter(crate_owners::owner_id.eq(team_id))
686+
.filter(crate_owners::deleted.eq(false))
685687
.filter(crate_owners::owner_kind.eq(OwnerKind::Team as i32)),
686688
),
687689
);

src/tests/team.rs

+54
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::sync::ONCE_INIT;
22
use conduit::{Handler, Method};
33

44
use cargo_registry::user::NewUser;
5+
use cargo_registry::krate::EncodableCrate;
56
use record::GhUser;
67

78
// Users: `crates-tester-1` and `crates-tester-2`
@@ -351,3 +352,56 @@ fn add_owners_as_team_owner() {
351352
json.errors
352353
);
353354
}
355+
356+
#[test]
357+
fn crates_by_team_id() {
358+
let (_b, app, middle) = ::app();
359+
360+
let team = {
361+
let conn = app.diesel_database.get().unwrap();
362+
let u = ::new_user("user_foo").create_or_update(&conn).unwrap();
363+
let t = ::new_team("team_foo").create_or_update(&conn).unwrap();
364+
let krate = ::CrateBuilder::new("foo", u.id).expect_build(&conn);
365+
::add_team_to_crate(&t, &krate, &u, &conn).unwrap();
366+
t
367+
};
368+
369+
let mut req = ::req(app, Method::Get, "/api/v1/crates");
370+
req.with_query(&format!("team_id={}", team.id));
371+
let mut response = ok_resp!(middle.call(&mut req));
372+
373+
#[derive(Deserialize)]
374+
struct Response {
375+
crates: Vec<EncodableCrate>,
376+
}
377+
let response: Response = ::json(&mut response);
378+
assert_eq!(response.crates.len(), 1);
379+
}
380+
381+
#[test]
382+
fn crates_by_team_id_not_including_deleted_owners() {
383+
let (_b, app, middle) = ::app();
384+
385+
let team = {
386+
let conn = app.diesel_database.get().unwrap();
387+
let u = ::new_user("user_foo").create_or_update(&conn).unwrap();
388+
let t = ::new_team("github:org_foo:team_foo")
389+
.create_or_update(&conn)
390+
.unwrap();
391+
let krate = ::CrateBuilder::new("foo", u.id).expect_build(&conn);
392+
::add_team_to_crate(&t, &krate, &u, &conn).unwrap();
393+
krate.owner_remove(&conn, &u, &t.login).unwrap();
394+
t
395+
};
396+
397+
let mut req = ::req(app, Method::Get, "/api/v1/crates");
398+
req.with_query(&format!("team_id={}", team.id));
399+
let mut response = ok_resp!(middle.call(&mut req));
400+
401+
#[derive(Deserialize)]
402+
struct Response {
403+
crates: Vec<EncodableCrate>,
404+
}
405+
let response: Response = ::json(&mut response);
406+
assert_eq!(response.crates.len(), 0);
407+
}

src/tests/user.rs

+23
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,29 @@ fn crates_by_user_id() {
100100
assert_eq!(response.crates.len(), 1);
101101
}
102102

103+
#[test]
104+
fn crates_by_user_id_not_including_deleted_owners() {
105+
let (_b, app, middle) = ::app();
106+
let u;
107+
{
108+
let conn = app.diesel_database.get().unwrap();
109+
u = ::new_user("foo").create_or_update(&conn).unwrap();
110+
let krate = ::CrateBuilder::new("foo_my_packages", u.id).expect_build(&conn);
111+
krate.owner_remove(&conn, &u, "foo").unwrap();
112+
}
113+
114+
let mut req = ::req(app, Method::Get, "/api/v1/crates");
115+
req.with_query(&format!("user_id={}", u.id));
116+
let mut response = ok_resp!(middle.call(&mut req));
117+
118+
#[derive(Deserialize)]
119+
struct Response {
120+
crates: Vec<EncodableCrate>,
121+
}
122+
let response: Response = ::json(&mut response);
123+
assert_eq!(response.crates.len(), 0);
124+
}
125+
103126
#[test]
104127
fn following() {
105128
#[derive(Deserialize)]

0 commit comments

Comments
 (0)