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  }