def exec_main_proc(self): # 編集記事を保存 article_content_edit_table = self.dynamodb.Table( os.environ['ARTICLE_CONTENT_EDIT_TABLE_NAME']) expression_attribute_values = { ':user_id': self.event['requestContext']['authorizer']['claims'] ['cognito:username'], ':body': TextSanitizer.sanitize_article_body_v2(self.params.get('body')) } DBUtil.items_values_empty_to_none(expression_attribute_values) article_content_edit_table.update_item( Key={ 'article_id': self.params['article_id'], }, UpdateExpression="set user_id=:user_id, body=:body", ExpressionAttributeValues=expression_attribute_values) # 履歴を保存 DBUtil.put_article_content_edit_history( dynamodb=self.dynamodb, user_id=expression_attribute_values[':user_id'], article_id=self.params.get('article_id'), sanitized_body=expression_attribute_values[':body']) return {'statusCode': 200}
def test_get_article_content_edit_history_ok(self): settings.ARTICLE_HISTORY_PUT_INTERVAL = 0 # テスト用データ作成 target_article = self.article_info_table_items[0] test_body = 'test_body' DBUtil.put_article_content_edit_history( dynamodb=self.dynamodb, user_id=target_article['user_id'], article_id=target_article['article_id'], sanitized_body=test_body) # 該当データが取得できること version = '00' actual_item = DBUtil.get_article_content_edit_history( dynamodb=self.dynamodb, user_id=target_article['user_id'], article_id=target_article['article_id'], version=version) expected_item = { 'user_id': target_article['user_id'], 'article_edit_history_id': target_article['article_id'] + '_' + version, 'body': test_body, 'article_id': target_article['article_id'], 'version': version, } for key in expected_item.keys(): self.assertEqual(expected_item[key], actual_item[key])
def test_put_article_content_edit_history_ok_exec_before_put_interval( self): user_id = 'test-user' article_id = 'test-article_id' body = 'test-body' article_content_edit_history_table = self.dynamodb.Table( os.environ['ARTICLE_CONTENT_EDIT_HISTORY_TABLE_NAME']) settings.ARTICLE_HISTORY_PUT_INTERVAL = 1 # 合計で 3 回保存 for i in range(3): version = str(i).zfill(2) DBUtil.put_article_content_edit_history( dynamodb=self.dynamodb, user_id=user_id, article_id=article_id, sanitized_body=body + version, ) expected_item = { 'user_id': user_id, 'article_edit_history_id': article_id + '_00', 'body': body + '00', 'article_id': article_id, 'version': '00' } # 最初の 1 件のみが登録されていること actual_items = article_content_edit_history_table.scan()['Items'] self.assertEqual(len(actual_items), 1) for key in expected_item.keys(): self.assertEqual(expected_item[key], actual_items[0][key])
def test_put_article_content_edit_history_ok_exec_after_put_interval(self): user_id = 'test-user' article_id = 'test-article_id' body = 'test-body' article_content_edit_history_table = self.dynamodb.Table( os.environ['ARTICLE_CONTENT_EDIT_HISTORY_TABLE_NAME']) with freeze_time() as frozen_datetime: # 規定時間経過後に保存 version = '00' DBUtil.put_article_content_edit_history( dynamodb=self.dynamodb, user_id=user_id, article_id=article_id, sanitized_body=body + version, ) # 規定時間経過 frozen_datetime.tick(delta=datetime.timedelta( seconds=settings.ARTICLE_HISTORY_PUT_INTERVAL)) version = '01' DBUtil.put_article_content_edit_history( dynamodb=self.dynamodb, user_id=user_id, article_id=article_id, sanitized_body=body + version, ) # 2 件登録されていること expected_item_1 = { 'user_id': user_id, 'article_edit_history_id': article_id + '_01', 'body': body + '01', 'article_id': article_id, 'version': '01' } expected_item_2 = { 'user_id': user_id, 'article_edit_history_id': article_id + '_00', 'body': body + '00', 'article_id': article_id, 'version': '00' } items = article_content_edit_history_table.scan()['Items'] actual_items = sorted(items, key=lambda x: x['sort_key'], reverse=True) self.assertEqual(len(actual_items), 2) for key in expected_item_1.keys(): self.assertEqual(expected_item_1[key], actual_items[0][key]) for key in expected_item_2.keys(): self.assertEqual(expected_item_2[key], actual_items[1][key])
def test_put_article_content_edit_history_ok(self): user_id = 'test-user' article_id = 'test-article_id' body = 'test-body' article_content_edit_history_table = self.dynamodb.Table( os.environ['ARTICLE_CONTENT_EDIT_HISTORY_TABLE_NAME']) settings.ARTICLE_HISTORY_PUT_INTERVAL = 0 # 初回作成 version = '00' DBUtil.put_article_content_edit_history( dynamodb=self.dynamodb, user_id=user_id, article_id=article_id, sanitized_body=body + version, ) # 登録確認(version = 00 で該当データが作成されていること) expected_item = { 'user_id': user_id, 'article_edit_history_id': article_id + '_' + version, 'body': body + version, 'article_id': article_id, 'version': version, } actual_items = article_content_edit_history_table.scan()['Items'] self.assertEqual(len(actual_items), 1) for key in expected_item.keys(): self.assertEqual(expected_item[key], actual_items[0][key]) # 2回目作成 version = '01' DBUtil.put_article_content_edit_history( dynamodb=self.dynamodb, user_id=user_id, article_id=article_id, sanitized_body=body + version, ) # 登録確認(version = 01 で該当データが作成されていること) expected_item = { 'user_id': user_id, 'article_edit_history_id': article_id + '_' + version, 'body': body + version, 'article_id': article_id, 'version': version, } actual_items = article_content_edit_history_table.scan()['Items'] self.assertEqual(len(actual_items), 2) for key in expected_item.keys(): self.assertEqual(expected_item[key], actual_items[1][key])
def exec_main_proc(self): # 下書き記事を保存 expression_attribute_values = { ':body': TextSanitizer.sanitize_article_body_v2(self.params.get('body')) } DBUtil.items_values_empty_to_none(expression_attribute_values) self.__update_article_content(expression_attribute_values) # 履歴を保存 DBUtil.put_article_content_edit_history( dynamodb=self.dynamodb, user_id=self.event['requestContext']['authorizer']['claims'] ['cognito:username'], article_id=self.params.get('article_id'), sanitized_body=expression_attribute_values[':body']) return {'statusCode': 200}
def test_main_ok_exists_content_edit_histories_one(self): params = { 'queryStringParameters': { 'article_id': 'publicId0001' }, 'requestContext': { 'authorizer': { 'claims': { 'cognito:username': '******', 'phone_number_verified': 'true', 'email_verified': 'true' } } } } # 1件作成 test_body = 'test_body' DBUtil.put_article_content_edit_history( dynamodb=self.dynamodb, user_id=params['requestContext']['authorizer']['claims'] ['cognito:username'], article_id=params['queryStringParameters']['article_id'], sanitized_body=test_body, ) response = MeArticlesContentEditHistoriesIndex(params, {}, self.dynamodb).main() expected_item = { 'user_id': params['requestContext']['authorizer']['claims'] ['cognito:username'], 'article_edit_history_id': params['queryStringParameters']['article_id'] + '_' + '00', 'article_id': params['queryStringParameters']['article_id'], 'version': '00' } self.assertEqual(response['statusCode'], 200) actual_items = json.loads(response['body'])['Items'] self.assertEqual(len(actual_items), 1) for key in expected_item.keys(): self.assertEqual(expected_item[key], actual_items[0][key])
def test_put_article_content_edit_history_ok_with_loop(self): user_id = 'test-user' article_id = 'test-article_id' body = 'test-body' article_content_edit_history_table = self.dynamodb.Table( os.environ['ARTICLE_CONTENT_EDIT_HISTORY_TABLE_NAME']) settings.ARTICLE_HISTORY_PUT_INTERVAL = 0 # 合計で 101 回保存(ループさせる) for i in range(101): version = str(i).zfill(2) DBUtil.put_article_content_edit_history( dynamodb=self.dynamodb, user_id=user_id, article_id=article_id, sanitized_body=body + version, ) # 意図した順序でデータを取得できること # article_content_edit_history を取得。body 値も確認したいため index を利用せず scan で取得し、ソートは独自に実施する。 # (容量削減の観点で index には body を含めていないため scan で取得する必要がある) items = article_content_edit_history_table.scan()['Items'] actual_items = sorted(items, key=lambda x: x['sort_key'], reverse=True) # 100件登録されていること self.assertEqual(len(actual_items), 100) # loop 確認。101 回実行しているため version が 00、99、98.... となる順序でデータが取得される。 for i in range(100): # 先頭データはループしているため version は 00 となるが、body の内容は 101 回目に書き込んだデータが設定される if i == 0: test_version = '00' test_body = body + '100' # ループしていないデータは、99、98、.. 01 のように降順となる else: test_version = str(100 - i).zfill(2) test_body = body + test_version expected_item = { 'user_id': user_id, 'article_edit_history_id': article_id + '_' + test_version, 'body': test_body, 'article_id': article_id, 'version': test_version, } for key in expected_item.keys(): self.assertEqual(expected_item[key], actual_items[i][key])
def test_main_ok_exists_content_edit_histories_multiple(self): settings.ARTICLE_HISTORY_PUT_INTERVAL = 0 params = { 'queryStringParameters': { 'article_id': 'publicId0001' }, 'requestContext': { 'authorizer': { 'claims': { 'cognito:username': '******', 'phone_number_verified': 'true', 'email_verified': 'true' } } } } # 2件作成 test_body = 'test_body' for i in range(2): DBUtil.put_article_content_edit_history( dynamodb=self.dynamodb, user_id=params['requestContext']['authorizer']['claims'] ['cognito:username'], article_id=params['queryStringParameters']['article_id'], sanitized_body=test_body, ) response = MeArticlesContentEditHistoriesIndex(params, {}, self.dynamodb).main() # 降順 expected_item = [{ 'user_id': params['requestContext']['authorizer']['claims'] ['cognito:username'], 'article_edit_history_id': params['queryStringParameters']['article_id'] + '_' + '01', 'article_id': params['queryStringParameters']['article_id'], 'version': '01' }, { 'user_id': params['requestContext']['authorizer']['claims'] ['cognito:username'], 'article_edit_history_id': params['queryStringParameters']['article_id'] + '_' + '00', 'article_id': params['queryStringParameters']['article_id'], 'version': '00' }] self.assertEqual(response['statusCode'], 200) actual_items = json.loads(response['body'])['Items'] self.assertEqual(len(actual_items), 2) # 降順で取得できること for i in range(2): for key in expected_item[i].keys(): self.assertEqual(expected_item[i][key], actual_items[i][key])