`secret vault import` took only a vault without a long-term key, and `secret init` and `secret vault create` give every vault one, so it always failed. A mnemonic enters through those two commands, so the command goes, with its tests and its README entry. The help and the note of `secret generate mnemonic` named `secret import`, which imports a file as a secret; they now name `secret init` and `secret vault create`. `secret vault import` now prints the help of `secret vault` and exits 0, as cobra does for any subcommand of `secret vault` it does not know. Judgement call: TestWorkflowMismatch in internal/vault, which replayed the import step by step, is deleted. Model: opus-5-5
This commit is contained in:
@@ -140,16 +140,6 @@ func TestSecretManagerIntegration(t *testing.T) {
|
||||
// - currentvault symlink updated to point to work
|
||||
test03CreateVault(t, tempDir, runSecret)
|
||||
|
||||
// Test 4: Import mnemonic into work vault
|
||||
// Command: secret vault import work
|
||||
// Purpose: Import mnemonic with passphrase unlocker
|
||||
// Expected filesystem:
|
||||
// - work vault has pub.age file
|
||||
// - work vault has unlockers.d/passphrase directory
|
||||
// - Unlocker metadata and encrypted keys present
|
||||
// NOTE: Skipped because vault creation now includes mnemonic import
|
||||
// test04ImportMnemonic(t, tempDir, testMnemonic, testPassphrase, runSecretWithEnv)
|
||||
|
||||
// Test 5: Add secrets with versioning
|
||||
// Command: echo "password123" | secret add database/password
|
||||
// Purpose: Add a secret and verify versioned storage
|
||||
@@ -535,65 +525,6 @@ func test03CreateVault(t *testing.T, tempDir string, runSecret func(...string) (
|
||||
assert.Contains(t, output, "work", "should list work vault")
|
||||
}
|
||||
|
||||
//nolint:unused // TODO: re-enable when vault import is implemented
|
||||
func test04ImportMnemonic(t *testing.T, tempDir, testMnemonic, testPassphrase string, runSecretWithEnv func(map[string]string, ...string) (string, error)) {
|
||||
t.Helper()
|
||||
|
||||
// Import mnemonic into work vault
|
||||
output, err := runSecretWithEnv(map[string]string{
|
||||
secret.EnvMnemonic: testMnemonic,
|
||||
secret.EnvUnlockPassphrase: testPassphrase,
|
||||
}, "vault", "import", "work")
|
||||
|
||||
require.NoError(t, err, "vault import should succeed")
|
||||
assert.Contains(t, output, "Successfully imported mnemonic into vault 'work'", "should confirm import")
|
||||
|
||||
// Verify work vault now has long-term key
|
||||
workVaultDir := filepath.Join(tempDir, "vaults.d", "work")
|
||||
pubKeyFile := filepath.Join(workVaultDir, "pub.age")
|
||||
verifyFileExists(t, pubKeyFile)
|
||||
|
||||
// Verify passphrase unlocker was created
|
||||
currentUnlocker := readFile(t, filepath.Join(workVaultDir, "current-unlocker"))
|
||||
passphraseUnlockerDir := filepath.Join(workVaultDir, "unlockers.d", string(currentUnlocker))
|
||||
verifyFileExists(t, passphraseUnlockerDir)
|
||||
|
||||
// Check unlocker files
|
||||
unlockerMetadata := filepath.Join(passphraseUnlockerDir, "unlocker-metadata.json")
|
||||
verifyFileExists(t, unlockerMetadata)
|
||||
|
||||
encryptedLTPrivKey := filepath.Join(passphraseUnlockerDir, "priv.age")
|
||||
verifyFileExists(t, encryptedLTPrivKey)
|
||||
|
||||
encryptedLTPubKey := filepath.Join(passphraseUnlockerDir, "pub.age")
|
||||
verifyFileExists(t, encryptedLTPubKey)
|
||||
|
||||
longtermKeyFile := filepath.Join(passphraseUnlockerDir, "longterm.age")
|
||||
verifyFileExists(t, longtermKeyFile)
|
||||
|
||||
// Verify vault metadata was created with derivation index
|
||||
vaultMetadata := filepath.Join(workVaultDir, "vault-metadata.json")
|
||||
verifyFileExists(t, vaultMetadata)
|
||||
|
||||
metadataBytes := readFile(t, vaultMetadata)
|
||||
|
||||
var metadata map[string]any
|
||||
|
||||
err = json.Unmarshal(metadataBytes, &metadata)
|
||||
require.NoError(t, err, "vault metadata should be valid JSON")
|
||||
|
||||
// Work vault should have a different derivation index than default (0)
|
||||
derivIndex, ok := metadata["derivationIndex"].(float64)
|
||||
require.True(t, ok, "derivationIndex should be a number")
|
||||
assert.NotEqual(t, float64(0), derivIndex, "work vault should have non-zero derivation index")
|
||||
|
||||
// Verify public key hash is stored
|
||||
assert.Contains(t, metadata, "publicKeyHash", "should contain public key hash")
|
||||
pubKeyHash, ok := metadata["publicKeyHash"].(string)
|
||||
require.True(t, ok, "publicKeyHash should be a string")
|
||||
assert.NotEmpty(t, pubKeyHash, "public key hash should not be empty")
|
||||
}
|
||||
|
||||
func test05AddSecret(t *testing.T, tempDir, testMnemonic string, runSecret func(...string) (string, error), runSecretWithEnv func(map[string]string, ...string) (string, error), runSecretWithStdin func(string, map[string]string, ...string) (string, error)) {
|
||||
t.Helper()
|
||||
|
||||
@@ -1939,14 +1870,6 @@ func test23ErrorHandling(t *testing.T, tempDir, secretPath, testMnemonic string,
|
||||
_, err = runSecret("vault", "select", "nonexistent")
|
||||
require.ErrorIs(t, err, vault.ErrVaultNotFound, "select non-existent vault should fail")
|
||||
|
||||
// Import to non-existent vault with test passphrase
|
||||
testPassphrase := "test-passphrase-123" // Define testPassphrase locally
|
||||
_, err = runSecretWithEnv(map[string]string{
|
||||
secret.EnvMnemonic: testMnemonic,
|
||||
secret.EnvUnlockPassphrase: testPassphrase,
|
||||
}, "vault", "import", "nonexistent")
|
||||
require.ErrorIs(t, err, vault.ErrVaultNotFound, "import to non-existent vault should fail")
|
||||
|
||||
// Get specific version that doesn't exist
|
||||
_, err = runSecretWithEnv(map[string]string{
|
||||
secret.EnvMnemonic: testMnemonic,
|
||||
|
||||
Reference in New Issue
Block a user