github.com/argoproj/argo-events@v1.9.1/sensors/triggers/aws-lambda/aws-lambda_test.go (about)

     1  /*
     2  Copyright 2020 BlackRock, Inc.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8  	http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  package aws_lambda
    17  
    18  import (
    19  	"context"
    20  	"testing"
    21  
    22  	"github.com/aws/aws-sdk-go/service/lambda"
    23  	cloudevents "github.com/cloudevents/sdk-go/v2"
    24  	"github.com/stretchr/testify/assert"
    25  	corev1 "k8s.io/api/core/v1"
    26  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    27  
    28  	"github.com/argoproj/argo-events/common/logging"
    29  	"github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1"
    30  )
    31  
    32  var sensorObjSparse = &v1alpha1.Sensor{
    33  	ObjectMeta: metav1.ObjectMeta{
    34  		Name:      "fake-sensor",
    35  		Namespace: "fake",
    36  	},
    37  	Spec: v1alpha1.SensorSpec{
    38  		Triggers: []v1alpha1.Trigger{
    39  			{
    40  				Template: &v1alpha1.TriggerTemplate{
    41  					Name: "fake-trigger-sparse",
    42  					AWSLambda: &v1alpha1.AWSLambdaTrigger{
    43  						FunctionName: "fake-function",
    44  						Region:       "us-east",
    45  					},
    46  				},
    47  			},
    48  		},
    49  	},
    50  }
    51  
    52  var sensorObjFull = &v1alpha1.Sensor{
    53  	ObjectMeta: metav1.ObjectMeta{
    54  		Name:      "fake-sensor",
    55  		Namespace: "fake",
    56  	},
    57  	Spec: v1alpha1.SensorSpec{
    58  		Triggers: []v1alpha1.Trigger{
    59  			{
    60  				Template: &v1alpha1.TriggerTemplate{
    61  					Name: "fake-trigger-full",
    62  					AWSLambda: &v1alpha1.AWSLambdaTrigger{
    63  						FunctionName: "fake-function",
    64  						AccessKey: &corev1.SecretKeySelector{
    65  							LocalObjectReference: corev1.LocalObjectReference{
    66  								Name: "fake-secret",
    67  							},
    68  							Key: "accesskey",
    69  						},
    70  						SecretKey: &corev1.SecretKeySelector{
    71  							LocalObjectReference: corev1.LocalObjectReference{
    72  								Name: "fake-secret",
    73  							},
    74  							Key: "secretkey",
    75  						},
    76  						Region:  "us-east",
    77  						RoleARN: "arn:aws:iam::123456789012:role/fake-trigger-full",
    78  						Payload: []v1alpha1.TriggerParameter{
    79  							{
    80  								Src: &v1alpha1.TriggerParameterSource{
    81  									DependencyName: "fake-dependency",
    82  									Value:          new(string),
    83  								},
    84  								Dest: "metadata.label.value",
    85  							},
    86  						},
    87  					},
    88  				},
    89  			},
    90  		},
    91  	},
    92  }
    93  
    94  func getAWSTriggers() []AWSLambdaTrigger {
    95  	return []AWSLambdaTrigger{
    96  		{
    97  			LambdaClient: nil,
    98  			Sensor:       sensorObjSparse.DeepCopy(),
    99  			Trigger:      &sensorObjSparse.Spec.Triggers[0],
   100  			Logger:       logging.NewArgoEventsLogger(),
   101  		},
   102  		{
   103  			LambdaClient: nil,
   104  			Sensor:       sensorObjFull.DeepCopy(),
   105  			Trigger:      &sensorObjFull.Spec.Triggers[0],
   106  			Logger:       logging.NewArgoEventsLogger(),
   107  		},
   108  	}
   109  }
   110  
   111  func TestAWSLambdaTrigger_FetchResource(t *testing.T) {
   112  	triggers := getAWSTriggers()
   113  	for _, trigger := range triggers {
   114  		resource, err := trigger.FetchResource(context.TODO())
   115  		assert.Nil(t, err)
   116  		assert.NotNil(t, resource)
   117  
   118  		at, ok := resource.(*v1alpha1.AWSLambdaTrigger)
   119  		assert.Nil(t, err)
   120  		assert.Equal(t, true, ok)
   121  		assert.Equal(t, "fake-function", at.FunctionName)
   122  	}
   123  }
   124  
   125  func TestAWSLambdaTrigger_ApplyResourceParameters(t *testing.T) {
   126  	triggers := getAWSTriggers()
   127  	for _, trigger := range triggers {
   128  		testEvents := map[string]*v1alpha1.Event{
   129  			"fake-dependency": {
   130  				Context: &v1alpha1.EventContext{
   131  					ID:              "1",
   132  					Type:            "webhook",
   133  					Source:          "webhook-gateway",
   134  					DataContentType: "application/json",
   135  					SpecVersion:     cloudevents.VersionV1,
   136  					Subject:         "example-1",
   137  				},
   138  				Data: []byte(`{"function": "real-function"}`),
   139  			},
   140  		}
   141  
   142  		defaultValue := "default"
   143  		defaultRegion := "region"
   144  
   145  		trigger.Trigger.Template.AWSLambda.Parameters = []v1alpha1.TriggerParameter{
   146  			{
   147  				Src: &v1alpha1.TriggerParameterSource{
   148  					DependencyName: "fake-dependency",
   149  					DataKey:        "function",
   150  					Value:          &defaultValue,
   151  				},
   152  				Dest: "functionName",
   153  			},
   154  			{
   155  				Src: &v1alpha1.TriggerParameterSource{
   156  					DependencyName: "fake-dependency",
   157  					DataKey:        "region",
   158  					Value:          &defaultRegion,
   159  				},
   160  				Dest: "region",
   161  			},
   162  		}
   163  
   164  		response, err := trigger.ApplyResourceParameters(testEvents, trigger.Trigger.Template.AWSLambda)
   165  		assert.Nil(t, err)
   166  		assert.NotNil(t, response)
   167  
   168  		updatedObj, ok := response.(*v1alpha1.AWSLambdaTrigger)
   169  		assert.Equal(t, true, ok)
   170  		assert.Equal(t, "real-function", updatedObj.FunctionName)
   171  		assert.Equal(t, "region", updatedObj.Region)
   172  	}
   173  }
   174  
   175  func TestAWSLambdaTrigger_ApplyPolicy(t *testing.T) {
   176  	triggers := getAWSTriggers()
   177  	for _, trigger := range triggers {
   178  		status := int64(200)
   179  		response := &lambda.InvokeOutput{
   180  			StatusCode: &status,
   181  		}
   182  		trigger.Trigger.Policy = &v1alpha1.TriggerPolicy{
   183  			Status: &v1alpha1.StatusPolicy{Allow: []int32{200, 300}},
   184  		}
   185  		err := trigger.ApplyPolicy(context.TODO(), response)
   186  		assert.Nil(t, err)
   187  	}
   188  }