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  }