github.com/argoproj/argo-events@v1.9.1/sensors/triggers/kafka/kafka_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 kafka
    17  
    18  import (
    19  	"context"
    20  	"testing"
    21  
    22  	"github.com/IBM/sarama"
    23  	"github.com/IBM/sarama/mocks"
    24  	cloudevents "github.com/cloudevents/sdk-go/v2"
    25  	"github.com/stretchr/testify/assert"
    26  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    27  
    28  	"github.com/argoproj/argo-events/common"
    29  	"github.com/argoproj/argo-events/common/logging"
    30  	apicommon "github.com/argoproj/argo-events/pkg/apis/common"
    31  	"github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1"
    32  )
    33  
    34  var sensorObj = &v1alpha1.Sensor{
    35  	ObjectMeta: metav1.ObjectMeta{
    36  		Name:      "fake-sensor",
    37  		Namespace: "fake",
    38  	},
    39  	Spec: v1alpha1.SensorSpec{
    40  		Triggers: []v1alpha1.Trigger{
    41  			{
    42  				Template: &v1alpha1.TriggerTemplate{
    43  					Name: "fake-trigger",
    44  					Kafka: &v1alpha1.KafkaTrigger{
    45  						URL:            "fake-kafka-url",
    46  						Topic:          "fake-topic",
    47  						Parameters:     nil,
    48  						RequiredAcks:   1,
    49  						Compress:       false,
    50  						FlushFrequency: 0,
    51  						SASL: &apicommon.SASLConfig{
    52  							Mechanism: "PLAIN",
    53  						},
    54  						TLS:             nil,
    55  						Payload:         nil,
    56  						PartitioningKey: nil,
    57  					},
    58  				},
    59  			},
    60  		},
    61  	},
    62  }
    63  
    64  func getFakeKafkaTrigger(producers common.StringKeyedMap[sarama.AsyncProducer]) (*KafkaTrigger, error) {
    65  	return NewKafkaTrigger(sensorObj.DeepCopy(), sensorObj.Spec.Triggers[0].DeepCopy(), producers, logging.NewArgoEventsLogger())
    66  }
    67  
    68  func TestNewKafkaTrigger(t *testing.T) {
    69  	producer := mocks.NewAsyncProducer(t, nil)
    70  	producers := common.NewStringKeyedMap[sarama.AsyncProducer]()
    71  	producers.Store("fake-trigger", producer)
    72  	trigger, err := NewKafkaTrigger(sensorObj.DeepCopy(), sensorObj.Spec.Triggers[0].DeepCopy(), producers, logging.NewArgoEventsLogger())
    73  
    74  	assert.Nil(t, err)
    75  	assert.Equal(t, trigger.Trigger.Template.Kafka.URL, "fake-kafka-url")
    76  	assert.Equal(t, trigger.Trigger.Template.Kafka.SASL.Mechanism, "PLAIN")
    77  }
    78  
    79  func TestKafkaTrigger_FetchResource(t *testing.T) {
    80  	producer := mocks.NewAsyncProducer(t, nil)
    81  	producers := common.NewStringKeyedMap[sarama.AsyncProducer]()
    82  	producers.Store("fake-trigger", producer)
    83  	trigger, err := getFakeKafkaTrigger(producers)
    84  	assert.Nil(t, err)
    85  	obj, err := trigger.FetchResource(context.TODO())
    86  	assert.Nil(t, err)
    87  	assert.NotNil(t, obj)
    88  	trigger1, ok := obj.(*v1alpha1.KafkaTrigger)
    89  	assert.Equal(t, true, ok)
    90  	assert.Equal(t, trigger.Trigger.Template.Kafka.URL, trigger1.URL)
    91  }
    92  
    93  func TestKafkaTrigger_ApplyResourceParameters(t *testing.T) {
    94  	producer := mocks.NewAsyncProducer(t, nil)
    95  	producers := common.NewStringKeyedMap[sarama.AsyncProducer]()
    96  	producers.Store("fake-trigger", producer)
    97  	trigger, err := getFakeKafkaTrigger(producers)
    98  	assert.Nil(t, err)
    99  
   100  	testEvents := map[string]*v1alpha1.Event{
   101  		"fake-dependency": {
   102  			Context: &v1alpha1.EventContext{
   103  				ID:              "1",
   104  				Type:            "webhook",
   105  				Source:          "webhook-gateway",
   106  				DataContentType: "application/json",
   107  				SpecVersion:     cloudevents.VersionV1,
   108  				Subject:         "example-1",
   109  			},
   110  			Data: []byte(`{"url": "another-fake-kafka-url"}`),
   111  		},
   112  	}
   113  
   114  	defaultValue := "http://default.com"
   115  
   116  	trigger.Trigger.Template.Kafka.Parameters = []v1alpha1.TriggerParameter{
   117  		{
   118  			Src: &v1alpha1.TriggerParameterSource{
   119  				DependencyName: "fake-dependency",
   120  				DataKey:        "url",
   121  				Value:          &defaultValue,
   122  			},
   123  			Dest: "url",
   124  		},
   125  	}
   126  
   127  	resource, err := trigger.ApplyResourceParameters(testEvents, trigger.Trigger.Template.Kafka)
   128  	assert.Nil(t, err)
   129  	assert.NotNil(t, resource)
   130  
   131  	updatedTrigger, ok := resource.(*v1alpha1.KafkaTrigger)
   132  	assert.Nil(t, err)
   133  	assert.Equal(t, true, ok)
   134  	assert.Equal(t, "another-fake-kafka-url", updatedTrigger.URL)
   135  }
   136  
   137  func TestKafkaTrigger_Execute(t *testing.T) {
   138  	producer := mocks.NewAsyncProducer(t, nil)
   139  	producers := common.NewStringKeyedMap[sarama.AsyncProducer]()
   140  	producers.Store("fake-trigger", producer)
   141  	trigger, err := getFakeKafkaTrigger(producers)
   142  	assert.Nil(t, err)
   143  	testEvents := map[string]*v1alpha1.Event{
   144  		"fake-dependency": {
   145  			Context: &v1alpha1.EventContext{
   146  				ID:              "1",
   147  				Type:            "webhook",
   148  				Source:          "webhook-gateway",
   149  				DataContentType: "application/json",
   150  				SpecVersion:     cloudevents.VersionV1,
   151  				Subject:         "example-1",
   152  			},
   153  			Data: []byte(`{"message": "world"}`),
   154  		},
   155  	}
   156  
   157  	defaultValue := "hello"
   158  
   159  	trigger.Trigger.Template.Kafka.Payload = []v1alpha1.TriggerParameter{
   160  		{
   161  			Src: &v1alpha1.TriggerParameterSource{
   162  				DependencyName: "fake-dependency",
   163  				DataKey:        "message",
   164  				Value:          &defaultValue,
   165  			},
   166  			Dest: "message",
   167  		},
   168  	}
   169  
   170  	producer.ExpectInputAndSucceed()
   171  
   172  	result, err := trigger.Execute(context.TODO(), testEvents, trigger.Trigger.Template.Kafka)
   173  	assert.Nil(t, err)
   174  	assert.Nil(t, result)
   175  }