1package command
2
3import (
4	"strings"
5	"testing"
6
7	"github.com/hashicorp/vault/api"
8	"github.com/mitchellh/cli"
9)
10
11func testKVMetadataPutCommand(tb testing.TB) (*cli.MockUi, *KVMetadataPutCommand) {
12	tb.Helper()
13
14	ui := cli.NewMockUi()
15	return ui, &KVMetadataPutCommand{
16		BaseCommand: &BaseCommand{
17			UI: ui,
18		},
19	}
20}
21
22func TestKvMetadataPutCommandDeleteVersionAfter(t *testing.T) {
23	client, closer := testVaultServer(t)
24	defer closer()
25
26	basePath := t.Name() + "/"
27	if err := client.Sys().Mount(basePath, &api.MountInput{
28		Type: "kv-v2",
29	}); err != nil {
30		t.Fatal(err)
31	}
32
33	ui, cmd := testKVMetadataPutCommand(t)
34	cmd.client = client
35
36	// Set a limit of 1s first.
37	code := cmd.Run([]string{"-delete-version-after=1s", basePath + "secret/my-secret"})
38	if code != 0 {
39		t.Fatalf("expected %d but received %d", 0, code)
40	}
41
42	metaFullPath := basePath + "metadata/secret/my-secret"
43	combined := ui.OutputWriter.String() + ui.ErrorWriter.String()
44	success := "Success! Data written to: " + metaFullPath
45	if !strings.Contains(combined, success) {
46		t.Fatalf("expected %q but received %q", success, combined)
47	}
48
49	secret, err := client.Logical().Read(metaFullPath)
50	if err != nil {
51		t.Fatal(err)
52	}
53	if secret.Data["delete_version_after"] != "1s" {
54		t.Fatalf("expected 1s but received %q", secret.Data["delete_version_after"])
55	}
56
57	// Now verify that we can return it to 0s.
58	ui, cmd = testKVMetadataPutCommand(t)
59	cmd.client = client
60
61	// Set a limit of 1s first.
62	code = cmd.Run([]string{"-delete-version-after=0", basePath + "secret/my-secret"})
63	if code != 0 {
64		t.Errorf("expected %d but received %d", 0, code)
65	}
66
67	combined = ui.OutputWriter.String() + ui.ErrorWriter.String()
68	if !strings.Contains(combined, success) {
69		t.Errorf("expected %q but received %q", success, combined)
70	}
71
72	secret, err = client.Logical().Read(metaFullPath)
73	if err != nil {
74		t.Fatal(err)
75	}
76	if secret.Data["delete_version_after"] != "0s" {
77		t.Fatalf("expected 0s but received %q", secret.Data["delete_version_after"])
78	}
79}
80