github.com/Finschia/finschia-sdk@v0.49.1/client/keys/export_test.go (about) 1 package keys 2 3 import ( 4 "bufio" 5 "context" 6 "fmt" 7 "testing" 8 9 "github.com/stretchr/testify/require" 10 11 "github.com/Finschia/finschia-sdk/client" 12 "github.com/Finschia/finschia-sdk/client/flags" 13 "github.com/Finschia/finschia-sdk/crypto/hd" 14 "github.com/Finschia/finschia-sdk/crypto/keyring" 15 "github.com/Finschia/finschia-sdk/testutil" 16 "github.com/Finschia/finschia-sdk/testutil/testdata" 17 sdk "github.com/Finschia/finschia-sdk/types" 18 ) 19 20 func Test_runExportCmd(t *testing.T) { 21 testCases := []struct { 22 name string 23 keyringBackend string 24 extraArgs []string 25 userInput string 26 mustFail bool 27 expectedOutput string 28 }{ 29 { 30 name: "--unsafe only must fail", 31 keyringBackend: keyring.BackendTest, 32 extraArgs: []string{"--unsafe"}, 33 mustFail: true, 34 }, 35 { 36 name: "--unarmored-hex must fail", 37 keyringBackend: keyring.BackendTest, 38 extraArgs: []string{"--unarmored-hex"}, 39 mustFail: true, 40 }, 41 { 42 name: "--unsafe --unarmored-hex fail with no user confirmation", 43 keyringBackend: keyring.BackendTest, 44 extraArgs: []string{"--unsafe", "--unarmored-hex"}, 45 userInput: "", 46 mustFail: true, 47 expectedOutput: "", 48 }, 49 { 50 name: "--unsafe --unarmored-hex succeed", 51 keyringBackend: keyring.BackendTest, 52 extraArgs: []string{"--unsafe", "--unarmored-hex"}, 53 userInput: "y\n", 54 mustFail: false, 55 expectedOutput: "d4bd5d54ee1b75abc6f5bab08e2e9d3a4b6dfbe6b50e2d6cf2426f3215633a1f\n", 56 }, 57 { 58 name: "file keyring backend properly read password and user confirmation", 59 keyringBackend: keyring.BackendFile, 60 extraArgs: []string{"--unsafe", "--unarmored-hex"}, 61 // first 2 pass for creating the key, then unsafe export confirmation, then unlock keyring pass 62 userInput: "12345678\n12345678\ny\n12345678\n", 63 mustFail: false, 64 expectedOutput: "d4bd5d54ee1b75abc6f5bab08e2e9d3a4b6dfbe6b50e2d6cf2426f3215633a1f\n", 65 }, 66 } 67 68 for _, tc := range testCases { 69 t.Run(tc.name, func(t *testing.T) { 70 kbHome := t.TempDir() 71 defaultArgs := []string{ 72 "keyname1", 73 fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), 74 fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, tc.keyringBackend), 75 } 76 77 cmd := ExportKeyCommand() 78 cmd.Flags().AddFlagSet(Commands("home").PersistentFlags()) 79 80 cmd.SetArgs(append(defaultArgs, tc.extraArgs...)) 81 mockIn, mockOut := testutil.ApplyMockIO(cmd) 82 83 mockIn.Reset(tc.userInput) 84 mockInBuf := bufio.NewReader(mockIn) 85 86 // create a key 87 kb, err := keyring.New(sdk.KeyringServiceName(), tc.keyringBackend, kbHome, bufio.NewReader(mockInBuf)) 88 require.NoError(t, err) 89 t.Cleanup(func() { 90 kb.Delete("keyname1") // nolint:errcheck 91 }) 92 93 path := sdk.GetConfig().GetFullBIP44Path() 94 _, err = kb.NewAccount("keyname1", testdata.TestMnemonic, "", path, hd.Secp256k1) 95 require.NoError(t, err) 96 97 clientCtx := client.Context{}. 98 WithKeyringDir(kbHome). 99 WithKeyring(kb). 100 WithInput(mockInBuf) 101 ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx) 102 103 err = cmd.ExecuteContext(ctx) 104 if tc.mustFail { 105 require.Error(t, err) 106 } else { 107 require.NoError(t, err) 108 require.Equal(t, tc.expectedOutput, mockOut.String()) 109 } 110 }) 111 } 112 }