github.com/kubeshop/testkube@v1.17.23/pkg/event/bus/nats_integration_test.go (about)

     1  package bus
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"sync"
     7  	"sync/atomic"
     8  	"testing"
     9  
    10  	"github.com/kubeshop/testkube/pkg/utils/test"
    11  
    12  	"github.com/nats-io/nats.go"
    13  	"github.com/stretchr/testify/assert"
    14  
    15  	"github.com/kubeshop/testkube/pkg/api/v1/testkube"
    16  )
    17  
    18  func TestMultipleMessages_Integration(t *testing.T) {
    19  	test.IntegrationTest(t)
    20  
    21  	// given NATS connection
    22  	nc, err := nats.Connect("localhost")
    23  	assert.NoError(t, err)
    24  	defer nc.Close()
    25  
    26  	var i int32
    27  	var wg sync.WaitGroup
    28  
    29  	eventCount := 1000
    30  
    31  	// and 2 subscriptions
    32  
    33  	wg.Add(2 * eventCount)
    34  
    35  	// first 2 subscriptions with one queue group
    36  	nc.QueueSubscribe("test1", "q1", func(msg *nats.Msg) {
    37  
    38  		var event testkube.Event
    39  		assert.NoError(t, json.Unmarshal(msg.Data, &event))
    40  		atomic.AddInt32(&i, 1)
    41  		wg.Done()
    42  	})
    43  	nc.QueueSubscribe("test1", "q1", func(msg *nats.Msg) {
    44  		var event testkube.Event
    45  		assert.NoError(t, json.Unmarshal(msg.Data, &event))
    46  		atomic.AddInt32(&i, 1)
    47  		wg.Done()
    48  	})
    49  
    50  	// second subscription with another queue group
    51  	nc.QueueSubscribe("test1", "q2", func(msg *nats.Msg) {
    52  		var event testkube.Event
    53  		assert.NoError(t, json.Unmarshal(msg.Data, &event))
    54  		atomic.AddInt32(&i, 1)
    55  		wg.Done()
    56  	})
    57  
    58  	// when events are published
    59  	for j := 0; j < eventCount; j++ {
    60  		err := nc.Publish("test1", []byte(fmt.Sprintf(`{"id":"%d","type":"test"}`, j)))
    61  		if err != nil {
    62  			t.Errorf("got publish error %v", err)
    63  		}
    64  	}
    65  
    66  	wg.Wait()
    67  
    68  	// then all events are received
    69  	// first 2 subscriptions with one queue group should have both `eventCount` messages
    70  	// second subscription should have also `eventCount` messages
    71  	assert.Equal(t, int32(2*eventCount), i)
    72  
    73  }
    74  
    75  func TestNATS_Integration(t *testing.T) {
    76  	test.IntegrationTest(t)
    77  
    78  	// given event
    79  
    80  	event := testkube.NewEventStartTest(testkube.NewQueuedExecution())
    81  	event.Id = "123"
    82  
    83  	// and connection
    84  	nc, err := nats.Connect("localhost")
    85  	assert.NoError(t, err)
    86  	defer nc.Close()
    87  
    88  	// and automatic JSON encoder
    89  	ec, err := nats.NewEncodedConn(nc, nats.JSON_ENCODER)
    90  	assert.NoError(t, err)
    91  	defer ec.Close()
    92  
    93  	// and NATS event bus
    94  	n := NewNATSBus(ec)
    95  
    96  	var wg sync.WaitGroup
    97  	wg.Add(2)
    98  	// when 2 subscriptions are made
    99  	err = n.Subscribe("test1", func(evt testkube.Event) error {
   100  		assert.Equal(t, "123", evt.Id)
   101  		wg.Done()
   102  		return nil
   103  	})
   104  	assert.NoError(t, err)
   105  	err = n.Subscribe("test2", func(evt testkube.Event) error {
   106  		assert.Equal(t, "123", evt.Id)
   107  		wg.Done()
   108  		return nil
   109  	})
   110  	assert.NoError(t, err)
   111  
   112  	// and event is published to event bus
   113  	err = n.Publish(event)
   114  	assert.NoError(t, err)
   115  
   116  	wg.Wait()
   117  }