// Copyright 2020-2023 The NATS Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package jetstream import ( "context" "errors" "testing" "time" "github.com/nats-io/nats.go" ) func TestConsumerInfo(t *testing.T) { srv := RunBasicJetStreamServer() defer shutdownJSServerAndRemoveStorage(t, srv) t.Run("get consumer info, ok", func(t *testing.T) { nc, err := nats.Connect(srv.ClientURL()) if err != nil { t.Fatalf("Unexpected error: %v", err) } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() js, err := New(nc) if err != nil { t.Fatalf("Unexpected error: %v", err) } defer nc.Close() s, err := js.CreateStream(ctx, StreamConfig{Name: "foo", Subjects: []string{"FOO.*"}}) if err != nil { t.Fatalf("Unexpected error: %v", err) } c, err := s.AddConsumer(ctx, ConsumerConfig{ Durable: "cons", AckPolicy: AckExplicitPolicy, Description: "test consumer", }) if err != nil { t.Fatalf("Unexpected error: %v", err) } info, err := c.Info(ctx) if err != nil { t.Fatalf("Unexpected error: %v", err) } if info.Stream != "foo" { t.Fatalf("Invalid stream name; expected: 'foo'; got: %s", info.Stream) } if info.Config.Description != "test consumer" { t.Fatalf("Invalid consumer description; expected: 'test consumer'; got: %s", info.Config.Description) } // update consumer and see if info is updated _, err = s.AddConsumer(ctx, ConsumerConfig{ Durable: "cons", AckPolicy: AckExplicitPolicy, Description: "updated consumer", }) if err != nil { t.Fatalf("Unexpected error: %v", err) } info, err = c.Info(ctx) if err != nil { t.Fatalf("Unexpected error: %v", err) } if info.Stream != "foo" { t.Fatalf("Invalid stream name; expected: 'foo'; got: %s", info.Stream) } if info.Config.Description != "updated consumer" { t.Fatalf("Invalid consumer description; expected: 'updated consumer'; got: %s", info.Config.Description) } }) t.Run("consumer does not exist", func(t *testing.T) { nc, err := nats.Connect(srv.ClientURL()) if err != nil { t.Fatalf("Unexpected error: %v", err) } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() js, err := New(nc) if err != nil { t.Fatalf("Unexpected error: %v", err) } defer nc.Close() s, err := js.Stream(ctx, "foo") if err != nil { t.Fatalf("Unexpected error: %v", err) } c, err := s.Consumer(ctx, "cons") if err != nil { t.Fatalf("Unexpected error: %v", err) } if err := s.DeleteConsumer(ctx, "cons"); err != nil { t.Fatalf("Unexpected error: %v", err) } _, err = c.Info(ctx) if err == nil || !errors.Is(err, ErrConsumerNotFound) { t.Fatalf("Expected error: %v; got: %v", ErrConsumerNotFound, err) } }) } func TestConsumerCachedInfo(t *testing.T) { srv := RunBasicJetStreamServer() defer shutdownJSServerAndRemoveStorage(t, srv) nc, err := nats.Connect(srv.ClientURL()) if err != nil { t.Fatalf("Unexpected error: %v", err) } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() js, err := New(nc) if err != nil { t.Fatalf("Unexpected error: %v", err) } defer nc.Close() s, err := js.CreateStream(ctx, StreamConfig{Name: "foo", Subjects: []string{"FOO.*"}}) if err != nil { t.Fatalf("Unexpected error: %v", err) } c, err := s.AddConsumer(ctx, ConsumerConfig{ Durable: "cons", AckPolicy: AckExplicitPolicy, Description: "test consumer", }) if err != nil { t.Fatalf("Unexpected error: %v", err) } info := c.CachedInfo() if info.Stream != "foo" { t.Fatalf("Invalid stream name; expected: 'foo'; got: %s", info.Stream) } if info.Config.Description != "test consumer" { t.Fatalf("Invalid consumer description; expected: 'test consumer'; got: %s", info.Config.Description) } // update consumer and see if info is updated _, err = s.AddConsumer(ctx, ConsumerConfig{ Durable: "cons", AckPolicy: AckExplicitPolicy, Description: "updated consumer", }) if err != nil { t.Fatalf("Unexpected error: %v", err) } info = c.CachedInfo() if info.Stream != "foo" { t.Fatalf("Invalid stream name; expected: 'foo'; got: %s", info.Stream) } // description should not be updated when using cached values if info.Config.Description != "test consumer" { t.Fatalf("Invalid consumer description; expected: 'updated consumer'; got: %s", info.Config.Description) } }