13
13
# See the License for the specific language governing permissions and
14
14
# limitations under the License.
15
15
16
+ import json
16
17
import unittest
17
18
from datetime import datetime
18
19
from hashlib import md5
@@ -64,8 +65,15 @@ def test_object_multi_DELETE(self):
64
65
swob .HTTPNoContent , {}, None )
65
66
self .swift .register ('DELETE' , '/v1/AUTH_test/bucket/Key2' ,
66
67
swob .HTTPNotFound , {}, None )
68
+ slo_delete_resp = {
69
+ 'Number Not Found' : 0 ,
70
+ 'Response Status' : '200 OK' ,
71
+ 'Errors' : [],
72
+ 'Response Body' : '' ,
73
+ 'Number Deleted' : 8
74
+ }
67
75
self .swift .register ('DELETE' , '/v1/AUTH_test/bucket/Key3' ,
68
- swob .HTTPOk , {}, None )
76
+ swob .HTTPOk , {}, json . dumps ( slo_delete_resp ) )
69
77
70
78
elem = Element ('Delete' )
71
79
for key in ['Key1' , 'Key2' , 'Key3' ]:
@@ -97,15 +105,31 @@ def test_object_multi_DELETE(self):
97
105
98
106
@s3acl
99
107
def test_object_multi_DELETE_with_error (self ):
100
- self .swift .register ('HEAD' , '/v1/AUTH_test/bucket/Key3' ,
101
- swob .HTTPForbidden , {}, None )
102
108
self .swift .register ('DELETE' , '/v1/AUTH_test/bucket/Key1' ,
103
109
swob .HTTPNoContent , {}, None )
104
110
self .swift .register ('DELETE' , '/v1/AUTH_test/bucket/Key2' ,
105
111
swob .HTTPNotFound , {}, None )
112
+ self .swift .register ('HEAD' , '/v1/AUTH_test/bucket/Key3' ,
113
+ swob .HTTPForbidden , {}, None )
114
+ self .swift .register ('HEAD' , '/v1/AUTH_test/bucket/Key4' ,
115
+ swob .HTTPOk ,
116
+ {'x-static-large-object' : 'True' },
117
+ None )
118
+ slo_delete_resp = {
119
+ 'Number Not Found' : 0 ,
120
+ 'Response Status' : '400 Bad Request' ,
121
+ 'Errors' : [
122
+ ["/bucket+segments/obj1" , "403 Forbidden" ],
123
+ ["/bucket+segments/obj2" , "403 Forbidden" ]
124
+ ],
125
+ 'Response Body' : '' ,
126
+ 'Number Deleted' : 8
127
+ }
128
+ self .swift .register ('DELETE' , '/v1/AUTH_test/bucket/Key4' ,
129
+ swob .HTTPOk , {}, json .dumps (slo_delete_resp ))
106
130
107
131
elem = Element ('Delete' )
108
- for key in ['Key1' , 'Key2' , 'Key3' ]:
132
+ for key in ['Key1' , 'Key2' , 'Key3' , 'Key4' ]:
109
133
obj = SubElement (elem , 'Object' )
110
134
SubElement (obj , 'Key' ).text = key
111
135
body = tostring (elem , use_s3ns = False )
@@ -123,13 +147,24 @@ def test_object_multi_DELETE_with_error(self):
123
147
124
148
elem = fromstring (body )
125
149
self .assertEqual (len (elem .findall ('Deleted' )), 2 )
126
- self .assertEqual (len (elem .findall ('Error' )), 1 )
150
+ self .assertEqual (len (elem .findall ('Error' )), 2 )
151
+ self .assertEqual (
152
+ [(el .find ('Code' ).text , el .find ('Message' ).text )
153
+ for el in elem .findall ('Error' )],
154
+ [('AccessDenied' , 'Access Denied.' ),
155
+ ('SLODeleteError' , '\n ' .join ([
156
+ '400 Bad Request' ,
157
+ '/bucket+segments/obj1: 403 Forbidden' ,
158
+ '/bucket+segments/obj2: 403 Forbidden' ]))]
159
+ )
127
160
self .assertEqual (self .swift .calls , [
128
161
('HEAD' , '/v1/AUTH_test/bucket' ),
129
162
('HEAD' , '/v1/AUTH_test/bucket/Key1' ),
130
163
('DELETE' , '/v1/AUTH_test/bucket/Key1' ),
131
164
('HEAD' , '/v1/AUTH_test/bucket/Key2' ),
132
165
('HEAD' , '/v1/AUTH_test/bucket/Key3' ),
166
+ ('HEAD' , '/v1/AUTH_test/bucket/Key4' ),
167
+ ('DELETE' , '/v1/AUTH_test/bucket/Key4?multipart-manifest=delete' ),
133
168
])
134
169
135
170
@s3acl
0 commit comments