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 }