github.com/argoproj/argo-events@v1.9.1/sensors/triggers/http/http_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 http
    17  
    18  import (
    19  	"context"
    20  	"net/http"
    21  	"testing"
    22  
    23  	"github.com/argoproj/argo-events/common/logging"
    24  	"github.com/argoproj/argo-events/pkg/apis/common"
    25  	"github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1"
    26  	cloudevents "github.com/cloudevents/sdk-go/v2"
    27  	"github.com/stretchr/testify/assert"
    28  	corev1 "k8s.io/api/core/v1"
    29  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    30  )
    31  
    32  var sensorObj = &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",
    42  					HTTP: &v1alpha1.HTTPTrigger{
    43  						URL:     "http://fake.com:12000",
    44  						Method:  "POST",
    45  						Timeout: 10,
    46  					},
    47  				},
    48  			},
    49  		},
    50  	},
    51  }
    52  
    53  func getFakeHTTPTrigger() *HTTPTrigger {
    54  	return &HTTPTrigger{
    55  		Client:  nil,
    56  		Sensor:  sensorObj.DeepCopy(),
    57  		Trigger: sensorObj.Spec.Triggers[0].DeepCopy(),
    58  		Logger:  logging.NewArgoEventsLogger(),
    59  	}
    60  }
    61  
    62  func TestHTTPTrigger_FetchResource(t *testing.T) {
    63  	trigger := getFakeHTTPTrigger()
    64  	obj, err := trigger.FetchResource(context.TODO())
    65  	assert.Nil(t, err)
    66  	assert.NotNil(t, obj)
    67  	trigger1, ok := obj.(*v1alpha1.HTTPTrigger)
    68  	assert.Equal(t, true, ok)
    69  	assert.Equal(t, trigger.Trigger.Template.HTTP.URL, trigger1.URL)
    70  }
    71  
    72  func TestHTTPTrigger_ApplyResourceParameters(t *testing.T) {
    73  	trigger := getFakeHTTPTrigger()
    74  
    75  	testEvents := map[string]*v1alpha1.Event{
    76  		"fake-dependency": {
    77  			Context: &v1alpha1.EventContext{
    78  				ID:              "1",
    79  				Type:            "webhook",
    80  				Source:          "webhook-gateway",
    81  				DataContentType: "application/json",
    82  				SpecVersion:     cloudevents.VersionV1,
    83  				Subject:         "example-1",
    84  			},
    85  			Data: []byte(`{"url": "http://another-fake.com", "method": "GET"}`),
    86  		},
    87  	}
    88  
    89  	defaultValue := "http://default.com"
    90  	secureHeader := &common.SecureHeader{Name: "test", ValueFrom: &common.ValueFromSource{
    91  		SecretKeyRef: &corev1.SecretKeySelector{
    92  			LocalObjectReference: corev1.LocalObjectReference{
    93  				Name: "tokens",
    94  			},
    95  			Key: "serviceToken"}},
    96  	}
    97  
    98  	secureHeaders := []*common.SecureHeader{}
    99  	secureHeaders = append(secureHeaders, secureHeader)
   100  	trigger.Trigger.Template.HTTP.SecureHeaders = secureHeaders
   101  	trigger.Trigger.Template.HTTP.Parameters = []v1alpha1.TriggerParameter{
   102  		{
   103  			Src: &v1alpha1.TriggerParameterSource{
   104  				DependencyName: "fake-dependency",
   105  				DataKey:        "url",
   106  				Value:          &defaultValue,
   107  			},
   108  			Dest: "serverURL",
   109  		},
   110  		{
   111  			Src: &v1alpha1.TriggerParameterSource{
   112  				DependencyName: "fake-dependency",
   113  				DataKey:        "method",
   114  				Value:          &defaultValue,
   115  			},
   116  			Dest: "method",
   117  		},
   118  	}
   119  
   120  	assert.Equal(t, http.MethodPost, trigger.Trigger.Template.HTTP.Method)
   121  
   122  	resource, err := trigger.ApplyResourceParameters(testEvents, trigger.Trigger.Template.HTTP)
   123  	assert.Nil(t, err)
   124  	assert.NotNil(t, resource)
   125  
   126  	updatedTrigger, ok := resource.(*v1alpha1.HTTPTrigger)
   127  	assert.Equal(t, "serviceToken", updatedTrigger.SecureHeaders[0].ValueFrom.SecretKeyRef.Key)
   128  	assert.Nil(t, err)
   129  	assert.Equal(t, true, ok)
   130  	assert.Equal(t, "http://fake.com:12000", updatedTrigger.URL)
   131  	assert.Equal(t, http.MethodGet, updatedTrigger.Method)
   132  }
   133  
   134  func TestHTTPTrigger_ApplyPolicy(t *testing.T) {
   135  	trigger := getFakeHTTPTrigger()
   136  	trigger.Trigger.Policy = &v1alpha1.TriggerPolicy{
   137  		Status: &v1alpha1.StatusPolicy{Allow: []int32{200, 300}},
   138  	}
   139  	response := &http.Response{StatusCode: 200}
   140  	err := trigger.ApplyPolicy(context.TODO(), response)
   141  	assert.Nil(t, err)
   142  
   143  	trigger.Trigger.Policy = &v1alpha1.TriggerPolicy{
   144  		Status: &v1alpha1.StatusPolicy{Allow: []int32{300}},
   145  	}
   146  	err = trigger.ApplyPolicy(context.TODO(), response)
   147  	assert.NotNil(t, err)
   148  }