github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/crypto/keys/client/add_bech32_test.go (about)

     1  package client
     2  
     3  import (
     4  	"context"
     5  	"strings"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/gnolang/gno/tm2/pkg/commands"
    10  	"github.com/gnolang/gno/tm2/pkg/crypto/bip39"
    11  	"github.com/gnolang/gno/tm2/pkg/crypto/keys"
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestAdd_Bech32(t *testing.T) {
    17  	t.Parallel()
    18  
    19  	t.Run("valid bech32 addition", func(t *testing.T) {
    20  		t.Parallel()
    21  
    22  		var (
    23  			kbHome      = t.TempDir()
    24  			baseOptions = BaseOptions{
    25  				InsecurePasswordStdin: true,
    26  				Home:                  kbHome,
    27  			}
    28  
    29  			seed    = bip39.NewSeed(generateTestMnemonic(t), "")
    30  			account = generateKeyFromSeed(seed, "44'/118'/0'/0/0")
    31  
    32  			keyName = "key-name"
    33  		)
    34  
    35  		ctx, cancelFn := context.WithTimeout(context.Background(), 5*time.Second)
    36  		defer cancelFn()
    37  
    38  		io := commands.NewTestIO()
    39  		io.SetIn(strings.NewReader("test1234\ntest1234\n"))
    40  
    41  		// Create the command
    42  		cmd := NewRootCmdWithBaseConfig(io, baseOptions)
    43  
    44  		args := []string{
    45  			"add",
    46  			"bech32",
    47  			"--insecure-password-stdin",
    48  			"--home",
    49  			kbHome,
    50  			"--pubkey",
    51  			account.PubKey().String(),
    52  			keyName,
    53  		}
    54  
    55  		require.NoError(t, cmd.ParseAndRun(ctx, args))
    56  
    57  		// Check the keybase
    58  		kb, err := keys.NewKeyBaseFromDir(kbHome)
    59  		require.NoError(t, err)
    60  
    61  		original, err := kb.GetByName(keyName)
    62  		require.NoError(t, err)
    63  		require.NotNil(t, original)
    64  
    65  		assert.Equal(t, account.PubKey().Address().String(), original.GetAddress().String())
    66  	})
    67  
    68  	t.Run("valid bech32 addition, overwrite", func(t *testing.T) {
    69  		t.Parallel()
    70  
    71  		var (
    72  			kbHome      = t.TempDir()
    73  			baseOptions = BaseOptions{
    74  				InsecurePasswordStdin: true,
    75  				Home:                  kbHome,
    76  			}
    77  
    78  			seed            = bip39.NewSeed(generateTestMnemonic(t), "")
    79  			originalAccount = generateKeyFromSeed(seed, "44'/118'/0'/0/0")
    80  			copyAccount     = generateKeyFromSeed(seed, "44'/118'/0'/0/1")
    81  
    82  			keyName = "key-name"
    83  		)
    84  
    85  		ctx, cancelFn := context.WithTimeout(context.Background(), 5*time.Second)
    86  		defer cancelFn()
    87  
    88  		io := commands.NewTestIO()
    89  		io.SetIn(strings.NewReader("test1234\ntest1234\n"))
    90  
    91  		// Create the command
    92  		cmd := NewRootCmdWithBaseConfig(io, baseOptions)
    93  
    94  		baseArgs := []string{
    95  			"add",
    96  			"bech32",
    97  			"--insecure-password-stdin",
    98  			"--home",
    99  			kbHome,
   100  			keyName,
   101  		}
   102  
   103  		initialArgs := append(baseArgs, []string{
   104  			"--pubkey",
   105  			originalAccount.PubKey().String(),
   106  		}...)
   107  
   108  		require.NoError(t, cmd.ParseAndRun(ctx, initialArgs))
   109  
   110  		// Check the keybase
   111  		kb, err := keys.NewKeyBaseFromDir(kbHome)
   112  		require.NoError(t, err)
   113  
   114  		original, err := kb.GetByName(keyName)
   115  		require.NoError(t, err)
   116  
   117  		require.Equal(t, originalAccount.PubKey().Address().String(), original.GetAddress().String())
   118  
   119  		// Overwrite the key
   120  		io.SetIn(strings.NewReader("y\ntest1234\ntest1234\n"))
   121  
   122  		secondaryArgs := append(baseArgs, []string{
   123  			"--pubkey",
   124  			copyAccount.PubKey().String(),
   125  		}...)
   126  
   127  		cmd = NewRootCmdWithBaseConfig(io, baseOptions)
   128  		require.NoError(t, cmd.ParseAndRun(ctx, secondaryArgs))
   129  
   130  		newKey, err := kb.GetByName(keyName)
   131  		require.NoError(t, err)
   132  
   133  		require.Equal(t, copyAccount.PubKey().Address().String(), newKey.GetAddress().String())
   134  	})
   135  
   136  	t.Run("no overwrite permission", func(t *testing.T) {
   137  		t.Parallel()
   138  
   139  		var (
   140  			kbHome      = t.TempDir()
   141  			baseOptions = BaseOptions{
   142  				InsecurePasswordStdin: true,
   143  				Home:                  kbHome,
   144  			}
   145  
   146  			seed            = bip39.NewSeed(generateTestMnemonic(t), "")
   147  			originalAccount = generateKeyFromSeed(seed, "44'/118'/0'/0/0")
   148  			copyAccount     = generateKeyFromSeed(seed, "44'/118'/0'/0/1")
   149  
   150  			keyName = "key-name"
   151  		)
   152  
   153  		ctx, cancelFn := context.WithTimeout(context.Background(), 5*time.Second)
   154  		defer cancelFn()
   155  
   156  		io := commands.NewTestIO()
   157  		io.SetIn(strings.NewReader("test1234\ntest1234\n"))
   158  
   159  		// Create the command
   160  		cmd := NewRootCmdWithBaseConfig(io, baseOptions)
   161  
   162  		baseArgs := []string{
   163  			"add",
   164  			"bech32",
   165  			"--insecure-password-stdin",
   166  			"--home",
   167  			kbHome,
   168  			keyName,
   169  		}
   170  
   171  		initialArgs := append(baseArgs, []string{
   172  			"--pubkey",
   173  			originalAccount.PubKey().String(),
   174  		}...)
   175  
   176  		require.NoError(t, cmd.ParseAndRun(ctx, initialArgs))
   177  
   178  		// Check the keybase
   179  		kb, err := keys.NewKeyBaseFromDir(kbHome)
   180  		require.NoError(t, err)
   181  
   182  		original, err := kb.GetByName(keyName)
   183  		require.NoError(t, err)
   184  
   185  		io.SetIn(strings.NewReader("n\ntest1234\ntest1234\n"))
   186  
   187  		// Confirm overwrite
   188  		secondaryArgs := append(baseArgs, []string{
   189  			"--pubkey",
   190  			copyAccount.PubKey().String(),
   191  		}...)
   192  
   193  		cmd = NewRootCmdWithBaseConfig(io, baseOptions)
   194  		require.ErrorIs(t, cmd.ParseAndRun(ctx, secondaryArgs), errOverwriteAborted)
   195  
   196  		newKey, err := kb.GetByName(keyName)
   197  		require.NoError(t, err)
   198  
   199  		// Make sure the key is not overwritten
   200  		assert.Equal(t, original.GetAddress(), newKey.GetAddress())
   201  	})
   202  }