Browse Source

handle exception for non-integer id in path/body error + remove uneeded jsondecodeerror

Guénaël Muller 6 years ago
parent
commit
292738b14e
2 changed files with 79 additions and 8 deletions
  1. 15 8
      tracim/lib/utils/request.py
  2. 64 0
      tracim/tests/functional/test_contents.py

+ 15 - 8
tracim/lib/utils/request.py View File

214
         comment_id = ''
214
         comment_id = ''
215
         try:
215
         try:
216
             if 'comment_id' in request.matchdict:
216
             if 'comment_id' in request.matchdict:
217
+                if not request.matchdict['comment_id'].isdecimal():
218
+                    raise ContentNotFoundInTracimRequest('comment_id is not a correct integer')  # nopep8
217
                 comment_id = int(request.matchdict['comment_id'])
219
                 comment_id = int(request.matchdict['comment_id'])
218
             if not comment_id:
220
             if not comment_id:
219
                 raise ContentNotFoundInTracimRequest('No comment_id property found in request')  # nopep8
221
                 raise ContentNotFoundInTracimRequest('No comment_id property found in request')  # nopep8
228
                 workspace=workspace,
230
                 workspace=workspace,
229
                 parent=content,
231
                 parent=content,
230
             )
232
             )
231
-        except JSONDecodeError as exc:
232
-            raise ContentNotFound('Invalid JSON content') from exc
233
         except NoResultFound as exc:
233
         except NoResultFound as exc:
234
             raise ContentNotFound(
234
             raise ContentNotFound(
235
                 'Comment {} does not exist '
235
                 'Comment {} does not exist '
253
         content_id = ''
253
         content_id = ''
254
         try:
254
         try:
255
             if 'content_id' in request.matchdict:
255
             if 'content_id' in request.matchdict:
256
+                if not request.matchdict['content_id'].isdecimal():
257
+                    raise ContentNotFoundInTracimRequest('content_id is not a correct integer')  # nopep8
256
                 content_id = int(request.matchdict['content_id'])
258
                 content_id = int(request.matchdict['content_id'])
257
             if not content_id:
259
             if not content_id:
258
                 raise ContentNotFoundInTracimRequest('No content_id property found in request')  # nopep8
260
                 raise ContentNotFoundInTracimRequest('No content_id property found in request')  # nopep8
262
                 config=request.registry.settings['CFG']
264
                 config=request.registry.settings['CFG']
263
             )
265
             )
264
             content = api.get_one(content_id=content_id, workspace=workspace, content_type=ContentType.Any)  # nopep8
266
             content = api.get_one(content_id=content_id, workspace=workspace, content_type=ContentType.Any)  # nopep8
265
-        except JSONDecodeError as exc:
266
-            raise ContentNotFound('Invalid JSON content') from exc
267
         except NoResultFound as exc:
267
         except NoResultFound as exc:
268
             raise ContentNotFound(
268
             raise ContentNotFound(
269
                 'Content {} does not exist '
269
                 'Content {} does not exist '
286
         try:
286
         try:
287
             login = None
287
             login = None
288
             if 'user_id' in request.matchdict:
288
             if 'user_id' in request.matchdict:
289
-                login = request.matchdict['user_id']
289
+                if not request.matchdict['user_id'].isdecimal():
290
+                    raise UserNotFoundInTracimRequest('user_id is not a correct integer')  # nopep8
291
+                login = int(request.matchdict['user_id'])
290
             if not login:
292
             if not login:
291
                 raise UserNotFoundInTracimRequest('You request a candidate user but the context not permit to found one')  # nopep8
293
                 raise UserNotFoundInTracimRequest('You request a candidate user but the context not permit to found one')  # nopep8
292
             user = uapi.get_one(login)
294
             user = uapi.get_one(login)
329
         workspace_id = ''
331
         workspace_id = ''
330
         try:
332
         try:
331
             if 'workspace_id' in request.matchdict:
333
             if 'workspace_id' in request.matchdict:
332
-                workspace_id = request.matchdict['workspace_id']
334
+                if not request.matchdict['workspace_id'].isdecimal():
335
+                    raise WorkspaceNotFoundInTracimRequest('workspace_id is not a correct integer')  # nopep8
336
+                workspace_id = int(request.matchdict['workspace_id'])
333
             if not workspace_id:
337
             if not workspace_id:
334
                 raise WorkspaceNotFoundInTracimRequest('No workspace_id property found in request')  # nopep8
338
                 raise WorkspaceNotFoundInTracimRequest('No workspace_id property found in request')  # nopep8
335
             wapi = WorkspaceApi(
339
             wapi = WorkspaceApi(
338
                 config=request.registry.settings['CFG']
342
                 config=request.registry.settings['CFG']
339
             )
343
             )
340
             workspace = wapi.get_one(workspace_id)
344
             workspace = wapi.get_one(workspace_id)
341
-        except JSONDecodeError as exc:
342
-            raise WorkspaceNotFound('Invalid JSON content') from exc
343
         except NoResultFound as exc:
345
         except NoResultFound as exc:
344
             raise WorkspaceNotFound(
346
             raise WorkspaceNotFound(
345
                 'Workspace {} does not exist '
347
                 'Workspace {} does not exist '
362
         try:
364
         try:
363
             if 'new_workspace_id' in request.json_body:
365
             if 'new_workspace_id' in request.json_body:
364
                 workspace_id = request.json_body['new_workspace_id']
366
                 workspace_id = request.json_body['new_workspace_id']
367
+                if not isinstance(workspace_id, int):
368
+                    if workspace_id.isdecimal():
369
+                        workspace_id = int(workspace_id)
370
+                    else:
371
+                        raise WorkspaceNotFoundInTracimRequest('workspace_id is not a correct integer')  # nopep8
365
             if not workspace_id:
372
             if not workspace_id:
366
                 raise WorkspaceNotFoundInTracimRequest('No new_workspace_id property found in body')  # nopep8
373
                 raise WorkspaceNotFoundInTracimRequest('No new_workspace_id property found in body')  # nopep8
367
             wapi = WorkspaceApi(
374
             wapi = WorkspaceApi(

+ 64 - 0
tracim/tests/functional/test_contents.py View File

160
             status=400
160
             status=400
161
         )
161
         )
162
 
162
 
163
+    def test_api__get_html_document__err_400__workspace_id_is_not_int(self) -> None:  # nopep8
164
+        """
165
+        Get one html document of a content, workspace id is not int
166
+        """
167
+        self.testapp.authorization = (
168
+            'Basic',
169
+            (
170
+                'admin@admin.admin',
171
+                'admin@admin.admin'
172
+            )
173
+        )
174
+        res = self.testapp.get(
175
+            '/api/v2/workspaces/coucou/html-documents/6',
176
+            status=400
177
+        )
178
+
179
+    def test_api__get_html_document__err_400__content_id_is_not_int(self) -> None:  # nopep8
180
+        """
181
+        Get one html document of a content, content_id is not int
182
+        """
183
+        self.testapp.authorization = (
184
+            'Basic',
185
+            (
186
+                'admin@admin.admin',
187
+                'admin@admin.admin'
188
+            )
189
+        )
190
+        res = self.testapp.get(
191
+            '/api/v2/workspaces/2/html-documents/coucou',
192
+            status=400
193
+        )
194
+
163
     def test_api__update_html_document__ok_200__nominal_case(self) -> None:
195
     def test_api__update_html_document__ok_200__nominal_case(self) -> None:
164
         """
196
         """
165
         Update(put) one html document of a content
197
         Update(put) one html document of a content
469
             status=400
501
             status=400
470
         )
502
         )
471
 
503
 
504
+    def test_api__get_thread__err_400__workspace_id_is_not_int(self) -> None:  # nopep8
505
+        """
506
+        Get one thread, workspace id is not int
507
+        """
508
+        self.testapp.authorization = (
509
+            'Basic',
510
+            (
511
+                'admin@admin.admin',
512
+                'admin@admin.admin'
513
+            )
514
+        )
515
+        res = self.testapp.get(
516
+            '/api/v2/workspaces/coucou/threads/7',
517
+            status=400
518
+        )
519
+
520
+    def test_api__get_thread__err_400_content_id_is_not_int(self) -> None:  # nopep8
521
+        """
522
+        Get one thread, content id is not int
523
+        """
524
+        self.testapp.authorization = (
525
+            'Basic',
526
+            (
527
+                'admin@admin.admin',
528
+                'admin@admin.admin'
529
+            )
530
+        )
531
+        res = self.testapp.get(
532
+            '/api/v2/workspaces/2/threads/coucou',
533
+            status=400
534
+        )
535
+
472
     def test_api__update_thread__ok_200__nominal_case(self) -> None:
536
     def test_api__update_thread__ok_200__nominal_case(self) -> None:
473
         """
537
         """
474
         Update(put) thread
538
         Update(put) thread