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  }