2020-07-09 17:27:30 -07:00
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
"""
Unit tests for lambda_basics.py functions.
"""
import json
import unittest . mock
import zipfile
import boto3
from botocore . exceptions import ClientError
import pytest
2022-04-08 15:42:13 -07:00
from lambda_basics import LambdaWrapper
2020-07-09 17:27:30 -07:00
def test_create_lambda_deployment_package ( monkeypatch ) :
2023-10-18 10:35:05 -07:00
monkeypatch . setattr ( zipfile . ZipFile , " write " , lambda x , y , z : None )
2022-04-08 15:42:13 -07:00
wrapper = LambdaWrapper ( None , None )
2020-07-09 17:27:30 -07:00
2023-10-18 10:35:05 -07:00
got_package = wrapper . create_deployment_package ( " test-file " , " other-file " )
2020-07-09 17:27:30 -07:00
assert got_package is not None
@pytest.mark.parametrize (
2023-10-18 10:35:05 -07:00
" error_code,stop_on_method " ,
[
2020-07-09 17:27:30 -07:00
( None , None ) ,
2023-10-18 10:35:05 -07:00
( " TestException " , " stub_create_role " ) ,
( " TestException " , " stub_attach_role_policy " ) ,
] ,
)
2020-07-09 17:27:30 -07:00
def test_create_iam_role_for_lambda (
2023-10-18 10:35:05 -07:00
make_stubber , make_unique_name , stub_runner , error_code , stop_on_method
) :
iam_resource = boto3 . resource ( " iam " )
2020-07-09 17:27:30 -07:00
iam_stubber = make_stubber ( iam_resource . meta . client )
2022-04-08 15:42:13 -07:00
wrapper = LambdaWrapper ( None , iam_resource )
2023-10-18 10:35:05 -07:00
role_name = make_unique_name ( " role- " )
2020-07-09 17:27:30 -07:00
2020-09-15 18:20:16 -07:00
with stub_runner ( error_code , stop_on_method ) as runner :
2023-10-18 10:35:05 -07:00
runner . add ( iam_stubber . stub_get_role , role_name , error_code = " NoSuchEntity " )
2020-09-15 18:20:16 -07:00
runner . add ( iam_stubber . stub_create_role , role_name )
runner . add (
2023-10-18 10:35:05 -07:00
iam_stubber . stub_attach_role_policy ,
role_name ,
" arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole " ,
)
2020-07-09 17:27:30 -07:00
if error_code is None :
2022-04-08 15:42:13 -07:00
got_role , got_created = wrapper . create_iam_role_for_lambda ( role_name )
2020-07-09 17:27:30 -07:00
assert got_role . name == role_name
2022-04-08 15:42:13 -07:00
assert got_created
2020-07-09 17:27:30 -07:00
else :
with pytest . raises ( ClientError ) as exc_info :
2022-04-08 15:42:13 -07:00
wrapper . create_iam_role_for_lambda ( role_name )
2023-10-18 10:35:05 -07:00
assert exc_info . value . response [ " Error " ] [ " Code " ] == error_code
2020-07-09 17:27:30 -07:00
2023-10-18 10:35:05 -07:00
@pytest.mark.parametrize ( " error_code " , [ None , " TestException " ] )
2022-04-08 15:42:13 -07:00
def test_create_function ( make_stubber , make_unique_name , error_code ) :
2023-10-18 10:35:05 -07:00
lambda_client = boto3 . client ( " lambda " )
2020-07-09 17:27:30 -07:00
lambda_stubber = make_stubber ( lambda_client )
2022-04-08 15:42:13 -07:00
wrapper = LambdaWrapper ( lambda_client , None )
2023-10-18 10:35:05 -07:00
func_name = make_unique_name ( " func- " )
handler_name = make_unique_name ( " handler- " )
iam_role = unittest . mock . MagicMock ( arn = " arn:aws:iam:::role/test-role " )
test_package = " test-package "
func_arn = f " arn:aws:lambda:::function/ { func_name } "
2020-07-09 17:27:30 -07:00
lambda_stubber . stub_create_function (
2023-10-18 10:35:05 -07:00
func_name ,
func_arn ,
iam_role . arn ,
handler_name ,
test_package ,
error_code = error_code ,
)
2022-04-08 15:42:13 -07:00
if error_code is None :
2023-10-18 10:35:05 -07:00
lambda_stubber . stub_get_function ( func_name , " Active " )
2020-07-09 17:27:30 -07:00
if error_code is None :
2023-10-18 10:35:05 -07:00
got_arn = wrapper . create_function (
func_name , handler_name , iam_role , test_package
)
2020-07-09 17:27:30 -07:00
assert got_arn == func_arn
else :
with pytest . raises ( ClientError ) as exc_info :
2023-10-18 10:35:05 -07:00
wrapper . create_function ( func_name , handler_name , iam_role , test_package )
assert exc_info . value . response [ " Error " ] [ " Code " ] == error_code
2022-04-08 15:42:13 -07:00
2023-10-18 10:35:05 -07:00
@pytest.mark.parametrize (
" error_code " , [ None , " TestException " , " ResourceNotFoundException " ]
)
2022-04-08 15:42:13 -07:00
def test_get_function ( make_stubber , error_code ) :
2023-10-18 10:35:05 -07:00
lambda_client = boto3 . client ( " lambda " )
2022-04-08 15:42:13 -07:00
lambda_stubber = make_stubber ( lambda_client )
wrapper = LambdaWrapper ( lambda_client , None )
2023-10-18 10:35:05 -07:00
func_name = " test-func_name "
2022-04-08 15:42:13 -07:00
lambda_stubber . stub_get_function ( func_name , error_code = error_code )
2023-10-18 10:35:05 -07:00
if error_code in ( None , " ResourceNotFoundException " ) :
2022-04-08 15:42:13 -07:00
wrapper . get_function ( func_name )
else :
with pytest . raises ( ClientError ) as exc_info :
wrapper . get_function ( func_name )
2023-10-18 10:35:05 -07:00
assert exc_info . value . response [ " Error " ] [ " Code " ] == error_code
2020-07-09 17:27:30 -07:00
2023-10-18 10:35:05 -07:00
@pytest.mark.parametrize ( " error_code " , [ None , " TestException " ] )
2022-04-08 15:42:13 -07:00
def test_delete_function ( make_stubber , make_unique_name , error_code ) :
2023-10-18 10:35:05 -07:00
lambda_client = boto3 . client ( " lambda " )
2020-07-09 17:27:30 -07:00
lambda_stubber = make_stubber ( lambda_client )
2022-04-08 15:42:13 -07:00
wrapper = LambdaWrapper ( lambda_client , None )
2023-10-18 10:35:05 -07:00
func_name = make_unique_name ( " func- " )
2020-07-09 17:27:30 -07:00
lambda_stubber . stub_delete_function ( func_name , error_code = error_code )
if error_code is None :
2022-04-08 15:42:13 -07:00
wrapper . delete_function ( func_name )
2020-07-09 17:27:30 -07:00
else :
with pytest . raises ( ClientError ) as exc_info :
2022-04-08 15:42:13 -07:00
wrapper . delete_function ( func_name )
2023-10-18 10:35:05 -07:00
assert exc_info . value . response [ " Error " ] [ " Code " ] == error_code
2020-07-09 17:27:30 -07:00
2023-10-18 10:35:05 -07:00
@pytest.mark.parametrize ( " error_code " , [ None , " TestException " ] )
2022-04-08 15:42:13 -07:00
def test_invoke_function ( make_stubber , make_unique_name , error_code ) :
2023-10-18 10:35:05 -07:00
lambda_client = boto3 . client ( " lambda " )
2020-07-09 17:27:30 -07:00
lambda_stubber = make_stubber ( lambda_client )
2022-04-08 15:42:13 -07:00
wrapper = LambdaWrapper ( lambda_client , None )
2023-10-18 10:35:05 -07:00
func_name = make_unique_name ( " func- " )
func_params = { " param1 " : " test " , " param2 " : 35 }
response_payload = " ahoy there "
2020-07-09 17:27:30 -07:00
lambda_stubber . stub_invoke (
2023-10-18 10:35:05 -07:00
func_name ,
json . dumps ( func_params ) ,
response_payload ,
log_type = " None " ,
error_code = error_code ,
)
2020-07-09 17:27:30 -07:00
if error_code is None :
2022-04-08 15:42:13 -07:00
response = wrapper . invoke_function ( func_name , func_params )
2023-10-18 10:35:05 -07:00
assert response [ " Payload " ] == response_payload
2020-07-09 17:27:30 -07:00
else :
with pytest . raises ( ClientError ) as exc_info :
2022-04-08 15:42:13 -07:00
wrapper . invoke_function ( func_name , func_params )
2023-10-18 10:35:05 -07:00
assert exc_info . value . response [ " Error " ] [ " Code " ] == error_code
2022-04-08 15:42:13 -07:00
2023-10-18 10:35:05 -07:00
@pytest.mark.parametrize ( " error_code " , [ None , " TestException " ] )
2022-04-08 15:42:13 -07:00
def test_update_function_code ( make_stubber , error_code ) :
2023-10-18 10:35:05 -07:00
lambda_client = boto3 . client ( " lambda " )
2022-04-08 15:42:13 -07:00
lambda_stubber = make_stubber ( lambda_client )
wrapper = LambdaWrapper ( lambda_client , None )
2023-10-18 10:35:05 -07:00
func_name = " test-func_name "
package = " test-package "
update_status = " InProgress "
2022-04-08 15:42:13 -07:00
lambda_stubber . stub_update_function_code (
2023-10-18 10:35:05 -07:00
func_name , update_status , package = package , error_code = error_code
)
2022-04-08 15:42:13 -07:00
if error_code is None :
got_response = wrapper . update_function_code ( func_name , package )
2023-10-18 10:35:05 -07:00
assert got_response [ " LastUpdateStatus " ] == update_status
2022-04-08 15:42:13 -07:00
else :
with pytest . raises ( ClientError ) as exc_info :
wrapper . update_function_code ( func_name , package )
2023-10-18 10:35:05 -07:00
assert exc_info . value . response [ " Error " ] [ " Code " ] == error_code
2022-04-08 15:42:13 -07:00
2023-10-18 10:35:05 -07:00
@pytest.mark.parametrize ( " error_code " , [ None , " TestException " ] )
2022-04-08 15:42:13 -07:00
def test_update_function_configuration ( make_stubber , error_code ) :
2023-10-18 10:35:05 -07:00
lambda_client = boto3 . client ( " lambda " )
2022-04-08 15:42:13 -07:00
lambda_stubber = make_stubber ( lambda_client )
wrapper = LambdaWrapper ( lambda_client , None )
2023-10-18 10:35:05 -07:00
func_name = " test-func_name "
env_vars = { " test-key " : " test-val " }
2022-04-08 15:42:13 -07:00
lambda_stubber . stub_update_function_configuration (
2023-10-18 10:35:05 -07:00
func_name , env_vars , error_code = error_code
)
2022-04-08 15:42:13 -07:00
if error_code is None :
got_response = wrapper . update_function_configuration ( func_name , env_vars )
assert got_response
else :
with pytest . raises ( ClientError ) as exc_info :
wrapper . update_function_configuration ( func_name , env_vars )
2023-10-18 10:35:05 -07:00
assert exc_info . value . response [ " Error " ] [ " Code " ] == error_code
2022-04-08 15:42:13 -07:00
2023-10-18 10:35:05 -07:00
@pytest.mark.parametrize ( " error_code " , [ None , " TestException " ] )
2022-04-08 15:42:13 -07:00
def test_list_functions ( make_stubber , error_code ) :
2023-10-18 10:35:05 -07:00
lambda_client = boto3 . client ( " lambda " )
2022-04-08 15:42:13 -07:00
lambda_stubber = make_stubber ( lambda_client )
wrapper = LambdaWrapper ( lambda_client , None )
2023-10-18 10:35:05 -07:00
funcs = [
{
" FunctionName " : f " test-func- { index } " ,
" Description " : f " test description { index } " ,
" Runtime " : f " test-runtime- { index } " ,
" Handler " : f " test-handler- { index } " ,
}
for index in range ( 3 )
]
2022-04-08 15:42:13 -07:00
lambda_stubber . stub_list_functions ( funcs , error_code = error_code )
if error_code is None :
wrapper . list_functions ( )
else :
with pytest . raises ( ClientError ) as exc_info :
wrapper . list_functions ( )
2023-10-18 10:35:05 -07:00
assert exc_info . value . response [ " Error " ] [ " Code " ] == error_code