go-micro.dev/v5@v5.12.0/events/natsjs/nats_test.go (about) 1 package natsjs_test 2 3 import ( 4 "context" 5 "encoding/json" 6 "strconv" 7 "strings" 8 "testing" 9 "time" 10 11 nserver "github.com/nats-io/nats-server/v2/server" 12 "github.com/stretchr/testify/assert" 13 "github.com/test-go/testify/require" 14 "go-micro.dev/v5/events" 15 "go-micro.dev/v5/events/natsjs" 16 ) 17 18 type Payload struct { 19 ID string `json:"id"` 20 Name string `json:"name"` 21 } 22 23 func TestSingleEvent(t *testing.T) { 24 ctx, cancel := context.WithCancel(context.TODO()) 25 defer cancel() 26 27 // variables 28 demoPayload := Payload{ 29 ID: "123", 30 Name: "Hello World", 31 } 32 topic := "foobar" 33 34 clusterName := "test-cluster" 35 36 natsAddr := getFreeLocalhostAddress() 37 natsPort, _ := strconv.Atoi(strings.Split(natsAddr, ":")[1]) 38 39 // start the NATS with JetStream server 40 go natsServer(ctx, 41 t, 42 &nserver.Options{ 43 Host: strings.Split(natsAddr, ":")[0], 44 Port: natsPort, 45 Cluster: nserver.ClusterOpts{ 46 Name: clusterName, 47 }, 48 }, 49 ) 50 51 time.Sleep(1 * time.Second) 52 53 // consumer 54 consumerClient, err := natsjs.NewStream( 55 natsjs.Address(natsAddr), 56 natsjs.ClusterID(clusterName), 57 ) 58 require.NoError(t, err) 59 if err != nil { 60 return 61 } 62 63 consumer := func(_ context.Context, t *testing.T, client events.Stream, cancel context.CancelFunc) { 64 t.Helper() 65 defer cancel() 66 67 foobarEvents, err := client.Consume(topic) 68 require.Nil(t, err) 69 if err != nil { 70 return 71 } 72 73 // wait for the event 74 event := <-foobarEvents 75 76 p := Payload{} 77 err = json.Unmarshal(event.Payload, &p) 78 79 require.NoError(t, err) 80 if err != nil { 81 return 82 } 83 84 assert.Equal(t, demoPayload.ID, p.ID) 85 assert.Equal(t, demoPayload.Name, p.Name) 86 } 87 88 go consumer(ctx, t, consumerClient, cancel) 89 90 // publisher 91 time.Sleep(1 * time.Second) 92 93 publisherClient, err := natsjs.NewStream( 94 natsjs.Address(natsAddr), 95 natsjs.ClusterID(clusterName), 96 ) 97 require.NoError(t, err) 98 if err != nil { 99 return 100 } 101 102 publisher := func(_ context.Context, t *testing.T, client events.Stream) { 103 t.Helper() 104 err := client.Publish(topic, demoPayload) 105 require.NoError(t, err) 106 } 107 108 go publisher(ctx, t, publisherClient) 109 110 // wait until consumer received the event 111 <-ctx.Done() 112 }