github.com/argoproj/argo-events@v1.9.1/sensors/triggers/pulsar/pulsar_test.go (about) 1 /* 2 Copyright 2021 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 pulsar 17 18 import ( 19 "context" 20 "fmt" 21 "testing" 22 23 "github.com/apache/pulsar-client-go/pulsar" 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 "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" 31 ) 32 33 type mockPulsarProducer struct { 34 topic string 35 name string 36 expected bool 37 } 38 39 func (m *mockPulsarProducer) ExpectInputAndSucceed() { 40 m.expected = true 41 } 42 func (m *mockPulsarProducer) Topic() string { 43 return m.topic 44 } 45 func (m *mockPulsarProducer) Name() string { 46 return m.name 47 } 48 func (m *mockPulsarProducer) Send(context.Context, *pulsar.ProducerMessage) (pulsar.MessageID, error) { 49 if m.expected { 50 m.expected = false 51 return nil, nil 52 } 53 return nil, fmt.Errorf("input not expected") 54 } 55 func (m *mockPulsarProducer) SendAsync(context.Context, *pulsar.ProducerMessage, func(pulsar.MessageID, *pulsar.ProducerMessage, error)) { 56 57 } 58 func (m *mockPulsarProducer) LastSequenceID() int64 { 59 return 0 60 } 61 func (m *mockPulsarProducer) Flush() error { 62 return nil 63 } 64 func (m *mockPulsarProducer) Close() { 65 66 } 67 68 var sensorObj = &v1alpha1.Sensor{ 69 ObjectMeta: metav1.ObjectMeta{ 70 Name: "fake-sensor", 71 Namespace: "fake", 72 }, 73 Spec: v1alpha1.SensorSpec{ 74 Triggers: []v1alpha1.Trigger{ 75 { 76 Template: &v1alpha1.TriggerTemplate{ 77 Name: "fake-trigger", 78 Pulsar: &v1alpha1.PulsarTrigger{ 79 URL: "fake-pulsar-url", 80 Topic: "fake-topic", 81 Parameters: nil, 82 Payload: nil, 83 }, 84 }, 85 }, 86 }, 87 }, 88 } 89 90 func getFakePulsarTrigger(producers common.StringKeyedMap[pulsar.Producer]) (*PulsarTrigger, error) { 91 return NewPulsarTrigger(sensorObj.DeepCopy(), sensorObj.Spec.Triggers[0].DeepCopy(), producers, logging.NewArgoEventsLogger()) 92 } 93 94 func TestNewPulsarTrigger(t *testing.T) { 95 producer := &mockPulsarProducer{ 96 topic: "fake-topic", 97 name: "fake-producer", 98 } 99 producers := common.NewStringKeyedMap[pulsar.Producer]() 100 producers.Store("fake-trigger", producer) 101 trigger, err := NewPulsarTrigger(sensorObj.DeepCopy(), sensorObj.Spec.Triggers[0].DeepCopy(), producers, logging.NewArgoEventsLogger()) 102 assert.Nil(t, err) 103 assert.Equal(t, trigger.Trigger.Template.Pulsar.URL, "fake-pulsar-url") 104 assert.Equal(t, trigger.Trigger.Template.Pulsar.Topic, "fake-topic") 105 } 106 107 func TestPulsarTrigger_FetchResource(t *testing.T) { 108 producer := &mockPulsarProducer{ 109 topic: "fake-topic", 110 name: "fake-producer", 111 } 112 producers := common.NewStringKeyedMap[pulsar.Producer]() 113 producers.Store("fake-trigger", producer) 114 trigger, err := getFakePulsarTrigger(producers) 115 assert.Nil(t, err) 116 obj, err := trigger.FetchResource(context.TODO()) 117 assert.Nil(t, err) 118 assert.NotNil(t, obj) 119 trigger1, ok := obj.(*v1alpha1.PulsarTrigger) 120 assert.Equal(t, true, ok) 121 assert.Equal(t, trigger.Trigger.Template.Pulsar.URL, trigger1.URL) 122 } 123 124 func TestPulsarTrigger_ApplyResourceParameters(t *testing.T) { 125 producer := &mockPulsarProducer{ 126 topic: "fake-topic", 127 name: "fake-producer", 128 } 129 producers := common.NewStringKeyedMap[pulsar.Producer]() 130 producers.Store("fake-trigger", producer) 131 trigger, err := getFakePulsarTrigger(producers) 132 assert.Nil(t, err) 133 134 testEvents := map[string]*v1alpha1.Event{ 135 "fake-dependency": { 136 Context: &v1alpha1.EventContext{ 137 ID: "1", 138 Type: "webhook", 139 Source: "webhook-gateway", 140 DataContentType: "application/json", 141 SpecVersion: cloudevents.VersionV1, 142 Subject: "example-1", 143 }, 144 Data: []byte(`{"url": "another-fake-pulsar-url"}`), 145 }, 146 } 147 148 defaultValue := "http://default.com" 149 150 trigger.Trigger.Template.Pulsar.Parameters = []v1alpha1.TriggerParameter{ 151 { 152 Src: &v1alpha1.TriggerParameterSource{ 153 DependencyName: "fake-dependency", 154 DataKey: "url", 155 Value: &defaultValue, 156 }, 157 Dest: "url", 158 }, 159 } 160 161 resource, err := trigger.ApplyResourceParameters(testEvents, trigger.Trigger.Template.Pulsar) 162 assert.Nil(t, err) 163 assert.NotNil(t, resource) 164 165 updatedTrigger, ok := resource.(*v1alpha1.PulsarTrigger) 166 assert.Nil(t, err) 167 assert.Equal(t, true, ok) 168 assert.Equal(t, "another-fake-pulsar-url", updatedTrigger.URL) 169 } 170 171 func TestPulsarTrigger_Execute(t *testing.T) { 172 producer := &mockPulsarProducer{ 173 topic: "fake-topic", 174 name: "fake-producer", 175 } 176 producers := common.NewStringKeyedMap[pulsar.Producer]() 177 producers.Store("fake-trigger", producer) 178 trigger, err := getFakePulsarTrigger(producers) 179 assert.Nil(t, err) 180 181 testEvents := map[string]*v1alpha1.Event{ 182 "fake-dependency": { 183 Context: &v1alpha1.EventContext{ 184 ID: "1", 185 Type: "webhook", 186 Source: "webhook-gateway", 187 DataContentType: "application/json", 188 SpecVersion: cloudevents.VersionV1, 189 Subject: "example-1", 190 }, 191 Data: []byte(`{"message": "world"}`), 192 }, 193 } 194 195 defaultValue := "hello" 196 197 trigger.Trigger.Template.Pulsar.Payload = []v1alpha1.TriggerParameter{ 198 { 199 Src: &v1alpha1.TriggerParameterSource{ 200 DependencyName: "fake-dependency", 201 DataKey: "message", 202 Value: &defaultValue, 203 }, 204 Dest: "message", 205 }, 206 } 207 208 producer.ExpectInputAndSucceed() 209 210 result, err := trigger.Execute(context.TODO(), testEvents, trigger.Trigger.Template.Pulsar) 211 assert.Nil(t, err) 212 assert.Nil(t, result) 213 }