(t *testing.T)
| 648 | } |
| 649 | |
| 650 | func TestKeyValueDeleteVsPurge(t *testing.T) { |
| 651 | s := RunBasicJetStreamServer() |
| 652 | defer shutdownJSServerAndRemoveStorage(t, s) |
| 653 | |
| 654 | nc, js := jsClient(t, s) |
| 655 | defer nc.Close() |
| 656 | |
| 657 | kv, err := js.CreateKeyValue(&nats.KeyValueConfig{Bucket: "KVS", History: 10}) |
| 658 | expectOk(t, err) |
| 659 | |
| 660 | put := func(key, value string) { |
| 661 | t.Helper() |
| 662 | _, err := kv.Put(key, []byte(value)) |
| 663 | expectOk(t, err) |
| 664 | } |
| 665 | |
| 666 | // Put in a few names and ages. |
| 667 | put("name", "derek") |
| 668 | put("age", "22") |
| 669 | put("name", "ivan") |
| 670 | put("age", "33") |
| 671 | put("name", "rip") |
| 672 | put("age", "44") |
| 673 | |
| 674 | kv.Delete("age") |
| 675 | entries, err := kv.History("age") |
| 676 | expectOk(t, err) |
| 677 | // Expect three entries and delete marker. |
| 678 | if len(entries) != 4 { |
| 679 | t.Fatalf("Expected 4 entries for age after delete, got %d", len(entries)) |
| 680 | } |
| 681 | err = kv.Purge("name", nats.LastRevision(4)) |
| 682 | expectErr(t, err) |
| 683 | err = kv.Purge("name", nats.LastRevision(5)) |
| 684 | expectOk(t, err) |
| 685 | // Check marker |
| 686 | e, err := kv.Get("name") |
| 687 | expectErr(t, err, nats.ErrKeyNotFound) |
| 688 | if e != nil { |
| 689 | t.Fatalf("Expected a nil entry but got %v", e) |
| 690 | } |
| 691 | entries, err = kv.History("name") |
| 692 | expectOk(t, err) |
| 693 | if len(entries) != 1 { |
| 694 | t.Fatalf("Expected only 1 entry for age after delete, got %d", len(entries)) |
| 695 | } |
| 696 | // Make sure history also reports the purge operation. |
| 697 | if e := entries[0]; e.Operation() != nats.KeyValuePurge { |
| 698 | t.Fatalf("Expected a purge operation but got %v", e.Operation()) |
| 699 | } |
| 700 | } |
| 701 | |
| 702 | func TestKeyValueDeleteTombstones(t *testing.T) { |
| 703 | s := RunBasicJetStreamServer() |
nothing calls this directly
no test coverage detected