Esempio n. 1
0
    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])
Esempio n. 6
0
    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])