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 }