From f3489e1cf6988a4b5ccc15766a58c9074a51166a Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Fri, 13 Jul 2018 17:10:53 +0900 Subject: [PATCH 01/20] =?UTF-8?q?=E9=81=95=E5=8F=8D=E5=A0=B1=E5=91=8A?= =?UTF-8?q?=E7=B3=BB=E3=81=AE=E5=AE=9A=E6=95=B0=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/settings.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/common/settings.py b/src/common/settings.py index d901f314..1c6f968f 100644 --- a/src/common/settings.py +++ b/src/common/settings.py @@ -146,7 +146,6 @@ 'xml', 'year' ] - LIKED_RETRY_COUNT = 3 ARTICLE_IMAGE_MAX_WIDTH = 3840 @@ -160,3 +159,16 @@ LIKE_NOTIFICATION_TYPE = 'like' COMMENT_NOTIFICATION_TYPE = 'comment' + +FRAUD_REASONS = [ + 'violence', + 'spam', + 'plagiarism', + 'slander', + 'illegal', + 'other' +] + +FRAUD_NEED_ORIGINAL_REASONS = ['plagiarism'] + +FRAUD_NEED_DETAIL_REASONS = ['illegal', 'other'] From 87937f2ffe660a2e44383c1f030d90f029667634 Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Fri, 13 Jul 2018 17:16:36 +0900 Subject: [PATCH 02/20] =?UTF-8?q?=E3=83=91=E3=83=A9=E3=83=A1=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E3=83=BC=E3=81=AB=E9=81=95=E5=8F=8D=E5=A0=B1=E5=91=8A?= =?UTF-8?q?=E3=81=AE=E8=A9=B3=E7=B4=B0=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api-template.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/api-template.yaml b/api-template.yaml index cdfdd9f4..d259a16f 100644 --- a/api-template.yaml +++ b/api-template.yaml @@ -214,6 +214,17 @@ Resources: type: string created_at: type: integer + MeArticlesFraudCreate: + type: object + properties: + reason: + type: string + plagiarism_url: + type: string + plagiarism_description: + type: string + illegal_content: + type: string paths: /search/articles: get: @@ -883,6 +894,11 @@ Resources: description: '対象記事の指定するために使用' required: true type: 'string' + - name: 'FraudContents' + in: 'body' + description: '違反報告の内容' + schema: + $ref: '#/definitions/MeArticlesFraudCreate' responses: '200': description: '不正報告の実施成功' From f7592fe285f696c06344261feb0049b70fcc4ab1 Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Fri, 13 Jul 2018 18:28:00 +0900 Subject: [PATCH 03/20] =?UTF-8?q?=E5=85=A5=E5=8A=9B=E3=81=AE=E6=A4=9C?= =?UTF-8?q?=E8=A8=BC=E3=82=92=E8=BF=BD=E5=8A=A0=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fraud/create/me_articles_fraud_create.py | 22 +++++--- .../create/test_me_articles_fraud_create.py | 53 ++++++++++++++++++- 2 files changed, 68 insertions(+), 7 deletions(-) diff --git a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py index 33e1472c..b7c05de2 100644 --- a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py +++ b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py @@ -14,20 +14,24 @@ def get_schema(self): return { 'type': 'object', 'properties': { - 'article_id': settings.parameters['article_id'] + 'article_id': settings.parameters['article_id'], + 'reason': { + 'type': 'string', + 'enum': settings.FRAUD_REASONS + } }, 'required': ['article_id'] } def validate_params(self): - # single - if self.event.get('pathParameters') is None: - raise ValidationError('pathParameters is required') - validate(self.event.get('pathParameters'), self.get_schema()) + if not self.event.get('body'): + raise ValidationError('Request parameter is required') + + validate(self.params, self.get_schema()) # relation DBUtil.validate_article_existence( self.dynamodb, - self.event['pathParameters']['article_id'], + self.params['article_id'], status='public' ) @@ -36,6 +40,7 @@ def exec_main_proc(self): article_fraud_user_table = self.dynamodb.Table(os.environ['ARTICLE_FRAUD_USER_TABLE_NAME']) self.__create_article_fraud_user(article_fraud_user_table) except ClientError as e: + print(e) if e.response['Error']['Code'] == 'ConditionalCheckFailedException': return { 'statusCode': 400, @@ -58,3 +63,8 @@ def __create_article_fraud_user(self, article_fraud_user_table): Item=article_fraud_user, ConditionExpression='attribute_not_exists(article_id)' ) + + def __validate_plagiarism(self): + # TODO: + + diff --git a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py index 75c8e00d..2f3ef80a 100644 --- a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py +++ b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py @@ -1,4 +1,5 @@ import os +import json from tests_util import TestsUtil from unittest import TestCase from me_articles_fraud_create import MeArticlesFraudCreate @@ -19,16 +20,19 @@ def setUpClass(cls): { 'article_id': 'testid000000', 'user_id': 'test01', + 'reason': 'violence', 'created_at': 1520150272 }, { 'article_id': 'testid000001', 'user_id': 'test01', + 'reason': 'violence', 'created_at': 1520150273 }, { 'article_id': 'testid000002', 'user_id': 'test02', + 'reason': 'violence', 'created_at': 1520150273 } ] @@ -52,8 +56,13 @@ def setUpClass(cls): }, { 'article_id': 'testid000002', - 'status': 'draft', + 'status': 'public', 'sort_key': 1520150272000002 + }, + { + 'article_id': 'testid000003', + 'status': 'draft', + 'sort_key': 1520150272000003 } ] TestsUtil.create_table( @@ -78,6 +87,7 @@ def test_main_ok_exist_article_id(self): 'pathParameters': { 'article_id': self.article_fraud_user_table_items[0]['article_id'] }, + 'body': json.dumps({'reason': self.article_fraud_user_table_items[0]['reason']}), 'requestContext': { 'authorizer': { 'claims': { @@ -97,12 +107,14 @@ def test_main_ok_exist_article_id(self): target_article_id = params['pathParameters']['article_id'] target_user_id = params['requestContext']['authorizer']['claims']['cognito:username'] + target_reason = json.loads(params['body'])['reason'] article_fraud_user = self.get_article_fraud_user(target_article_id, target_user_id) expected_items = { 'article_id': target_article_id, 'user_id': target_user_id, + 'reason': target_reason, 'created_at': 1520150272000003 } @@ -117,6 +129,7 @@ def test_call_validate_article_existence(self): 'pathParameters': { 'article_id': 'testid000002' }, + 'body': json.dumps({'reason': self.article_fraud_user_table_items[0]['reason']}), 'requestContext': { 'authorizer': { 'claims': { @@ -141,6 +154,7 @@ def test_main_ng_exist_user_id(self): 'pathParameters': { 'article_id': self.article_fraud_user_table_items[0]['article_id'] }, + 'body': json.dumps({'reason': self.article_fraud_user_table_items[0]['reason']}), 'requestContext': { 'authorizer': { 'claims': { @@ -177,6 +191,43 @@ def test_validation_article_id_min(self): self.assert_bad_request(params) + def test_validation_invalid_reason(self): + params = { + 'pathParameters': { + 'article_id': self.article_fraud_user_table_items[1]['article_id'] + }, + 'body': json.dumps({'reason': 'abcde'}), + 'requestContext': { + 'authorizer': { + 'claims': { + 'cognito:username': 'test03' + } + } + } + } + self.assert_bad_request(params) + + def test_validation_required_plagiarism_url_when_reason_is_plagiarism(self): + params = { + 'pathParameters': { + 'article_id': self.article_fraud_user_table_items[2]['article_id'] + }, + 'body': json.dumps( + { + 'reason': 'plagiarism', + 'plagiarism_url': '', + } + ), + 'requestContext': { + 'authorizer': { + 'claims': { + 'cognito:username': 'test03' + } + } + } + } + self.assert_bad_request(params) + def get_article_fraud_user(self, article_id, user_id): query_params = { 'KeyConditionExpression': Key('article_id').eq(article_id) & Key('user_id').eq(user_id) From b873079e47952aacb09544d064aeec431331eaa5 Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Fri, 13 Jul 2018 18:35:05 +0900 Subject: [PATCH 04/20] =?UTF-8?q?print=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/articles/fraud/create/me_articles_fraud_create.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py index b7c05de2..c108742b 100644 --- a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py +++ b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py @@ -40,7 +40,6 @@ def exec_main_proc(self): article_fraud_user_table = self.dynamodb.Table(os.environ['ARTICLE_FRAUD_USER_TABLE_NAME']) self.__create_article_fraud_user(article_fraud_user_table) except ClientError as e: - print(e) if e.response['Error']['Code'] == 'ConditionalCheckFailedException': return { 'statusCode': 400, From d97f069d2cf2377ffcca146cb058ffa6baefe34a Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Sat, 14 Jul 2018 17:24:34 +0900 Subject: [PATCH 05/20] =?UTF-8?q?=E7=89=B9=E5=AE=9A=E3=81=AE=E7=90=86?= =?UTF-8?q?=E7=94=B1=E3=81=AE=E6=99=82=E3=81=AB=E4=BE=9D=E5=AD=98=E9=A0=85?= =?UTF-8?q?=E7=9B=AE=E3=81=AE=E5=85=A5=E5=8A=9B=E3=83=81=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=82=AF=20(jsonschema=E3=81=A7=E3=82=84=E3=82=8A=E3=81=9F?= =?UTF-8?q?=E3=81=8F=E3=81=A6=E8=89=B2=E3=80=85=E8=AA=BF=E3=81=B9=E3=81=9F?= =?UTF-8?q?=E3=81=8C=E3=80=81draft-07=E3=81=A7=E5=88=9D=E3=82=81=E3=81=A6i?= =?UTF-8?q?f=E3=81=8C=E7=99=BB=E5=A0=B4=E3=81=97=E3=81=A6=E3=81=9F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fraud/create/me_articles_fraud_create.py | 28 +++++++++++++++---- .../create/test_me_articles_fraud_create.py | 8 ------ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py index c108742b..cfaac53a 100644 --- a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py +++ b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py @@ -18,16 +18,25 @@ def get_schema(self): 'reason': { 'type': 'string', 'enum': settings.FRAUD_REASONS - } + }, + 'plagiarism_url': { + 'type': 'string', + }, + 'plagiarism_description': { + 'type': 'string' + }, + 'illegal_content': { + 'type': 'string' + }, }, 'required': ['article_id'] } def validate_params(self): - if not self.event.get('body'): + if self.event.get('pathParameters') is None: raise ValidationError('Request parameter is required') - validate(self.params, self.get_schema()) + self.__validate_reason_dependencies(self.params) # relation DBUtil.validate_article_existence( self.dynamodb, @@ -63,7 +72,16 @@ def __create_article_fraud_user(self, article_fraud_user_table): ConditionExpression='attribute_not_exists(article_id)' ) - def __validate_plagiarism(self): - # TODO: + def __validate_reason_dependencies(self, params): + reason = params.get('reason', '') + if reason in settings.FRAUD_NEED_ORIGINAL_REASONS: + self.__validate_dependencies(params, ['plagiarism_url', 'plagiarism_description']) + + if reason in settings.FRAUD_NEED_DETAIL_REASONS: + self.__validate_dependencies(params, ['illegal_content']) + def __validate_dependencies(self, params, required_items): + for item in required_items: + if not params[item]: + raise ValidationError("%s is required" % item) diff --git a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py index 2f3ef80a..e1adc2f8 100644 --- a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py +++ b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py @@ -20,19 +20,16 @@ def setUpClass(cls): { 'article_id': 'testid000000', 'user_id': 'test01', - 'reason': 'violence', 'created_at': 1520150272 }, { 'article_id': 'testid000001', 'user_id': 'test01', - 'reason': 'violence', 'created_at': 1520150273 }, { 'article_id': 'testid000002', 'user_id': 'test02', - 'reason': 'violence', 'created_at': 1520150273 } ] @@ -87,7 +84,6 @@ def test_main_ok_exist_article_id(self): 'pathParameters': { 'article_id': self.article_fraud_user_table_items[0]['article_id'] }, - 'body': json.dumps({'reason': self.article_fraud_user_table_items[0]['reason']}), 'requestContext': { 'authorizer': { 'claims': { @@ -107,14 +103,12 @@ def test_main_ok_exist_article_id(self): target_article_id = params['pathParameters']['article_id'] target_user_id = params['requestContext']['authorizer']['claims']['cognito:username'] - target_reason = json.loads(params['body'])['reason'] article_fraud_user = self.get_article_fraud_user(target_article_id, target_user_id) expected_items = { 'article_id': target_article_id, 'user_id': target_user_id, - 'reason': target_reason, 'created_at': 1520150272000003 } @@ -129,7 +123,6 @@ def test_call_validate_article_existence(self): 'pathParameters': { 'article_id': 'testid000002' }, - 'body': json.dumps({'reason': self.article_fraud_user_table_items[0]['reason']}), 'requestContext': { 'authorizer': { 'claims': { @@ -154,7 +147,6 @@ def test_main_ng_exist_user_id(self): 'pathParameters': { 'article_id': self.article_fraud_user_table_items[0]['article_id'] }, - 'body': json.dumps({'reason': self.article_fraud_user_table_items[0]['reason']}), 'requestContext': { 'authorizer': { 'claims': { From cb36b08e2f4bbc93f741d1bec13a2cb1617fac7b Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Sat, 14 Jul 2018 18:02:56 +0900 Subject: [PATCH 06/20] =?UTF-8?q?=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF?= =?UTF-8?q?=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0=E3=81=A4=E3=81=84=E3=81=A7?= =?UTF-8?q?=E3=81=AB=E3=83=86=E3=82=B9=E3=83=88FIX?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/settings.py | 35 ++++++-- .../fraud/create/me_articles_fraud_create.py | 27 +++--- .../create/test_me_articles_fraud_create.py | 82 ++++++++++++++----- 3 files changed, 101 insertions(+), 43 deletions(-) diff --git a/src/common/settings.py b/src/common/settings.py index 1c6f968f..2b413eff 100644 --- a/src/common/settings.py +++ b/src/common/settings.py @@ -95,6 +95,32 @@ 'type': 'string', 'minLength': 1, 'maxLength': 150 + }, + 'fraud_user': { + 'reason': { + 'type': 'string', + 'enum': [ + 'violence', + 'spam', + 'plagiarism', + 'slander', + 'illegal', + 'other' + ] + }, + 'plagiarism_url': { + 'type': 'string', + 'format': 'uri', + 'maxLength': 2048 + }, + 'plagiarism_description': { + 'type': 'string', + 'maxLength': 1000 + }, + 'illegal_content': { + 'type': 'string', + 'maxLength': 1000 + } } } @@ -160,15 +186,6 @@ LIKE_NOTIFICATION_TYPE = 'like' COMMENT_NOTIFICATION_TYPE = 'comment' -FRAUD_REASONS = [ - 'violence', - 'spam', - 'plagiarism', - 'slander', - 'illegal', - 'other' -] - FRAUD_NEED_ORIGINAL_REASONS = ['plagiarism'] FRAUD_NEED_DETAIL_REASONS = ['illegal', 'other'] diff --git a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py index cfaac53a..653ae30b 100644 --- a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py +++ b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py @@ -15,20 +15,21 @@ def get_schema(self): 'type': 'object', 'properties': { 'article_id': settings.parameters['article_id'], - 'reason': { - 'type': 'string', - 'enum': settings.FRAUD_REASONS - }, - 'plagiarism_url': { - 'type': 'string', - }, - 'plagiarism_description': { - 'type': 'string' - }, - 'illegal_content': { - 'type': 'string' - }, + 'reason': settings.parameters['fraud_user']['reason'], + 'plagiarism_url': settings.parameters['fraud_user']['plagiarism_url'], + 'plagiarism_description': settings.parameters['fraud_user']['plagiarism_description'], + 'illegal_content': settings.parameters['fraud_user']['illegal_content'] }, + 'anyOf': [ + { + 'properties': { + 'reason': { + 'enum': settings.FRAUD_REASONS + }, + } + + } + ], 'required': ['article_id'] } diff --git a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py index e1adc2f8..acf013b2 100644 --- a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py +++ b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py @@ -84,6 +84,12 @@ def test_main_ok_exist_article_id(self): 'pathParameters': { 'article_id': self.article_fraud_user_table_items[0]['article_id'] }, + 'body': json.dumps({ + 'reason': 'plagiarism', + 'plagiarism_url': 'http://test.com', + 'plagiarism_description': 'plagiarism description', + 'illegal_content': 'illegal content' + }), 'requestContext': { 'authorizer': { 'claims': { @@ -103,12 +109,21 @@ def test_main_ok_exist_article_id(self): target_article_id = params['pathParameters']['article_id'] target_user_id = params['requestContext']['authorizer']['claims']['cognito:username'] + body = json.loads(params['body']) + target_reason = body['reason'] + target_plagiarism_url = body['plagiarism_url'] + target_plagiarism_description = body['plagiarism_description'] + target_illegal_content = body['illegal_content'] article_fraud_user = self.get_article_fraud_user(target_article_id, target_user_id) expected_items = { 'article_id': target_article_id, 'user_id': target_user_id, + 'reason': target_reason, + 'plagiarism_url': target_plagiarism_url, + 'plagiarism_description': target_plagiarism_description, + 'illegal_content': target_illegal_content, 'created_at': 1520150272000003 } @@ -185,38 +200,63 @@ def test_validation_article_id_min(self): def test_validation_invalid_reason(self): params = { - 'pathParameters': { - 'article_id': self.article_fraud_user_table_items[1]['article_id'] - }, - 'body': json.dumps({'reason': 'abcde'}), - 'requestContext': { - 'authorizer': { - 'claims': { - 'cognito:username': 'test03' - } - } - } + 'body': json.dumps({'reason': 'abcde'}) } self.assert_bad_request(params) def test_validation_required_plagiarism_url_when_reason_is_plagiarism(self): params = { - 'pathParameters': { - 'article_id': self.article_fraud_user_table_items[2]['article_id'] - }, 'body': json.dumps( { 'reason': 'plagiarism', 'plagiarism_url': '', } - ), - 'requestContext': { - 'authorizer': { - 'claims': { - 'cognito:username': 'test03' - } + ) + } + self.assert_bad_request(params) + + def test_validation_required_plagiarism_description_when_reason_is_plagiarism(self): + params = { + 'body': json.dumps( + { + 'reason': 'plagiarism', + 'plagiarism_url': 'http://test.com', + 'plagiarism_description': '', } - } + ) + } + self.assert_bad_request(params) + + def test_validation_invalid_plagiarism_url_when_reason_is_plagiarism(self): + params = { + 'body': json.dumps( + { + 'reason': 'plagiarism', + 'plagiarism_url': 'aaa' + } + ) + } + self.assert_bad_request(params) + + def test_validation_required_illegal_content_when_reason_is_illegal(self): + params = { + 'body': json.dumps( + { + 'reason': 'illegal', + 'illegal_content': '', + } + ) + } + self.assert_bad_request(params) + + def test_validation_required_illegal_content_when_reason_is_other(self): + params = { + 'body': json.dumps( + { + 'reason': 'other', + 'illegal_content': '', + } + ) } self.assert_bad_request(params) From fc446e875b13075033f9157712b650d28fa673ce Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Sat, 14 Jul 2018 18:05:22 +0900 Subject: [PATCH 07/20] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AA=E5=B7=AE?= =?UTF-8?q?=E5=88=86=E3=81=8C=E3=81=A7=E3=81=A6=E3=81=9F=E3=81=AE=E3=81=A7?= =?UTF-8?q?=E6=88=BB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/articles/fraud/create/me_articles_fraud_create.py | 3 ++- .../articles/fraud/create/test_me_articles_fraud_create.py | 7 +------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py index 653ae30b..2995f30c 100644 --- a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py +++ b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py @@ -34,8 +34,9 @@ def get_schema(self): } def validate_params(self): + # single if self.event.get('pathParameters') is None: - raise ValidationError('Request parameter is required') + raise ValidationError('pathParameters is required') validate(self.params, self.get_schema()) self.__validate_reason_dependencies(self.params) # relation diff --git a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py index acf013b2..4b1d836b 100644 --- a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py +++ b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py @@ -53,13 +53,8 @@ def setUpClass(cls): }, { 'article_id': 'testid000002', - 'status': 'public', - 'sort_key': 1520150272000002 - }, - { - 'article_id': 'testid000003', 'status': 'draft', - 'sort_key': 1520150272000003 + 'sort_key': 1520150272000002 } ] TestsUtil.create_table( From e71fb4292343f8ad07c5d5dd675caa92d7cc878f Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Sat, 14 Jul 2018 18:06:25 +0900 Subject: [PATCH 08/20] =?UTF-8?q?=E7=A9=BA=E3=81=AE=E8=A1=8C=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/articles/fraud/create/me_articles_fraud_create.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py index 2995f30c..63977f48 100644 --- a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py +++ b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py @@ -23,11 +23,8 @@ def get_schema(self): 'anyOf': [ { 'properties': { - 'reason': { - 'enum': settings.FRAUD_REASONS - }, + 'reason': {'enum': settings.FRAUD_REASONS} } - } ], 'required': ['article_id'] From 4a443067490df0223ead91fc1912c1a8720ffc0e Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Sat, 14 Jul 2018 18:45:43 +0900 Subject: [PATCH 09/20] =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E9=A0=85=E7=9B=AE?= =?UTF-8?q?=E3=81=8Cinsert=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84=E3=81=AA?= =?UTF-8?q?=E3=81=84=E3=81=A8=E3=81=84=E3=81=86=E7=97=9B=E6=81=A8=E3=81=AE?= =?UTF-8?q?=E3=83=9F=E3=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../articles/fraud/create/me_articles_fraud_create.py | 4 ++++ .../fraud/create/test_me_articles_fraud_create.py | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py index 63977f48..478c3367 100644 --- a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py +++ b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py @@ -64,6 +64,10 @@ def __create_article_fraud_user(self, article_fraud_user_table): article_fraud_user = { 'article_id': self.event['pathParameters']['article_id'], 'user_id': self.event['requestContext']['authorizer']['claims']['cognito:username'], + 'reason': self.params.get('reason'), + 'plagiarism_url': self.params.get('plagiarism_url'), + 'plagiarism_description': self.params.get('plagiarism_description'), + 'illegal_content': self.params.get('illegal_content'), 'created_at': int(time.time()) } article_fraud_user_table.put_item( diff --git a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py index 4b1d836b..45cbddec 100644 --- a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py +++ b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py @@ -124,7 +124,15 @@ def test_main_ok_exist_article_id(self): self.assertEqual(response['statusCode'], 200) self.assertEqual(len(article_fraud_user_after), len(article_fraud_user_before) + 1) - article_fraud_user_param_names = ['article_id', 'user_id', 'created_at'] + article_fraud_user_param_names = [ + 'article_id', + 'user_id', + 'reason', + 'plagiarism_url', + 'plagiarism_description', + 'illegal_content', + 'created_at' + ] for key in article_fraud_user_param_names: self.assertEqual(expected_items[key], article_fraud_user[key]) From 38756fbceec312e1df7fbba754c60a96d5b17329 Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Sat, 14 Jul 2018 18:57:50 +0900 Subject: [PATCH 10/20] =?UTF-8?q?pycodestyle=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/articles/fraud/create/me_articles_fraud_create.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py index 478c3367..eb618a75 100644 --- a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py +++ b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py @@ -87,4 +87,3 @@ def __validate_dependencies(self, params, required_items): for item in required_items: if not params[item]: raise ValidationError("%s is required" % item) - From b987a616dc043218f9c37ae8fc8be5e6e100dcc1 Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Tue, 24 Jul 2018 16:57:44 +0900 Subject: [PATCH 11/20] =?UTF-8?q?=E6=A1=81=E6=95=B0=E3=80=81=E5=85=A5?= =?UTF-8?q?=E5=8A=9B=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=83=AB=E3=83=BC?= =?UTF-8?q?=E3=83=AB=E3=81=AE=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fraud/create/me_articles_fraud_create.py | 29 +++---- .../create/test_me_articles_fraud_create.py | 79 +++++++++++++------ 2 files changed, 71 insertions(+), 37 deletions(-) diff --git a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py index eb618a75..822d91d7 100644 --- a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py +++ b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py @@ -25,6 +25,21 @@ def get_schema(self): 'properties': { 'reason': {'enum': settings.FRAUD_REASONS} } + }, + { + 'properties': { + 'reason': {'enum': settings.FRAUD_NEED_ORIGINAL_REASONS} + }, + 'anyOf': [ + {'required': ['plagiarism_url']}, + {'required': ['plagiarism_description']} + ] + }, + { + 'properties': { + 'reason': {'enum': settings.FRAUD_NEED_DETAIL_REASONS} + }, + 'required': ['illegal_content'] } ], 'required': ['article_id'] @@ -35,7 +50,6 @@ def validate_params(self): if self.event.get('pathParameters') is None: raise ValidationError('pathParameters is required') validate(self.params, self.get_schema()) - self.__validate_reason_dependencies(self.params) # relation DBUtil.validate_article_existence( self.dynamodb, @@ -74,16 +88,3 @@ def __create_article_fraud_user(self, article_fraud_user_table): Item=article_fraud_user, ConditionExpression='attribute_not_exists(article_id)' ) - - def __validate_reason_dependencies(self, params): - reason = params.get('reason', '') - if reason in settings.FRAUD_NEED_ORIGINAL_REASONS: - self.__validate_dependencies(params, ['plagiarism_url', 'plagiarism_description']) - - if reason in settings.FRAUD_NEED_DETAIL_REASONS: - self.__validate_dependencies(params, ['illegal_content']) - - def __validate_dependencies(self, params, required_items): - for item in required_items: - if not params[item]: - raise ValidationError("%s is required" % item) diff --git a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py index 45cbddec..7f89a6d3 100644 --- a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py +++ b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py @@ -105,10 +105,10 @@ def test_main_ok_exist_article_id(self): target_article_id = params['pathParameters']['article_id'] target_user_id = params['requestContext']['authorizer']['claims']['cognito:username'] body = json.loads(params['body']) - target_reason = body['reason'] - target_plagiarism_url = body['plagiarism_url'] - target_plagiarism_description = body['plagiarism_description'] - target_illegal_content = body['illegal_content'] + target_reason = body.get('reason') + target_plagiarism_url = body.get('plagiarism_url') + target_plagiarism_description = body.get('plagiarism_description') + target_illegal_content = body.get('illegal_content') article_fraud_user = self.get_article_fraud_user(target_article_id, target_user_id) @@ -202,65 +202,83 @@ def test_validation_article_id_min(self): self.assert_bad_request(params) def test_validation_invalid_reason(self): - params = { + body = { 'body': json.dumps({'reason': 'abcde'}) } + params = dict(self.get_parameters_other_than_body(), **body) self.assert_bad_request(params) - def test_validation_required_plagiarism_url_when_reason_is_plagiarism(self): - params = { + def test_validation_required_plagiarism_detail_when_reason_is_plagiarism(self): + body = { 'body': json.dumps( { 'reason': 'plagiarism', 'plagiarism_url': '', + 'plagiarism_description': '' } ) } + params = dict(self.get_parameters_other_than_body(), **body) self.assert_bad_request(params) - def test_validation_required_plagiarism_description_when_reason_is_plagiarism(self): - params = { + def test_validation_invalid_plagiarism_url_when_reason_is_plagiarism(self): + body = { 'body': json.dumps( { 'reason': 'plagiarism', - 'plagiarism_url': 'http://test.com', - 'plagiarism_description': '', + 'plagiarism_url': 'aaa' } ) } + params = dict(self.get_parameters_other_than_body(), **body) self.assert_bad_request(params) - def test_validation_invalid_plagiarism_url_when_reason_is_plagiarism(self): - params = { + def test_validation_required_illegal_content_when_reason_is_illegal(self): + body = { 'body': json.dumps( { - 'reason': 'plagiarism', - 'plagiarism_url': 'aaa' + 'reason': 'illegal', + 'illegal_content': '' } ) } + params = dict(self.get_parameters_other_than_body(), **body) self.assert_bad_request(params) - def test_validation_required_illegal_content_when_reason_is_illegal(self): - params = { + def test_validation_required_illegal_content_when_reason_is_other(self): + body = { 'body': json.dumps( { - 'reason': 'illegal', - 'illegal_content': '', + 'reason': 'other', + 'illegal_content': '' } ) } + params = dict(self.get_parameters_other_than_body(), **body) self.assert_bad_request(params) - def test_validation_required_illegal_content_when_reason_is_other(self): - params = { + def test_validation_plagiarism_description_max(self): + body = { 'body': json.dumps( { - 'reason': 'other', - 'illegal_content': '', + 'reason': 'plagiarism', + 'plagiarism_description': u'あ' * 1001 } ) } + params = dict(self.get_parameters_other_than_body(), **body) + self.assert_bad_request(params) + + def test_validation_illegal_content_max(self): + body = { + 'body': json.dumps( + { + 'reason': 'illegal', + 'illegal_content': u'あ' * 1001 + } + ) + } + params = dict(self.get_parameters_other_than_body(), **body) self.assert_bad_request(params) def get_article_fraud_user(self, article_id, user_id): @@ -269,3 +287,18 @@ def get_article_fraud_user(self, article_id, user_id): } article_fraud_user_table = self.dynamodb.Table(os.environ['ARTICLE_FRAUD_USER_TABLE_NAME']) return article_fraud_user_table.query(**query_params)['Items'][0] + + def get_parameters_other_than_body(self): + basic_params = { + 'pathParameters': { + 'article_id': self.article_fraud_user_table_items[1]['article_id'] + }, + 'requestContext': { + 'authorizer': { + 'claims': { + 'cognito:username': 'test03' + } + } + } + } + return basic_params From c416670238d1dc9b6685140e92913b550ceb85b7 Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Tue, 24 Jul 2018 18:55:48 +0900 Subject: [PATCH 12/20] =?UTF-8?q?=E4=B8=80=E6=97=A6=E5=89=8D=E3=81=AE?= =?UTF-8?q?=E5=AE=9F=E8=A3=85=E3=81=AB=E6=88=BB=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fraud/create/me_articles_fraud_create.py | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py index 822d91d7..1642de5a 100644 --- a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py +++ b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py @@ -25,21 +25,6 @@ def get_schema(self): 'properties': { 'reason': {'enum': settings.FRAUD_REASONS} } - }, - { - 'properties': { - 'reason': {'enum': settings.FRAUD_NEED_ORIGINAL_REASONS} - }, - 'anyOf': [ - {'required': ['plagiarism_url']}, - {'required': ['plagiarism_description']} - ] - }, - { - 'properties': { - 'reason': {'enum': settings.FRAUD_NEED_DETAIL_REASONS} - }, - 'required': ['illegal_content'] } ], 'required': ['article_id'] @@ -50,6 +35,7 @@ def validate_params(self): if self.event.get('pathParameters') is None: raise ValidationError('pathParameters is required') validate(self.params, self.get_schema()) + self.__validate_reason_dependencies(self.params) # relation DBUtil.validate_article_existence( self.dynamodb, @@ -88,3 +74,16 @@ def __create_article_fraud_user(self, article_fraud_user_table): Item=article_fraud_user, ConditionExpression='attribute_not_exists(article_id)' ) + + def __validate_reason_dependencies(self, params): + reason = params.get('reason', '') + if reason in settings.FRAUD_NEED_ORIGINAL_REASONS: + self.__validate_dependencies(params, ['plagiarism_url', 'plagiarism_description']) + + if reason in settings.FRAUD_NEED_DETAIL_REASONS: + self.__validate_dependencies(params, ['illegal_content']) + + def __validate_dependencies(self, params, required_items): + for item in required_items: + if not params.get(item): + raise ValidationError("%s is required" % item) From a4cb890f1d892dbd38fef3b37712df6ea4e4e755 Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Wed, 25 Jul 2018 12:29:59 +0900 Subject: [PATCH 13/20] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=83=91?= =?UTF-8?q?=E3=82=BF=E3=83=BC=E3=83=B3=E3=81=AB=E3=81=9D=E3=82=8C=E3=81=9E?= =?UTF-8?q?=E3=82=8C=E3=81=AE=E7=90=86=E7=94=B1=E3=81=A7=E3=81=AE=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E7=B3=BB=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fraud/create/me_articles_fraud_create.py | 23 +- .../create/test_me_articles_fraud_create.py | 202 ++++++++++++++++-- 2 files changed, 202 insertions(+), 23 deletions(-) diff --git a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py index 1642de5a..53cef205 100644 --- a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py +++ b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py @@ -6,7 +6,7 @@ from db_util import DBUtil from botocore.exceptions import ClientError from lambda_base import LambdaBase -from jsonschema import validate, ValidationError +from jsonschema import validate, ValidationError, FormatChecker class MeArticlesFraudCreate(LambdaBase): @@ -34,12 +34,12 @@ def validate_params(self): # single if self.event.get('pathParameters') is None: raise ValidationError('pathParameters is required') - validate(self.params, self.get_schema()) + validate(self.params, self.get_schema(), format_checker=FormatChecker()) self.__validate_reason_dependencies(self.params) # relation DBUtil.validate_article_existence( self.dynamodb, - self.params['article_id'], + self.event['pathParameters']['article_id'], status='public' ) @@ -76,14 +76,17 @@ def __create_article_fraud_user(self, article_fraud_user_table): ) def __validate_reason_dependencies(self, params): - reason = params.get('reason', '') + reason = params.get('reason') if reason in settings.FRAUD_NEED_ORIGINAL_REASONS: - self.__validate_dependencies(params, ['plagiarism_url', 'plagiarism_description']) + self.__validate_plagiarism_dependencies(params) if reason in settings.FRAUD_NEED_DETAIL_REASONS: - self.__validate_dependencies(params, ['illegal_content']) + self.__validate_illegal_content_dependencies(params) - def __validate_dependencies(self, params, required_items): - for item in required_items: - if not params.get(item): - raise ValidationError("%s is required" % item) + def __validate_plagiarism_dependencies(self, params): + if not params.get('plagiarism_url') and not params.get('plagiarism_description'): + raise ValidationError('plagiarism_url or plagiarism_description is required') + + def __validate_illegal_content_dependencies(self, params): + if not params.get('illegal_content'): + raise ValidationError('illegal_content is required') diff --git a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py index 7f89a6d3..85f053df 100644 --- a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py +++ b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py @@ -30,7 +30,22 @@ def setUpClass(cls): { 'article_id': 'testid000002', 'user_id': 'test02', - 'created_at': 1520150273 + 'created_at': 1520150274 + }, + { + 'article_id': 'testid000003', + 'user_id': 'test02', + 'created_at': 1520150275 + }, + { + 'article_id': 'testid000004', + 'user_id': 'test02', + 'created_at': 1520150276 + }, + { + 'article_id': 'testid000005', + 'user_id': 'test02', + 'created_at': 1520150277 } ] TestsUtil.create_table( @@ -55,7 +70,22 @@ def setUpClass(cls): 'article_id': 'testid000002', 'status': 'draft', 'sort_key': 1520150272000002 - } + }, + { + 'article_id': 'testid000003', + 'status': 'public', + 'sort_key': 1520150272000003 + }, + { + 'article_id': 'testid000004', + 'status': 'public', + 'sort_key': 1520150272000004 + }, + { + 'article_id': 'testid000005', + 'status': 'public', + 'sort_key': 1520150272000005 + }, ] TestsUtil.create_table( cls.dynamodb, @@ -79,11 +109,109 @@ def test_main_ok_exist_article_id(self): 'pathParameters': { 'article_id': self.article_fraud_user_table_items[0]['article_id'] }, + 'requestContext': { + 'authorizer': { + 'claims': { + 'cognito:username': 'test03' + } + } + } + } + + article_fraud_user_table = self.dynamodb.Table(os.environ['ARTICLE_FRAUD_USER_TABLE_NAME']) + article_fraud_user_before = article_fraud_user_table.scan()['Items'] + + article_fraud_user = MeArticlesFraudCreate(event=params, context={}, dynamodb=self.dynamodb) + response = article_fraud_user.main() + + article_fraud_user_after = article_fraud_user_table.scan()['Items'] + + target_article_id = params['pathParameters']['article_id'] + target_user_id = params['requestContext']['authorizer']['claims']['cognito:username'] + + article_fraud_user = self.get_article_fraud_user(target_article_id, target_user_id) + + expected_items = { + 'article_id': target_article_id, + 'user_id': target_user_id, + 'reason': target_reason, + 'plagiarism_url': target_plagiarism_url, + 'plagiarism_description': target_plagiarism_description, + 'illegal_content': target_illegal_content, + 'created_at': 1520150272000003 + } + + self.assertEqual(response['statusCode'], 200) + self.assertEqual(len(article_fraud_user_after), len(article_fraud_user_before) + 1) + article_fraud_user_param_names = [ + 'article_id', + 'user_id', + 'created_at' + ] + for key in article_fraud_user_param_names: + self.assertEqual(expected_items[key], article_fraud_user[key]) + + @patch('time.time', MagicMock(return_value=1520150272000003)) + def test_main_ok_added_reason(self): + params = { + 'pathParameters': { + 'article_id': self.article_fraud_user_table_items[1]['article_id'] + }, + 'body': json.dumps({ + 'reason': 'violence' + }), + 'requestContext': { + 'authorizer': { + 'claims': { + 'cognito:username': 'test03' + } + } + } + } + + article_fraud_user_table = self.dynamodb.Table(os.environ['ARTICLE_FRAUD_USER_TABLE_NAME']) + article_fraud_user_before = article_fraud_user_table.scan()['Items'] + + article_fraud_user = MeArticlesFraudCreate(event=params, context={}, dynamodb=self.dynamodb) + response = article_fraud_user.main() + + article_fraud_user_after = article_fraud_user_table.scan()['Items'] + + target_article_id = params['pathParameters']['article_id'] + target_user_id = params['requestContext']['authorizer']['claims']['cognito:username'] + body = json.loads(params['body']) + target_reason = body.get('reason') + + article_fraud_user = self.get_article_fraud_user(target_article_id, target_user_id) + + expected_items = { + 'article_id': target_article_id, + 'user_id': target_user_id, + 'reason': target_reason, + 'created_at': 1520150272000003 + } + + self.assertEqual(response['statusCode'], 200) + self.assertEqual(len(article_fraud_user_after), len(article_fraud_user_before) + 1) + article_fraud_user_param_names = [ + 'article_id', + 'user_id', + 'reason', + 'created_at' + ] + for key in article_fraud_user_param_names: + self.assertEqual(expected_items[key], article_fraud_user[key]) + + @patch('time.time', MagicMock(return_value=1520150272000003)) + def test_main_ok_reason_is_plagiarism(self): + params = { + 'pathParameters': { + 'article_id': self.article_fraud_user_table_items[3]['article_id'] + }, 'body': json.dumps({ 'reason': 'plagiarism', 'plagiarism_url': 'http://test.com', 'plagiarism_description': 'plagiarism description', - 'illegal_content': 'illegal content' }), 'requestContext': { 'authorizer': { @@ -108,7 +236,6 @@ def test_main_ok_exist_article_id(self): target_reason = body.get('reason') target_plagiarism_url = body.get('plagiarism_url') target_plagiarism_description = body.get('plagiarism_description') - target_illegal_content = body.get('illegal_content') article_fraud_user = self.get_article_fraud_user(target_article_id, target_user_id) @@ -118,7 +245,6 @@ def test_main_ok_exist_article_id(self): 'reason': target_reason, 'plagiarism_url': target_plagiarism_url, 'plagiarism_description': target_plagiarism_description, - 'illegal_content': target_illegal_content, 'created_at': 1520150272000003 } @@ -130,6 +256,60 @@ def test_main_ok_exist_article_id(self): 'reason', 'plagiarism_url', 'plagiarism_description', + 'created_at' + ] + for key in article_fraud_user_param_names: + self.assertEqual(expected_items[key], article_fraud_user[key]) + + @patch('time.time', MagicMock(return_value=1520150272000003)) + def test_main_ok_reason_is_other(self): + params = { + 'pathParameters': { + 'article_id': self.article_fraud_user_table_items[4]['article_id'] + }, + 'body': json.dumps({ + 'reason': 'other', + 'illegal_content': 'illegal content' + }), + 'requestContext': { + 'authorizer': { + 'claims': { + 'cognito:username': 'test03' + } + } + } + } + + article_fraud_user_table = self.dynamodb.Table(os.environ['ARTICLE_FRAUD_USER_TABLE_NAME']) + article_fraud_user_before = article_fraud_user_table.scan()['Items'] + + article_fraud_user = MeArticlesFraudCreate(event=params, context={}, dynamodb=self.dynamodb) + response = article_fraud_user.main() + + article_fraud_user_after = article_fraud_user_table.scan()['Items'] + + target_article_id = params['pathParameters']['article_id'] + target_user_id = params['requestContext']['authorizer']['claims']['cognito:username'] + body = json.loads(params['body']) + target_reason = body.get('reason') + target_illegal_content = body.get('illegal_content') + + article_fraud_user = self.get_article_fraud_user(target_article_id, target_user_id) + + expected_items = { + 'article_id': target_article_id, + 'user_id': target_user_id, + 'reason': target_reason, + 'illegal_content': target_illegal_content, + 'created_at': 1520150272000003 + } + + self.assertEqual(response['statusCode'], 200) + self.assertEqual(len(article_fraud_user_after), len(article_fraud_user_before) + 1) + article_fraud_user_param_names = [ + 'article_id', + 'user_id', + 'reason', 'illegal_content', 'created_at' ] @@ -212,9 +392,7 @@ def test_validation_required_plagiarism_detail_when_reason_is_plagiarism(self): body = { 'body': json.dumps( { - 'reason': 'plagiarism', - 'plagiarism_url': '', - 'plagiarism_description': '' + 'reason': 'plagiarism' } ) } @@ -237,8 +415,7 @@ def test_validation_required_illegal_content_when_reason_is_illegal(self): body = { 'body': json.dumps( { - 'reason': 'illegal', - 'illegal_content': '' + 'reason': 'illegal' } ) } @@ -249,8 +426,7 @@ def test_validation_required_illegal_content_when_reason_is_other(self): body = { 'body': json.dumps( { - 'reason': 'other', - 'illegal_content': '' + 'reason': 'other' } ) } @@ -291,7 +467,7 @@ def get_article_fraud_user(self, article_id, user_id): def get_parameters_other_than_body(self): basic_params = { 'pathParameters': { - 'article_id': self.article_fraud_user_table_items[1]['article_id'] + 'article_id': self.article_fraud_user_table_items[5]['article_id'] }, 'requestContext': { 'authorizer': { From 51bbe61952df306d683c7849b76cd6cc0d984eca Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Wed, 25 Jul 2018 12:33:22 +0900 Subject: [PATCH 14/20] =?UTF-8?q?=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89?= =?UTF-8?q?=E5=90=8D=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../create/test_me_articles_fraud_create.py | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py index 85f053df..c0181b03 100644 --- a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py +++ b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py @@ -134,10 +134,6 @@ def test_main_ok_exist_article_id(self): expected_items = { 'article_id': target_article_id, 'user_id': target_user_id, - 'reason': target_reason, - 'plagiarism_url': target_plagiarism_url, - 'plagiarism_description': target_plagiarism_description, - 'illegal_content': target_illegal_content, 'created_at': 1520150272000003 } @@ -385,7 +381,7 @@ def test_validation_invalid_reason(self): body = { 'body': json.dumps({'reason': 'abcde'}) } - params = dict(self.get_parameters_other_than_body(), **body) + params = dict(self.get_parameters_other_than_body_for_validate(), **body) self.assert_bad_request(params) def test_validation_required_plagiarism_detail_when_reason_is_plagiarism(self): @@ -396,7 +392,7 @@ def test_validation_required_plagiarism_detail_when_reason_is_plagiarism(self): } ) } - params = dict(self.get_parameters_other_than_body(), **body) + params = dict(self.get_parameters_other_than_body_for_validate(), **body) self.assert_bad_request(params) def test_validation_invalid_plagiarism_url_when_reason_is_plagiarism(self): @@ -408,7 +404,7 @@ def test_validation_invalid_plagiarism_url_when_reason_is_plagiarism(self): } ) } - params = dict(self.get_parameters_other_than_body(), **body) + params = dict(self.get_parameters_other_than_body_for_validate(), **body) self.assert_bad_request(params) def test_validation_required_illegal_content_when_reason_is_illegal(self): @@ -419,7 +415,7 @@ def test_validation_required_illegal_content_when_reason_is_illegal(self): } ) } - params = dict(self.get_parameters_other_than_body(), **body) + params = dict(self.get_parameters_other_than_body_for_validate(), **body) self.assert_bad_request(params) def test_validation_required_illegal_content_when_reason_is_other(self): @@ -430,7 +426,7 @@ def test_validation_required_illegal_content_when_reason_is_other(self): } ) } - params = dict(self.get_parameters_other_than_body(), **body) + params = dict(self.get_parameters_other_than_body_for_validate(), **body) self.assert_bad_request(params) def test_validation_plagiarism_description_max(self): @@ -442,7 +438,7 @@ def test_validation_plagiarism_description_max(self): } ) } - params = dict(self.get_parameters_other_than_body(), **body) + params = dict(self.get_parameters_other_than_body_for_validate(), **body) self.assert_bad_request(params) def test_validation_illegal_content_max(self): @@ -454,7 +450,7 @@ def test_validation_illegal_content_max(self): } ) } - params = dict(self.get_parameters_other_than_body(), **body) + params = dict(self.get_parameters_other_than_body_for_validate(), **body) self.assert_bad_request(params) def get_article_fraud_user(self, article_id, user_id): @@ -464,7 +460,7 @@ def get_article_fraud_user(self, article_id, user_id): article_fraud_user_table = self.dynamodb.Table(os.environ['ARTICLE_FRAUD_USER_TABLE_NAME']) return article_fraud_user_table.query(**query_params)['Items'][0] - def get_parameters_other_than_body(self): + def get_parameters_other_than_body_for_validate(self): basic_params = { 'pathParameters': { 'article_id': self.article_fraud_user_table_items[5]['article_id'] From 4c0352db329bcfbc2c065848b02d06e734cda182 Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Wed, 25 Jul 2018 12:35:07 +0900 Subject: [PATCH 15/20] =?UTF-8?q?=E5=B7=AE=E5=88=86=E3=81=8C=E3=81=A7?= =?UTF-8?q?=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E5=85=83=E3=81=AB=E6=88=BB?= =?UTF-8?q?=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../articles/fraud/create/test_me_articles_fraud_create.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py index c0181b03..2c8d8b74 100644 --- a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py +++ b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py @@ -139,11 +139,7 @@ def test_main_ok_exist_article_id(self): self.assertEqual(response['statusCode'], 200) self.assertEqual(len(article_fraud_user_after), len(article_fraud_user_before) + 1) - article_fraud_user_param_names = [ - 'article_id', - 'user_id', - 'created_at' - ] + article_fraud_user_param_names = ['article_id', 'user_id', 'created_at'] for key in article_fraud_user_param_names: self.assertEqual(expected_items[key], article_fraud_user[key]) From abe0a6231b7c6ab42a535f8e55352b930d0ede15 Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Mon, 30 Jul 2018 18:37:21 +0900 Subject: [PATCH 16/20] =?UTF-8?q?=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF?= =?UTF-8?q?=E3=82=BF:=20=E3=81=94=E6=8C=87=E6=91=98=E3=81=84=E3=81=9F?= =?UTF-8?q?=E3=81=A0=E3=81=84=E3=81=9F=E9=80=9A=E3=82=8A=E3=82=B7=E3=83=B3?= =?UTF-8?q?=E3=83=97=E3=83=AB=E3=81=AB=E6=9B=B8=E3=81=91=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E3=81=A7=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared-local-instance.db | Bin 0 -> 33792 bytes .../fraud/create/me_articles_fraud_create.py | 7 ------- 2 files changed, 7 deletions(-) create mode 100644 shared-local-instance.db diff --git a/shared-local-instance.db b/shared-local-instance.db new file mode 100644 index 0000000000000000000000000000000000000000..a7a3dd34cb8052952da738d85558d71bd9292145 GIT binary patch literal 33792 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 literal 0 HcmV?d00001 diff --git a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py index 53cef205..8f1594cc 100644 --- a/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py +++ b/src/handlers/me/articles/fraud/create/me_articles_fraud_create.py @@ -20,13 +20,6 @@ def get_schema(self): 'plagiarism_description': settings.parameters['fraud_user']['plagiarism_description'], 'illegal_content': settings.parameters['fraud_user']['illegal_content'] }, - 'anyOf': [ - { - 'properties': { - 'reason': {'enum': settings.FRAUD_REASONS} - } - } - ], 'required': ['article_id'] } From 1ced9c0bf5ebe4b173ca0c0182a09ed4bd864e93 Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Mon, 30 Jul 2018 20:19:36 +0900 Subject: [PATCH 17/20] =?UTF-8?q?=E7=A9=BA=E6=96=87=E5=AD=97=E3=81=8C?= =?UTF-8?q?=E3=81=82=E3=82=8A=E5=BE=97=E3=82=8B=E9=A0=85=E7=9B=AE=E3=81=AE?= =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=B1=E3=83=BC=E3=82=B9=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared-local-instance.db | Bin 33792 -> 33792 bytes .../create/test_me_articles_fraud_create.py | 37 ++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/shared-local-instance.db b/shared-local-instance.db index a7a3dd34cb8052952da738d85558d71bd9292145..7a571f9a0a68cadffaa274bc40666ad2da8daa6d 100644 GIT binary patch delta 349 zcmZqZU~1@KnjkHh#lXOz2*i9qEC$5h6LpLkvox!^ppxN8=0kBnxp@exMd^AeIAS2_O~$VsRh_86^tD!aytp#DYL93B(|) z1b|oyh^2v828d-h3$jdN+WgK+jBzrHiMS(39n3tCJV=i$8V%M56$7zB7-SyETuGpL zdW@U9Ov{)y+5BT>l-&H^o>69!4a;PfocBPls85dLDBhfzJDrUMq-*joPTkFh3741| zWhPHZRGnN9$2<8Hw-H!)YD^w8qwM63=^~RA(m5wj&0M$ne2O{yWVVt}B6mQOqoz6C?BpNw9DsHl~7@HWIPu^Fj Iyr_W%04<6}E&u=k diff --git a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py index 2c8d8b74..91afad86 100644 --- a/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py +++ b/tests/handlers/me/articles/fraud/create/test_me_articles_fraud_create.py @@ -391,6 +391,19 @@ def test_validation_required_plagiarism_detail_when_reason_is_plagiarism(self): params = dict(self.get_parameters_other_than_body_for_validate(), **body) self.assert_bad_request(params) + def test_validation_empty_plagiarism_detail_when_reason_is_plagiarism(self): + body = { + 'body': json.dumps( + { + 'reason': 'plagiarism', + 'plagiarism_url': '', + 'plagiarism_description': '' + } + ) + } + params = dict(self.get_parameters_other_than_body_for_validate(), **body) + self.assert_bad_request(params) + def test_validation_invalid_plagiarism_url_when_reason_is_plagiarism(self): body = { 'body': json.dumps( @@ -414,6 +427,18 @@ def test_validation_required_illegal_content_when_reason_is_illegal(self): params = dict(self.get_parameters_other_than_body_for_validate(), **body) self.assert_bad_request(params) + def test_validation_empty_illegal_content_when_reason_is_illegal(self): + body = { + 'body': json.dumps( + { + 'reason': 'illegal', + 'illegal_content': '' + } + ) + } + params = dict(self.get_parameters_other_than_body_for_validate(), **body) + self.assert_bad_request(params) + def test_validation_required_illegal_content_when_reason_is_other(self): body = { 'body': json.dumps( @@ -425,6 +450,18 @@ def test_validation_required_illegal_content_when_reason_is_other(self): params = dict(self.get_parameters_other_than_body_for_validate(), **body) self.assert_bad_request(params) + def test_validation_empty_illegal_content_when_reason_is_other(self): + body = { + 'body': json.dumps( + { + 'reason': 'other', + 'illegal_content': '' + } + ) + } + params = dict(self.get_parameters_other_than_body_for_validate(), **body) + self.assert_bad_request(params) + def test_validation_plagiarism_description_max(self): body = { 'body': json.dumps( From 825e9a11c9ff2a723ffc1e5c48f299a7367f9986 Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Mon, 30 Jul 2018 20:22:30 +0900 Subject: [PATCH 18/20] =?UTF-8?q?=E5=BF=B5=E3=81=AE=E3=81=9F=E3=82=81?= =?UTF-8?q?=E7=99=BB=E9=8C=B2=E5=89=8D=E3=81=AB=E7=A9=BA=E6=96=87=E5=AD=97?= =?UTF-8?q?=E3=82=92None=E3=81=AB=E5=A4=89=E6=8F=9B=E3=81=97=E3=81=A6?= =?UTF-8?q?=E3=81=8F=E3=82=8C=E3=82=8B=E5=85=B1=E9=80=9A=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=82=92=E5=91=BC=E3=81=B3=E5=87=BA=E3=81=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared-local-instance.db | Bin 33792 -> 33792 bytes .../fraud/create/me_articles_fraud_create.py | 2 ++ 2 files changed, 2 insertions(+) diff --git a/shared-local-instance.db b/shared-local-instance.db index 7a571f9a0a68cadffaa274bc40666ad2da8daa6d..eb4e5990c4cafa68899523d9195a800e90463bec 100644 GIT binary patch delta 77 zcmZqZU~1@KnjkGWg@J)V5s3MKSPY2MC+Zk8PT837o1OVhZo%d_j;SHcZ*uNVj^ila ZoEiH`3?f=m!_91NWH5POo${gv764Ak87Ke% delta 77 zcmZqZU~1@KnjkHh#lXOz2*i9qEC$5h6LpLkvo Date: Mon, 30 Jul 2018 20:26:22 +0900 Subject: [PATCH 19/20] =?UTF-8?q?=E7=A9=BA=E3=81=AE=E8=A1=8C=E3=82=92?= =?UTF-8?q?=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared-local-instance.db | Bin 33792 -> 33792 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/shared-local-instance.db b/shared-local-instance.db index eb4e5990c4cafa68899523d9195a800e90463bec..9ac2dff211f838a3076ef458a6df90eedcfcb9dc 100644 GIT binary patch delta 263 zcmZqZU~1@KnjkH>l7WFi5s3MLSPY0uC+Zk8uH2aLo1OWC*QCvH91EElWj66}%P{h7 z=F#}VJ;_4aP!_084u~aySPFeXcu%s|Dn1~yKB;|lu0*Gax3T4q~ zkT^_CX0wk4(2y?EGNw&7|CkviH~+W)BE$S9=kDYg0kf-pQx9jVAx%)ZIKaBafL;cJjt_k;w|_oRg;}uG@S*#e{h?bHZQdNhQ(9Ua7dn Q&TMXEFnM2{@}dS708!0E?f?J) From 7c569a216dccd96e6d6a2e9ff748e8aa27e6383a Mon Sep 17 00:00:00 2001 From: Ippei Fukamatsu Date: Mon, 30 Jul 2018 20:34:08 +0900 Subject: [PATCH 20/20] =?UTF-8?q?shared-local-instance.db=E3=81=8C?= =?UTF-8?q?=E6=B7=B7=E3=81=98=E3=81=A3=E3=81=A6=E3=81=97=E3=81=BE=E3=81=A3?= =?UTF-8?q?=E3=81=9F=E3=81=AE=E3=81=A7=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared-local-instance.db | Bin 33792 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 shared-local-instance.db diff --git a/shared-local-instance.db b/shared-local-instance.db deleted file mode 100644 index 9ac2dff211f838a3076ef458a6df90eedcfcb9dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33792 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