2021年10月31日日曜日

楽天ラッキーくじの当選を整理する。【2021年11月】

前月の結果 → 楽天ラッキーくじの当選を整理する。【2021年10月】
日付当選数当選サービス
11/11楽天トラベル ラッキーくじ
11/21【楽天ブックス】facebookラッキーくじ
11/30
11/40
11/51楽天ラッキーくじ
11/60
11/74Rakuten Link限定ラッキースロット 第2弾、楽天リワード ラッキーくじ、楽天リワード ラッキーくじ、【楽天ブックス】facebookラッキーくじ
11/80
11/93マネ活ラッキーくじ、楽天ブックス・ラッキーくじ、楽天トラベル ラッキーくじ
11/101【楽天ポイント活動部】ラッキーくじ(2021年9月~11月通常版
11/112マネ活ラッキーくじ、【楽天ポイント活動部】ラッキーくじ(2021年9月~11月通常版)
11/121楽天トラベル ラッキーくじ
11/132Rakuten TV ラッキーくじ、Rakuten Link限定ラッキースロット 第2弾
11/142【楽天toto】楽天totoラッキーくじ、リワード特集ページ ラッキーくじ
11/153楽天Edyラッキーくじ、マネ活ラッキーくじ、楽天トラベル ラッキーくじ
11/161マネ活ラッキーくじ
11/173楽天カードラッキーくじ、楽天リワード ラッキーくじ 、マネ活ラッキーくじ
11/181楽天ブログ ラッキーくじ 
11/1911LINE限定 毎日引けるくじ、楽天トラベル ラッキーくじ
11/201楽天トラベル ラッキーくじ
11/213【楽天カード】じゃんけん勝者限定くじ、【楽天ブックス】facebookラッキーくじ、Rakuten TV ラッキーくじ
11/223【楽天ポイント活動部】ラッキーくじ(2021年9月~11月通常版)、楽天トラベル ラッキーくじ、Rakuten TV ラッキーくじ
11/232【楽天カード】じゃんけん勝者限定くじ、楽天リワード ラッキーくじ
11/242楽天トラベル ラッキーくじ、楽天ブログ ラッキーくじ 
11/251【楽天ポイント活動部】ラッキーくじ(2021年9月~11月通常版)
11/260
11/272楽天リワード ラッキーくじ、楽天トラベル ラッキーくじ
11/280
11/292マネ活ラッキーくじ、楽天トラベル ラッキーくじ
11/301楽天トラベル ラッキーくじ
合計:54、平均=1.8

2021年10月3日日曜日

【moto】motoでtransact_write_itemsをモックする。【Python】

motoでtransact_write_itemsをモックする。

moto と transact_write_items で検索すると、motoを拡張してモックする方法が上位に表示される。詳しく調べていないが、moto 2.2.4 では拡張せずともモックできるので、サンプルを提示したい。

この記事ではテストコードは一部だけ記載するので、完全なものは https://github.com/tomohikoseven/moto_transact_write_items を参照ください。

実装コード

実装したコードは、ClickCountというテーブルにItemをトランザクションで追加・更新(アトミックカウンタ)するものです。DynamoDBをご存知の方には、簡単なものかと思います。

簡単に説明すると、以下の実装コードはハッシュキー:month は文字列 YYYYMM を、レンジキー(ソートキー):date は文字列 YYYYMMDD を期待して、1トランザクションで2つのItemに対し、clickCountをカウントUPするものになります。

トランザクションの1つ目は日付の末尾が00となっており、月間のclickCountをカウントUPします。今回の記事では気にすることではないです。


(index.py)
import boto3


client = boto3.client('dynamodb',  region_name='ap-northeast-1')
def lambda_handler( month:str, date:str ):
  try:
    response = client.transact_write_items(
      TransactItems=[
        {
          'Update' : {
            'Key' : {
              'hKey': { 'S': month },
              'rKey': { 'S': month + '00' }
            },
            'TableName':'ClickCount',
            'UpdateExpression': 'ADD clickCount :increment',
            'ExpressionAttributeValues' : {
              ':increment': { 'N': '1' }
            }
          }
        },
        {
          'Update' : {
            'Key' : {
              'hKey': { 'S': month },
              'rKey': { 'S': date }
            },
            'TableName':'ClickCount',
            'UpdateExpression': 'ADD clickCount :increment',
            'ExpressionAttributeValues' : {
              ':increment': { 'N': '1' }
            }
          }
        }
      ]
    )
  except Exception as e :
    print("===")
    print(e)
    raise e

  return 200

テストコード

pytestでテストコードを実行します。

motoでモックするテストコードを記述したことがある方は難しいことはないです。mock_dynamodb2をimportして、アノテーション@mock_dynamodb2をテストケースに付けてやればよいです。


(test_index.py)

# 本当のテストは1ケースだけではないので、ここでは余分なライブラリがインポートされています。
from importlib import import_module
import boto3
from moto import mock_dynamodb2
from unittest import mock
from botocore.exceptions import ClientError
import pytest


@mock_dynamodb2
def test_success(set_dynamodb_Count):
  # mock dynamodb
  table = set_dynamodb_Count()

  month = '202101'
  date = '20210101'
  from src.index import lambda_handler
  res = lambda_handler( month, date )

  item = table.get_item(Key={'hKey':month, 'rKey': date})
  assert res == 200
  assert item['Item']['clickCount'] == 1

conftest.pyに set_dynamodb_Count を記載しています。テストにはこちらも必要になります。test_index.pyと同一フォルダに置いてください。


(conftest.py)
import pytest
import boto3

@pytest.fixture
def set_dynamodb_Count():
  def definition():
    dynamodb = boto3.resource('dynamodb', region_name='ap-northeast-1')
    dynamodb.create_table(
      TableName='ClickCount',
      KeySchema=[
          {
              'AttributeName': 'hKey',
              'KeyType': 'HASH'
          },
          {
              'AttributeName': 'rKey',
              'KeyType': 'RANGE'
          }
      ],
      AttributeDefinitions=[
          {
              'AttributeName': 'hKey',
              'AttributeType': 'S'
          },
          {
              'AttributeName': 'rKey',
              'AttributeType': 'S'
          }
      ],
    )

    return dynamodb.Table('ClickCount')
  return definition