@@ -2,7 +2,7 @@ use crate::{
2
2
add_team_to_crate,
3
3
builders:: { CrateBuilder , PublishBuilder } ,
4
4
new_team,
5
- util:: RequestHelper ,
5
+ util:: { MockCookieUser , MockTokenUser , RequestHelper } ,
6
6
TestApp ,
7
7
} ;
8
8
use cargo_registry:: {
@@ -26,7 +26,7 @@ struct InvitationListResponse {
26
26
}
27
27
28
28
// Implementing locally for now, unless these are needed elsewhere
29
- impl crate :: util :: MockCookieUser {
29
+ impl MockCookieUser {
30
30
/// As the currently logged in user, accept an invitation to become an owner of the named
31
31
/// crate.
32
32
fn accept_ownership_invitation ( & self , krate_name : & str , krate_id : i32 ) {
@@ -111,43 +111,89 @@ fn new_crate_owner() {
111
111
. good ( ) ;
112
112
}
113
113
114
+ fn create_and_add_owner (
115
+ app : & TestApp ,
116
+ token : & MockTokenUser ,
117
+ username : & str ,
118
+ krate : & Crate ,
119
+ ) -> MockCookieUser {
120
+ let user = app. db_new_user ( username) ;
121
+ token. add_user_owner ( & krate. name , user. as_model ( ) ) ;
122
+ user. accept_ownership_invitation ( & krate. name , krate. id ) ;
123
+ user
124
+ }
125
+
114
126
// Ensures that so long as at least one owner remains associated with the crate,
115
127
// a user can still remove their own login as an owner
116
128
#[ test]
117
129
fn owners_can_remove_self ( ) {
118
130
let ( app, _, user, token) = TestApp :: init ( ) . with_token ( ) ;
131
+ let username = & user. as_model ( ) . gh_login ;
119
132
120
133
let krate = app
121
134
. db ( |conn| CrateBuilder :: new ( "owners_selfremove" , user. as_model ( ) . id ) . expect_build ( conn) ) ;
122
135
123
136
// Deleting yourself when you're the only owner isn't allowed.
124
137
let json = token
125
- . remove_named_owner ( "owners_selfremove" , & user . as_model ( ) . gh_login )
138
+ . remove_named_owner ( "owners_selfremove" , username )
126
139
. bad_with_status ( 200 ) ;
127
140
assert ! ( json. errors[ 0 ]
128
141
. detail
129
142
. contains( "cannot remove the sole owner of a crate" ) ) ;
130
143
131
- let user2 = app. db_new_user ( "secondowner" ) ;
132
- token. add_user_owner ( "owners_selfremove" , user2. as_model ( ) ) ;
133
- user2. accept_ownership_invitation ( "owners_selfremove" , krate. id ) ;
144
+ create_and_add_owner ( & app, & token, "secondowner" , & krate) ;
134
145
135
146
// Deleting yourself when there are other owners is allowed.
136
147
let json = token
137
- . remove_named_owner ( "owners_selfremove" , & user . as_model ( ) . gh_login )
148
+ . remove_named_owner ( "owners_selfremove" , username )
138
149
. good ( ) ;
139
150
assert ! ( json. ok) ;
140
151
141
152
// After you delete yourself, you no longer have permisions to manage the crate.
142
153
let json = token
143
- . remove_named_owner ( "owners_selfremove" , & user2 . as_model ( ) . gh_login )
154
+ . remove_named_owner ( "owners_selfremove" , username )
144
155
. bad_with_status ( 200 ) ;
145
-
146
156
assert ! ( json. errors[ 0 ]
147
157
. detail
148
158
. contains( "only owners have permission to modify owners" , ) ) ;
149
159
}
150
160
161
+ // Verify consistency when adidng or removing multiple owners in a single request.
162
+ #[ test]
163
+ fn modify_multiple_owners ( ) {
164
+ let ( app, _, user, token) = TestApp :: init ( ) . with_token ( ) ;
165
+ let username = & user. as_model ( ) . gh_login ;
166
+
167
+ let krate =
168
+ app. db ( |conn| CrateBuilder :: new ( "owners_multiple" , user. as_model ( ) . id ) . expect_build ( conn) ) ;
169
+
170
+ let user2 = create_and_add_owner ( & app, & token, "user2" , & krate) ;
171
+ let user3 = create_and_add_owner ( & app, & token, "user3" , & krate) ;
172
+
173
+ // Deleting two owners at once is allowed.
174
+ let json = token
175
+ . remove_named_owners ( "owners_multiple" , & [ "user2" , "user3" ] )
176
+ . good ( ) ;
177
+ assert ! ( json. ok) ;
178
+ assert_eq ! ( app. db( |conn| krate. owners( & conn) . unwrap( ) ) . len( ) , 1 ) ;
179
+
180
+ // Adding multiple users fails if one of them already is an owner.
181
+ let json = token
182
+ . add_named_owners ( "owners_multiple" , & [ "user2" , username] )
183
+ . bad_with_status ( 200 ) ;
184
+ assert ! ( & json. errors[ 0 ] . detail. contains( "is already an owner" ) ) ;
185
+ assert_eq ! ( app. db( |conn| krate. owners( & conn) . unwrap( ) ) . len( ) , 1 ) ;
186
+
187
+ // Adding multiple users at once succeeds.
188
+ let json = token
189
+ . add_named_owners ( "owners_multiple" , & [ "user2" , "user3" ] )
190
+ . good ( ) ;
191
+ assert ! ( json. ok) ;
192
+ user2. accept_ownership_invitation ( & krate. name , krate. id ) ;
193
+ user3. accept_ownership_invitation ( & krate. name , krate. id ) ;
194
+ assert_eq ! ( app. db( |conn| krate. owners( & conn) . unwrap( ) ) . len( ) , 3 ) ;
195
+ }
196
+
151
197
/* Testing the crate ownership between two crates and one team.
152
198
Given two crates, one crate owned by both a team and a user,
153
199
one only owned by a user, check that the CrateList returned
0 commit comments