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 }