'An environment variable to changes none in python

i am trying to make a function that uses multiple aws services in a lambda function :

import os
import boto3
import hmac, hashlib, base64, copy

def lambda_handler(event, context):
    secretsmanager = boto3.client('secretsmanager')
    secret_response = secretsmanager.get_secret_value(SecretId = os.environ.get('cognitoSecretID'))

    cognito = boto3.client('cognito-idp')

    cognito_pool_id = os.environ.get('cognitoPoolID')
    event_body = event['body']

    username = event_body['email']
    secret = secret_response['SecretString']

    raw_message = username + cognito_pool_id
    message = bytes(raw_message, 'utf-8')
    secret = bytes(secret,'utf-8')
    secret_hash = base64.b64encode(hmac.new(secret, message, digestmod=hashlib.sha256).digest()).decode()

    authParameters = {
        'USERNAME': username,
        'PASSWORD': event_body['password'],
        'SECRET_HASH': secret_hash
    }

    cognito.admin_initiate_auth(UserPoolId = cognito_pool_id, ClientId = os.environ.get('cognitoClientID'), AuthFlow = "ADMIN_USER_PASSWORD_AUTH", AuthParameters = authParameters )

    return True

i am testing git with pytest as follows :

import os
import pytest
from unittest.mock import call
import boto3
import hmac, hashlib, base64
from src.DacAdminsLogin import lambda_handler
from __mocks__.SecretsManagerMock import SecretsManagerMock

MockLambdaHandlerEvent = {
    'body' : {
        'email': "[email protected]",
        'password': "test"
    }
}

@pytest.fixture
def dummy_secret(monkeypatch):
    dummySecret = 'adummytest'
    monkeypatch.setenv('cognitoSecretID', dummySecret, prepend=False)
    return dummySecret

@pytest.fixture
def dummy_cognito_id(monkeypatch):
    dummyCognitoID = 'adummycognitoid'
    monkeypatch.setenv('cognitoClientID', dummyCognitoID, prepend=False)
    return 'adummycognitoid'

@pytest.fixture
def dummy_cognito_pool_id(monkeypatch):
    dummyCognitoPoolID = 'adummycognitopoolid'
    monkeypatch.setenv('cognitoPoolID', dummyCognitoPoolID, prepend=False)
    return 'adummycognitopoolid'

@pytest.fixture
def secret_manager(mocker, dummy_secret):
    mock = mocker.patch('__mocks__.SecretsManagerMock.SecretsManagerMock')
    mock.get_secret_value.return_value = {'SecretString' : dummy_secret}
    return mock

@pytest.fixture
def cognito(mocker):
    return mocker.patch('__mocks__.CognitoMock.CognitoMock', return_value= "Test secret")

@pytest.fixture
def client(mocker, secret_manager, cognito):
    return mocker.patch('boto3.client', side_effect= [secret_manager, cognito])

def test_create_secrets_manager_client(client):
    lambda_handler(MockLambdaHandlerEvent,1)
    client.assert_has_calls([call('secretsmanager')])

def test_get_secret_value_call(client ,secret_manager, dummy_secret):
    lambda_handler(MockLambdaHandlerEvent,1)
    secret_manager.get_secret_value.assert_called_once_with(SecretId= dummy_secret)

def test_create_cognito_client(client ,secret_manager, dummy_secret):
    lambda_handler(MockLambdaHandlerEvent,1)
    client.assert_has_calls([call('secretsmanager'), call('cognito')])

def test_admin_initiate_auth_call(client, monkeypatch , cognito, dummy_secret, dummy_cognito_id, dummy_cognito_pool_id):
    MockLambdaHandlerEventBody = MockLambdaHandlerEvent['body']
    
    username = MockLambdaHandlerEventBody['email']
    app_client_id = dummy_cognito_pool_id
    key = dummy_secret
    message = bytes(username+app_client_id,'utf-8')
    key = bytes(dummy_secret,'utf-8')
    secret_hash = base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode()
    
    authParameters = {
        'USERNAME': username,
        'PASSWORD': MockLambdaHandlerEventBody['password'],
        'SECRET_HASH': secret_hash
    }
    
    lambda_handler(MockLambdaHandlerEvent,1)
    cognito.admin_initiate_auth.assert_called_once_with(UserPoolId = dummy_cognito_pool_id, ClientId = dummy_cognito_id, AuthFlow = "ADMIN_USER_PASSWORD_AUTH", AuthParameters = authParameters )

I am new to python and i don't know why i keep getting the following error : TypeError: can only concatenate str (not "NoneType") to str, coming from the raw_message concatenation.

When i comment out the cognito.admin_initiate_auth.assert_called_once_with(UserPoolId = dummy_cognito_pool_id, ClientId = dummy_cognito_id, AuthFlow = "ADMIN_USER_PASSWORD_AUTH", AuthParameters = authParameters ) or change for example the UserPoolId to another value the error disappears.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source