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