5
5
from botocore .exceptions import ClientError
6
6
7
7
from serverlessrepo import publish_application , update_application_metadata
8
- from serverlessrepo .exceptions import InvalidApplicationMetadataError , S3PermissionsRequired
8
+ from serverlessrepo .exceptions import (
9
+ InvalidApplicationMetadataError ,
10
+ S3PermissionsRequired ,
11
+ InvalidS3UriError ,
12
+ ServerlessRepoClientError
13
+ )
9
14
from serverlessrepo .parser import get_app_metadata , strip_app_metadata , yaml_dump
10
15
from serverlessrepo .publish import (
11
16
CREATE_APPLICATION ,
@@ -70,6 +75,15 @@ def setUp(self):
70
75
},
71
76
'create_application'
72
77
)
78
+ self .invalid_s3_uri_exception = ClientError (
79
+ {
80
+ 'Error' : {
81
+ 'Code' : 'BadRequestException' ,
82
+ 'Message' : 'Invalid S3 URI'
83
+ }
84
+ },
85
+ 'create_application'
86
+ )
73
87
74
88
def test_publish_raise_value_error_for_empty_template (self ):
75
89
with self .assertRaises (ValueError ) as context :
@@ -137,18 +151,18 @@ def test_publish_raise_metadata_error_for_invalid_create_application_request(sel
137
151
# create_application shouldn't be called if application metadata is invalid
138
152
self .serverlessrepo_mock .create_application .assert_not_called ()
139
153
140
- def test_publish_raise_client_error_when_create_application (self ):
154
+ def test_publish_raise_serverlessrepo_client_error_when_create_application (self ):
141
155
self .serverlessrepo_mock .create_application .side_effect = self .not_conflict_exception
142
156
143
157
# should raise exception if it's not ConflictException
144
- with self .assertRaises (ClientError ):
158
+ with self .assertRaises (ServerlessRepoClientError ):
145
159
publish_application (self .template )
146
160
147
161
# shouldn't call the following APIs if the exception isn't application already exists
148
162
self .serverlessrepo_mock .update_application .assert_not_called ()
149
163
self .serverlessrepo_mock .create_application_version .assert_not_called ()
150
164
151
- def test_publish_raise_s3_error_when_create_application (self ):
165
+ def test_publish_raise_s3_permission_error_when_create_application (self ):
152
166
self .serverlessrepo_mock .create_application .side_effect = self .s3_denied_exception
153
167
with self .assertRaises (S3PermissionsRequired ) as context :
154
168
publish_application (self .template )
@@ -157,9 +171,13 @@ def test_publish_raise_s3_error_when_create_application(self):
157
171
self .assertIn ("The AWS Serverless Application Repository does not have read access to bucket "
158
172
"'test-bucket', key 'test-file'." , message )
159
173
160
- # shouldn't call the following APIs if the exception isn't application already exists
161
- self .serverlessrepo_mock .update_application .assert_not_called ()
162
- self .serverlessrepo_mock .create_application_version .assert_not_called ()
174
+ def test_publish_raise_invalid_s3_uri_when_create_application (self ):
175
+ self .serverlessrepo_mock .create_application .side_effect = self .invalid_s3_uri_exception
176
+ with self .assertRaises (InvalidS3UriError ) as context :
177
+ publish_application (self .template )
178
+
179
+ message = str (context .exception )
180
+ self .assertIn ("Invalid S3 URI" , message )
163
181
164
182
def test_publish_existing_application_should_update_application_if_version_not_specified (self ):
165
183
self .serverlessrepo_mock .create_application .side_effect = self .application_exists_error
@@ -187,23 +205,21 @@ def test_publish_existing_application_should_update_application_if_version_not_s
187
205
# create_application_version shouldn't be called if version is not provided
188
206
self .serverlessrepo_mock .create_application_version .assert_not_called ()
189
207
190
- def test_publish_raise_s3_error_when_update_application (self ):
208
+ @patch ('serverlessrepo.publish._wrap_client_error' )
209
+ def test_publish_wrap_client_error_when_update_application (self , wrap_client_error_mock ):
191
210
self .serverlessrepo_mock .create_application .side_effect = self .application_exists_error
192
- self .serverlessrepo_mock .update_application .side_effect = self .s3_denied_exception
193
- with self .assertRaises (S3PermissionsRequired ) as context :
211
+ self .serverlessrepo_mock .update_application .side_effect = self .not_conflict_exception
212
+ wrap_client_error_mock .return_value = ServerlessRepoClientError (message = "client error" )
213
+ with self .assertRaises (ServerlessRepoClientError ):
194
214
publish_application (self .template )
195
215
196
- message = str (context .exception )
197
- self .assertIn ("The AWS Serverless Application Repository does not have read access to bucket "
198
- "'test-bucket', key 'test-file'." , message )
199
-
200
216
# create_application_version shouldn't be called if update_application fails
201
217
self .serverlessrepo_mock .create_application_version .assert_not_called ()
202
218
203
219
def test_publish_existing_application_should_update_application_if_version_exists (self ):
204
220
self .serverlessrepo_mock .create_application .side_effect = self .application_exists_error
205
221
self .serverlessrepo_mock .create_application_version .side_effect = ClientError (
206
- {'Error' : {'Code' : 'ConflictException' }},
222
+ {'Error' : {'Code' : 'ConflictException' , 'Message' : 'Random' }},
207
223
'create_application_version'
208
224
)
209
225
@@ -257,24 +273,14 @@ def test_publish_new_version_should_create_application_version(self):
257
273
}
258
274
self .serverlessrepo_mock .create_application_version .assert_called_once_with (** expected_request )
259
275
260
- def test_publish_raise_client_error_when_create_application_version (self ):
276
+ @patch ('serverlessrepo.publish._wrap_client_error' )
277
+ def test_publish_wrap_client_error_when_create_application_version (self , wrap_client_error_mock ):
261
278
self .serverlessrepo_mock .create_application .side_effect = self .application_exists_error
262
279
self .serverlessrepo_mock .create_application_version .side_effect = self .not_conflict_exception
263
-
264
- # should raise exception if it's not ConflictException
265
- with self .assertRaises (ClientError ):
266
- publish_application (self .template )
267
-
268
- def test_publish_raise_s3_error_when_create_application_version (self ):
269
- self .serverlessrepo_mock .create_application .side_effect = self .application_exists_error
270
- self .serverlessrepo_mock .create_application_version .side_effect = self .s3_denied_exception
271
- with self .assertRaises (S3PermissionsRequired ) as context :
280
+ wrap_client_error_mock .return_value = ServerlessRepoClientError (message = "client error" )
281
+ with self .assertRaises (ServerlessRepoClientError ):
272
282
publish_application (self .template )
273
283
274
- message = str (context .exception )
275
- self .assertIn ("The AWS Serverless Application Repository does not have read access to bucket "
276
- "'test-bucket', key 'test-file'." , message )
277
-
278
284
def test_create_application_with_passed_in_sar_client (self ):
279
285
sar_client = Mock ()
280
286
sar_client .create_application .return_value = {
0 commit comments