secret version list no longer shows a version without NOT_AFTER as expired (closes #150)
check / check (push) Waiting to run
check / check (push) Waiting to run
STATUS was `expired` for every version other than the current one, so after a promote the newest version, which has no NOT_AFTER, read `expired`. STATUS is now `current` for the current version, `expired` for another version whose NOT_AFTER has passed, and `inactive` for any other version. README describes the three. Judgement call: the issue left the third word to the owner; `inactive` is the word the plan comment on the issue chose. Model: opus-5-5
This commit is contained in:
@@ -229,9 +229,13 @@ func printVersionRow(
|
||||
}
|
||||
|
||||
// Determine status
|
||||
status := "expired"
|
||||
if version == currentVersion {
|
||||
status := "inactive"
|
||||
|
||||
switch {
|
||||
case version == currentVersion:
|
||||
status = "current"
|
||||
case sv.Metadata.NotAfter != nil && sv.Metadata.NotAfter.Before(time.Now()):
|
||||
status = "expired"
|
||||
}
|
||||
|
||||
// Format timestamps
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
// - TestListVersionsCommand: Tests `secret version list` command output
|
||||
// - TestListVersionsNonExistentSecret: Tests error handling for missing secrets
|
||||
// - TestPromoteVersionCommand: Tests `secret version promote` command
|
||||
// - TestListVersionsStatusAfterPromote: Tests each version's status after
|
||||
// promoting an older version
|
||||
// - TestPromoteNonExistentVersion: Tests error handling for invalid promotion
|
||||
// - TestGetSecretWithVersion: Tests `secret get --version` flag functionality
|
||||
// - TestGetSecretWritesBinaryValue: Tests `secret get` output of binary values
|
||||
@@ -242,6 +244,66 @@ func TestPromoteVersionCommand(t *testing.T) {
|
||||
assert.Equal(t, []byte("version-1"), promoted.Bytes())
|
||||
}
|
||||
|
||||
func TestListVersionsStatusAfterPromote(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
fs := afero.NewMemMapFs()
|
||||
cli := NewCLIInstanceWithStateDir(fs, testStateDir)
|
||||
cli.Mnemonic = testMnemonicBuffer(t)
|
||||
|
||||
setupTestVault(t, fs)
|
||||
|
||||
vlt, err := vault.GetCurrentVault(fs, testStateDir)
|
||||
require.NoError(t, err)
|
||||
|
||||
vlt.Mnemonic = cli.Mnemonic
|
||||
|
||||
addTestSecret(t, vlt, []byte("version-1"), false)
|
||||
addTestSecret(t, vlt, []byte("version-2"), true)
|
||||
addTestSecret(t, vlt, []byte("version-3"), true)
|
||||
|
||||
vaultDir, err := vlt.GetDirectory()
|
||||
require.NoError(t, err)
|
||||
|
||||
// Newest first
|
||||
versions, err := secret.ListVersions(fs,
|
||||
filepath.Join(vaultDir, "secrets.d", "test%secret"))
|
||||
require.NoError(t, err)
|
||||
require.Len(t, versions, 3)
|
||||
|
||||
newest, middle, oldest := versions[0], versions[1], versions[2]
|
||||
|
||||
cmd := newRootCmd()
|
||||
|
||||
var buf bytes.Buffer
|
||||
cmd.SetOut(&buf)
|
||||
cmd.SetErr(&buf)
|
||||
|
||||
err = cli.PromoteVersion(cmd, "test/secret", oldest)
|
||||
require.NoError(t, err)
|
||||
|
||||
buf.Reset()
|
||||
|
||||
err = cli.ListVersions(cmd, "test/secret")
|
||||
require.NoError(t, err)
|
||||
|
||||
// STATUS is the fourth field of a row, since CREATED is a date and a time
|
||||
statuses := map[string]string{}
|
||||
|
||||
for line := range strings.SplitSeq(buf.String(), "\n") {
|
||||
fields := strings.Fields(line)
|
||||
if len(fields) > 3 {
|
||||
statuses[fields[0]] = fields[3]
|
||||
}
|
||||
}
|
||||
|
||||
assert.Equal(t, "current", statuses[oldest])
|
||||
// Its NOT_AFTER was set when the newest version was added
|
||||
assert.Equal(t, "expired", statuses[middle])
|
||||
// It has no NOT_AFTER
|
||||
assert.Equal(t, "inactive", statuses[newest])
|
||||
}
|
||||
|
||||
func TestPromoteNonExistentVersion(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user