github.com/kubeshop/testkube@v1.17.23/pkg/logs/client/stream_test.go (about)

     1  package client
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/nats-io/nats.go"
     9  	"github.com/stretchr/testify/assert"
    10  
    11  	"github.com/kubeshop/testkube/pkg/event/bus"
    12  	"github.com/kubeshop/testkube/pkg/logs/events"
    13  )
    14  
    15  func TestStream_StartStop(t *testing.T) {
    16  	t.Run("start and stop events are triggered", func(t *testing.T) {
    17  		// given nats server with jetstream
    18  		ns, nc := bus.TestServerWithConnection()
    19  		defer ns.Shutdown()
    20  
    21  		id := "111"
    22  
    23  		ctx := context.Background()
    24  
    25  		// and log stream
    26  		client, err := NewNatsLogStream(nc)
    27  		assert.NoError(t, err)
    28  
    29  		// initialized
    30  		meta, err := client.Init(ctx, id)
    31  		assert.NoError(t, err)
    32  		assert.Equal(t, StreamPrefix+id, meta.Name)
    33  
    34  		// when data are passed
    35  		err = client.PushBytes(ctx, id, []byte(`{"resourceId":"hello 1"}`))
    36  		assert.NoError(t, err)
    37  
    38  		var startReceived, stopReceived bool
    39  
    40  		_, err = nc.Subscribe(StartSubject, func(m *nats.Msg) {
    41  			m.Respond([]byte("ok"))
    42  			startReceived = true
    43  		})
    44  		assert.NoError(t, err)
    45  		_, err = nc.Subscribe(StopSubject, func(m *nats.Msg) {
    46  			m.Respond([]byte("ok"))
    47  			stopReceived = true
    48  		})
    49  
    50  		assert.NoError(t, err)
    51  
    52  		// and stream started
    53  		d, err := client.Start(ctx, id)
    54  		assert.NoError(t, err)
    55  		assert.Equal(t, "ok", string(d.Message))
    56  
    57  		// and stream stopped
    58  		d, err = client.Stop(ctx, id)
    59  		assert.NoError(t, err)
    60  		assert.Equal(t, "ok", string(d.Message))
    61  
    62  		// then start/stop subjects should be notified
    63  		assert.True(t, startReceived)
    64  		assert.True(t, stopReceived)
    65  	})
    66  
    67  	t.Run("channel is closed when log is finished", func(t *testing.T) {
    68  		// given nats server with jetstream
    69  		ns, nc := bus.TestServerWithConnection()
    70  		defer ns.Shutdown()
    71  
    72  		id := "222"
    73  
    74  		ctx := context.Background()
    75  
    76  		// and log stream
    77  		client, err := NewNatsLogStream(nc)
    78  		assert.NoError(t, err)
    79  
    80  		// initialized
    81  		meta, err := client.Init(ctx, id)
    82  		assert.NoError(t, err)
    83  		assert.Equal(t, StreamPrefix+id, meta.Name)
    84  
    85  		// when messages are sent
    86  		err = client.Push(ctx, id, events.NewLog("log line 1"))
    87  		assert.NoError(t, err)
    88  		err = client.Push(ctx, id, events.NewLog("log line 2"))
    89  		assert.NoError(t, err)
    90  		err = client.Push(ctx, id, events.NewLog("log line 3"))
    91  		assert.NoError(t, err)
    92  		// and stream is set as finished
    93  		err = client.Finish(ctx, id)
    94  		assert.NoError(t, err)
    95  
    96  		// and replay of messages is done
    97  		ch, err := client.Get(ctx, id)
    98  		assert.NoError(t, err)
    99  
   100  		messagesCount := 0
   101  
   102  		for l := range ch {
   103  			fmt.Printf("%+v\n", l)
   104  			messagesCount++
   105  			if events.IsFinished(&l.Log) {
   106  				break
   107  			}
   108  		}
   109  
   110  		// then
   111  		assert.Equal(t, 3, messagesCount)
   112  	})
   113  }
   114  
   115  func TestStream_Name(t *testing.T) {
   116  	client, err := NewNatsLogStream(nil)
   117  	assert.NoError(t, err)
   118  
   119  	t.Run("passed one string param", func(t *testing.T) {
   120  		name := client.Name("111")
   121  		assert.Equal(t, StreamPrefix+"111", name)
   122  	})
   123  
   124  	t.Run("passed no string params generates random name", func(t *testing.T) {
   125  		name := client.Name()
   126  		assert.Len(t, name, len(StreamPrefix)+10)
   127  	})
   128  
   129  	t.Run("passed more string params ignore rest", func(t *testing.T) {
   130  		name := client.Name("111", "222", "333")
   131  		assert.Equal(t, StreamPrefix+"111", name)
   132  	})
   133  
   134  }