//go:build integration package link import ( "context" "testing" "time" natsserver "github.com/nats-io/nats-server/v2/server" "github.com/nats-io/nats.go" ) // The revisions a bucket keeps of a key, read over a real bus: oldest first, a delete and a purge said as deleted, and // none for a key that never was (issue 1945: the node agent takes the composition its want names from them). func TestNatsAKeysRevisionsAreReadBack(t *testing.T) { srv, err := natsserver.NewServer(&natsserver.Options{Port: -1, JetStream: true, StoreDir: t.TempDir(), NoLog: true, NoSigs: true}) if err != nil { t.Fatal(err) } go srv.Start() if !srv.ReadyForConnections(10 * time.Second) { t.Fatal("the bus did not come up") } t.Cleanup(srv.Shutdown) conn, err := nats.Connect(srv.ClientURL()) if err != nil { t.Fatal(err) } t.Cleanup(conn.Close) js, err := conn.JetStream() if err != nil { t.Fatal(err) } kv, err := js.CreateKeyValue(&nats.KeyValueConfig{Bucket: "composed-it", History: 10}) if err != nil { t.Fatal(err) } for _, v := range []string{"one", "two", "three"} { if _, err := kv.PutString("it.node-tools.x", v); err != nil { t.Fatal(err) } } bus := OverNATS{Conn: conn, JS: js} ctx := context.Background() got, err := bus.KVHistory(ctx, "composed-it", "it.node-tools.x") if err != nil || len(got) != 3 || string(got[0].Value) != "one" || string(got[2].Value) != "three" || got[0].Revision >= got[2].Revision { t.Fatalf("three revisions read back as %+v (%v)", got, err) } if err := kv.Delete("it.node-tools.x"); err != nil { t.Fatal(err) } got, err = bus.KVHistory(ctx, "composed-it", "it.node-tools.x") if err != nil || len(got) != 4 || !got[3].Deleted { t.Fatalf("after a delete: %+v (%v)", got, err) } if err := kv.Purge("it.node-tools.x"); err != nil { t.Fatal(err) } got, err = bus.KVHistory(ctx, "composed-it", "it.node-tools.x") if err != nil || len(got) != 1 || !got[0].Deleted { t.Fatalf("after a purge: %+v (%v)", got, err) } if got, err := bus.KVHistory(ctx, "composed-it", "it.never.x"); err != nil || len(got) != 0 { t.Fatalf("a key that never was: %+v (%v)", got, err) } }