AWS SecretsManager motoを使用してpytest する方法


secretsmanager motoを使用してのpytest

pytestをする必要があったので検索しましたがあまり日本語がなさそうな雰囲気。。。
別にmoto使用しなくても全てmockにしてしまってもいいけどね。
なんとなく知的好奇心が沸いたので試してみました。
なので記事にしてみました。

必要モジュール

boto3
moto
pytest

実装箇所

secrets_manager.py
import json
import boto3
import logging

# log_level
logging.getLogger().setLevel(logging.INFO)


class SecretsManagerClass:

    def __init__(self, secret_name):
        logging.info(secret_name)
        self.secret_name = secret_name

    def _open_boto_session(self):
        return boto3.session.Session()

    def _create_boto_client(self):
        return self._open_boto_session().client(
            service_name="secretsmanager", region_name="ap-northeast-1"
        )

    def get_secrets_info(self):
        get_secret_value_response = \
            self._create_boto_client().get_secret_value(
                SecretId=self.secret_name)
        rds_secret = json.loads(get_secret_value_response['SecretString'])
        return rds_secret

こんな感じで

pytest箇所

test_secrets_manager.py
import pytest
import boto3
from moto import mock_secretsmanager
from src.secrets_manager import SecretsManagerClass


class TestGetParameterClass(object):

    @pytest.fixture
    def create_mocked_secret_manager_connection(self):
        with mock_secretsmanager():
            yield boto3.session.Session().client(
                service_name="secretsmanager", region_name="ap-northeast-1"
            )

    @pytest.fixture
    def create_test_secret(self, create_mocked_secret_manager_connection):
        create_mocked_secret_manager_connection.create_secret(
            Name="mock_secret",
            SecretString="""{"mock_secret_key": "mock_secret_value"}"""
        )

    def test_get_secret_string(
        self, monkeypatch, create_mocked_secret_manager_connection, create_test_secret
    ):
        def get_mocked_secret_manager(*args, **kwargs):
            return create_mocked_secret_manager_connection

        monkeypatch.setattr(
            SecretsManagerClass, "_create_boto_client", get_mocked_secret_manager
        )

        credential_client = SecretsManagerClass("mock_secret")

        assert credential_client.get_secrets_info() == {
            "mock_secret_key": "mock_secret_value"
        }

使ってない変数とかあるけど、基本を残してるので多用的に使えるかと( ^ω^ )

まあざっとこんな感じ、元の参照した記事は何かもう忘れちまった。。。

けど大体日本語の記事より英語の記事の方が充実してるから英語がいいですよね。
stack overflow(英語版)とか

pytest最近すごく触れる機会が多いので段々と理解が深まってきました。

今日は以上です。