27
27
import warehouse .utils .otp as otp
28
28
29
29
from warehouse .accounts .interfaces import IPasswordBreachedService , IUserService
30
+ from warehouse .admin .flags import AdminFlagValue
30
31
from warehouse .macaroons .interfaces import IMacaroonService
31
32
from warehouse .manage import views
32
33
from warehouse .packaging .models import (
@@ -2005,15 +2006,24 @@ def test_manage_projects(self, db_request):
2005
2006
2006
2007
class TestManageProjectSettings :
2007
2008
def test_manage_project_settings (self ):
2008
- request = pretend .stub ()
2009
+ request = pretend .stub (
2010
+ flags = pretend .stub (enabled = pretend .call_recorder (lambda * a : False ))
2011
+ )
2009
2012
project = pretend .stub ()
2010
2013
2011
- assert views .manage_project_settings (project , request ) == {"project" : project }
2014
+ assert views .manage_project_settings (project , request ) == {
2015
+ "disallow_deletion" : False ,
2016
+ "project" : project ,
2017
+ }
2018
+ assert request .flags .enabled .calls == [
2019
+ pretend .call (AdminFlagValue .DISALLOW_DELETION )
2020
+ ]
2012
2021
2013
2022
def test_delete_project_no_confirm (self ):
2014
2023
project = pretend .stub (normalized_name = "foo" )
2015
2024
request = pretend .stub (
2016
2025
POST = {},
2026
+ flags = pretend .stub (enabled = pretend .call_recorder (lambda * a : False )),
2017
2027
session = pretend .stub (flash = pretend .call_recorder (lambda * a , ** kw : None )),
2018
2028
route_path = lambda * a , ** kw : "/foo/bar/" ,
2019
2029
)
@@ -2023,6 +2033,9 @@ def test_delete_project_no_confirm(self):
2023
2033
assert exc .value .status_code == 303
2024
2034
assert exc .value .headers ["Location" ] == "/foo/bar/"
2025
2035
2036
+ assert request .flags .enabled .calls == [
2037
+ pretend .call (AdminFlagValue .DISALLOW_DELETION )
2038
+ ]
2026
2039
assert request .session .flash .calls == [
2027
2040
pretend .call ("Confirm the request" , queue = "error" )
2028
2041
]
@@ -2031,6 +2044,7 @@ def test_delete_project_wrong_confirm(self):
2031
2044
project = pretend .stub (normalized_name = "foo" )
2032
2045
request = pretend .stub (
2033
2046
POST = {"confirm_project_name" : "bar" },
2047
+ flags = pretend .stub (enabled = pretend .call_recorder (lambda * a : False )),
2034
2048
session = pretend .stub (flash = pretend .call_recorder (lambda * a , ** kw : None )),
2035
2049
route_path = lambda * a , ** kw : "/foo/bar/" ,
2036
2050
)
@@ -2040,13 +2054,46 @@ def test_delete_project_wrong_confirm(self):
2040
2054
assert exc .value .status_code == 303
2041
2055
assert exc .value .headers ["Location" ] == "/foo/bar/"
2042
2056
2057
+ assert request .flags .enabled .calls == [
2058
+ pretend .call (AdminFlagValue .DISALLOW_DELETION )
2059
+ ]
2043
2060
assert request .session .flash .calls == [
2044
2061
pretend .call (
2045
2062
"Could not delete project - 'bar' is not the same as 'foo'" ,
2046
2063
queue = "error" ,
2047
2064
)
2048
2065
]
2049
2066
2067
+ def test_delete_project_disallow_deletion (self ):
2068
+ project = pretend .stub (name = "foo" , normalized_name = "foo" )
2069
+ request = pretend .stub (
2070
+ flags = pretend .stub (enabled = pretend .call_recorder (lambda * a : True )),
2071
+ route_path = pretend .call_recorder (lambda * a , ** kw : "/the-redirect" ),
2072
+ session = pretend .stub (flash = pretend .call_recorder (lambda * a , ** kw : None )),
2073
+ )
2074
+
2075
+ result = views .delete_project (project , request )
2076
+ assert isinstance (result , HTTPSeeOther )
2077
+ assert result .headers ["Location" ] == "/the-redirect"
2078
+
2079
+ assert request .flags .enabled .calls == [
2080
+ pretend .call (AdminFlagValue .DISALLOW_DELETION )
2081
+ ]
2082
+
2083
+ assert request .session .flash .calls == [
2084
+ pretend .call (
2085
+ (
2086
+ "Project deletion temporarily disabled. "
2087
+ "See https://pypi.org/help#admin-intervention for details."
2088
+ ),
2089
+ queue = "error" ,
2090
+ )
2091
+ ]
2092
+
2093
+ assert request .route_path .calls == [
2094
+ pretend .call ("manage.project.settings" , project_name = "foo" )
2095
+ ]
2096
+
2050
2097
def test_delete_project (self , db_request ):
2051
2098
project = ProjectFactory .create (name = "foo" )
2052
2099
@@ -2152,26 +2199,83 @@ def test_destroy_project_docs(self, db_request):
2152
2199
2153
2200
class TestManageProjectReleases :
2154
2201
def test_manage_project_releases (self ):
2155
- request = pretend .stub ()
2202
+ request = pretend .stub (
2203
+ flags = pretend .stub (enabled = pretend .call_recorder (lambda * a : False ))
2204
+ )
2156
2205
project = pretend .stub ()
2157
2206
2158
- assert views .manage_project_releases (project , request ) == {"project" : project }
2207
+ assert views .manage_project_releases (project , request ) == {
2208
+ "disallow_deletion" : False ,
2209
+ "project" : project ,
2210
+ }
2211
+ assert request .flags .enabled .calls == [
2212
+ pretend .call (AdminFlagValue .DISALLOW_DELETION )
2213
+ ]
2159
2214
2160
2215
2161
2216
class TestManageProjectRelease :
2162
2217
def test_manage_project_release (self ):
2163
2218
files = pretend .stub ()
2164
2219
project = pretend .stub ()
2165
2220
release = pretend .stub (project = project , files = pretend .stub (all = lambda : files ))
2166
- request = pretend .stub ()
2221
+ request = pretend .stub (
2222
+ flags = pretend .stub (enabled = pretend .call_recorder (lambda * a : False ))
2223
+ )
2167
2224
view = views .ManageProjectRelease (release , request )
2168
2225
2169
2226
assert view .manage_project_release () == {
2227
+ "disallow_deletion" : False ,
2170
2228
"project" : project ,
2171
2229
"release" : release ,
2172
2230
"files" : files ,
2173
2231
}
2174
2232
2233
+ assert request .flags .enabled .calls == [
2234
+ pretend .call (AdminFlagValue .DISALLOW_DELETION )
2235
+ ]
2236
+
2237
+ def test_delete_project_release_disallow_deletion (self , monkeypatch ):
2238
+ release = pretend .stub (
2239
+ version = "1.2.3" ,
2240
+ canonical_version = "1.2.3" ,
2241
+ project = pretend .stub (
2242
+ name = "foobar" , record_event = pretend .call_recorder (lambda * a , ** kw : None )
2243
+ ),
2244
+ )
2245
+ request = pretend .stub (
2246
+ flags = pretend .stub (enabled = pretend .call_recorder (lambda * a : True )),
2247
+ method = "POST" ,
2248
+ route_path = pretend .call_recorder (lambda * a , ** kw : "/the-redirect" ),
2249
+ session = pretend .stub (flash = pretend .call_recorder (lambda * a , ** kw : None )),
2250
+ )
2251
+ view = views .ManageProjectRelease (release , request )
2252
+
2253
+ result = view .delete_project_release ()
2254
+ assert isinstance (result , HTTPSeeOther )
2255
+ assert result .headers ["Location" ] == "/the-redirect"
2256
+
2257
+ assert request .flags .enabled .calls == [
2258
+ pretend .call (AdminFlagValue .DISALLOW_DELETION )
2259
+ ]
2260
+
2261
+ assert request .session .flash .calls == [
2262
+ pretend .call (
2263
+ (
2264
+ "Project deletion temporarily disabled. "
2265
+ "See https://pypi.org/help#admin-intervention for details."
2266
+ ),
2267
+ queue = "error" ,
2268
+ )
2269
+ ]
2270
+
2271
+ assert request .route_path .calls == [
2272
+ pretend .call (
2273
+ "manage.project.release" ,
2274
+ project_name = release .project .name ,
2275
+ version = release .version ,
2276
+ )
2277
+ ]
2278
+
2175
2279
def test_delete_project_release (self , monkeypatch ):
2176
2280
release = pretend .stub (
2177
2281
version = "1.2.3" ,
@@ -2187,6 +2291,7 @@ def test_delete_project_release(self, monkeypatch):
2187
2291
delete = pretend .call_recorder (lambda a : None ),
2188
2292
add = pretend .call_recorder (lambda a : None ),
2189
2293
),
2294
+ flags = pretend .stub (enabled = pretend .call_recorder (lambda * a : False )),
2190
2295
route_path = pretend .call_recorder (lambda * a , ** kw : "/the-redirect" ),
2191
2296
session = pretend .stub (flash = pretend .call_recorder (lambda * a , ** kw : None )),
2192
2297
user = pretend .stub (username = pretend .stub ()),
@@ -2205,6 +2310,9 @@ def test_delete_project_release(self, monkeypatch):
2205
2310
2206
2311
assert request .db .delete .calls == [pretend .call (release )]
2207
2312
assert request .db .add .calls == [pretend .call (journal_obj )]
2313
+ assert request .flags .enabled .calls == [
2314
+ pretend .call (AdminFlagValue .DISALLOW_DELETION )
2315
+ ]
2208
2316
assert journal_cls .calls == [
2209
2317
pretend .call (
2210
2318
name = release .project .name ,
@@ -2237,6 +2345,7 @@ def test_delete_project_release_no_confirm(self):
2237
2345
POST = {"confirm_version" : "" },
2238
2346
method = "POST" ,
2239
2347
db = pretend .stub (delete = pretend .call_recorder (lambda a : None )),
2348
+ flags = pretend .stub (enabled = pretend .call_recorder (lambda * a : False )),
2240
2349
route_path = pretend .call_recorder (lambda * a , ** kw : "/the-redirect" ),
2241
2350
session = pretend .stub (flash = pretend .call_recorder (lambda * a , ** kw : None )),
2242
2351
)
@@ -2251,6 +2360,9 @@ def test_delete_project_release_no_confirm(self):
2251
2360
assert request .session .flash .calls == [
2252
2361
pretend .call ("Confirm the request" , queue = "error" )
2253
2362
]
2363
+ assert request .flags .enabled .calls == [
2364
+ pretend .call (AdminFlagValue .DISALLOW_DELETION )
2365
+ ]
2254
2366
assert request .route_path .calls == [
2255
2367
pretend .call (
2256
2368
"manage.project.release" ,
@@ -2265,6 +2377,7 @@ def test_delete_project_release_bad_confirm(self):
2265
2377
POST = {"confirm_version" : "invalid" },
2266
2378
method = "POST" ,
2267
2379
db = pretend .stub (delete = pretend .call_recorder (lambda a : None )),
2380
+ flags = pretend .stub (enabled = pretend .call_recorder (lambda * a : False )),
2268
2381
route_path = pretend .call_recorder (lambda * a , ** kw : "/the-redirect" ),
2269
2382
session = pretend .stub (flash = pretend .call_recorder (lambda * a , ** kw : None )),
2270
2383
)
@@ -2276,6 +2389,9 @@ def test_delete_project_release_bad_confirm(self):
2276
2389
assert result .headers ["Location" ] == "/the-redirect"
2277
2390
2278
2391
assert request .db .delete .calls == []
2392
+ assert request .flags .enabled .calls == [
2393
+ pretend .call (AdminFlagValue .DISALLOW_DELETION )
2394
+ ]
2279
2395
assert request .session .flash .calls == [
2280
2396
pretend .call (
2281
2397
"Could not delete release - "
@@ -2291,6 +2407,42 @@ def test_delete_project_release_bad_confirm(self):
2291
2407
)
2292
2408
]
2293
2409
2410
+ def test_delete_project_release_file_disallow_deletion (self ):
2411
+ release = pretend .stub (version = "1.2.3" , project = pretend .stub (name = "foobar" ))
2412
+ request = pretend .stub (
2413
+ method = "POST" ,
2414
+ flags = pretend .stub (enabled = pretend .call_recorder (lambda * a : True )),
2415
+ route_path = pretend .call_recorder (lambda * a , ** kw : "/the-redirect" ),
2416
+ session = pretend .stub (flash = pretend .call_recorder (lambda * a , ** kw : None )),
2417
+ )
2418
+ view = views .ManageProjectRelease (release , request )
2419
+
2420
+ result = view .delete_project_release_file ()
2421
+
2422
+ assert isinstance (result , HTTPSeeOther )
2423
+ assert result .headers ["Location" ] == "/the-redirect"
2424
+
2425
+ assert request .flags .enabled .calls == [
2426
+ pretend .call (AdminFlagValue .DISALLOW_DELETION )
2427
+ ]
2428
+
2429
+ assert request .session .flash .calls == [
2430
+ pretend .call (
2431
+ (
2432
+ "Project deletion temporarily disabled. "
2433
+ "See https://pypi.org/help#admin-intervention for details."
2434
+ ),
2435
+ queue = "error" ,
2436
+ )
2437
+ ]
2438
+ assert request .route_path .calls == [
2439
+ pretend .call (
2440
+ "manage.project.release" ,
2441
+ project_name = release .project .name ,
2442
+ version = release .version ,
2443
+ )
2444
+ ]
2445
+
2294
2446
def test_delete_project_release_file (self , db_request ):
2295
2447
user = UserFactory .create ()
2296
2448
@@ -2349,6 +2501,7 @@ def test_delete_project_release_file_no_confirm(self):
2349
2501
POST = {"confirm_project_name" : "" },
2350
2502
method = "POST" ,
2351
2503
db = pretend .stub (delete = pretend .call_recorder (lambda a : None )),
2504
+ flags = pretend .stub (enabled = pretend .call_recorder (lambda * a : False )),
2352
2505
route_path = pretend .call_recorder (lambda * a , ** kw : "/the-redirect" ),
2353
2506
session = pretend .stub (flash = pretend .call_recorder (lambda * a , ** kw : None )),
2354
2507
)
@@ -2360,6 +2513,9 @@ def test_delete_project_release_file_no_confirm(self):
2360
2513
assert result .headers ["Location" ] == "/the-redirect"
2361
2514
2362
2515
assert request .db .delete .calls == []
2516
+ assert request .flags .enabled .calls == [
2517
+ pretend .call (AdminFlagValue .DISALLOW_DELETION )
2518
+ ]
2363
2519
assert request .session .flash .calls == [
2364
2520
pretend .call ("Confirm the request" , queue = "error" )
2365
2521
]
@@ -2386,6 +2542,7 @@ def no_result_found():
2386
2542
filter = lambda * a : pretend .stub (one = no_result_found )
2387
2543
),
2388
2544
)
2545
+ db_request .flags = pretend .stub (enabled = pretend .call_recorder (lambda * a : False ))
2389
2546
db_request .route_path = pretend .call_recorder (lambda * a , ** kw : "/the-redirect" )
2390
2547
db_request .session = pretend .stub (
2391
2548
flash = pretend .call_recorder (lambda * a , ** kw : None )
@@ -2399,6 +2556,9 @@ def no_result_found():
2399
2556
assert result .headers ["Location" ] == "/the-redirect"
2400
2557
2401
2558
assert db_request .db .delete .calls == []
2559
+ assert db_request .flags .enabled .calls == [
2560
+ pretend .call (AdminFlagValue .DISALLOW_DELETION )
2561
+ ]
2402
2562
assert db_request .session .flash .calls == [
2403
2563
pretend .call ("Could not find file" , queue = "error" )
2404
2564
]
0 commit comments