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 }