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  }