github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/crypto/keys/client/add_multisig_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/keys"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestAdd_Multisig(t *testing.T) {
    16  	t.Parallel()
    17  
    18  	t.Run("invalid multisig threshold", func(t *testing.T) {
    19  		t.Parallel()
    20  
    21  		var (
    22  			kbHome      = t.TempDir()
    23  			baseOptions = BaseOptions{
    24  				InsecurePasswordStdin: true,
    25  				Home:                  kbHome,
    26  			}
    27  
    28  			keyName = "key-name"
    29  		)
    30  
    31  		ctx, cancelFn := context.WithTimeout(context.Background(), 5*time.Second)
    32  		defer cancelFn()
    33  
    34  		io := commands.NewTestIO()
    35  		io.SetIn(strings.NewReader("test1234\ntest1234\n"))
    36  
    37  		// Create the command
    38  		cmd := NewRootCmdWithBaseConfig(io, baseOptions)
    39  
    40  		args := []string{
    41  			"add",
    42  			"multisig",
    43  			"--insecure-password-stdin",
    44  			"--home",
    45  			kbHome,
    46  			"--multisig",
    47  			"example",
    48  			"--threshold",
    49  			"2",
    50  			keyName,
    51  		}
    52  
    53  		require.ErrorIs(t, cmd.ParseAndRun(ctx, args), errUnableToVerifyMultisig)
    54  	})
    55  
    56  	t.Run("valid multisig reference added", func(t *testing.T) {
    57  		t.Parallel()
    58  
    59  		var (
    60  			kbHome      = t.TempDir()
    61  			baseOptions = BaseOptions{
    62  				InsecurePasswordStdin: true,
    63  				Home:                  kbHome,
    64  			}
    65  			mnemonic = generateTestMnemonic(t)
    66  
    67  			keyNames = []string{
    68  				"key-1",
    69  				"key-2",
    70  			}
    71  		)
    72  
    73  		ctx, cancelFn := context.WithTimeout(context.Background(), 5*time.Second)
    74  		defer cancelFn()
    75  
    76  		io := commands.NewTestIO()
    77  		io.SetIn(strings.NewReader("y\ntest1234\ntest1234\n"))
    78  
    79  		// Create the command
    80  		cmd := NewRootCmdWithBaseConfig(io, baseOptions)
    81  
    82  		args := []string{
    83  			"add",
    84  			"multisig",
    85  			"--insecure-password-stdin",
    86  			"--home",
    87  			kbHome,
    88  			"--multisig",
    89  			keyNames[0],
    90  			"--multisig",
    91  			keyNames[1],
    92  			keyNames[0],
    93  		}
    94  
    95  		// Prepare the multisig keys
    96  		kb, err := keys.NewKeyBaseFromDir(kbHome)
    97  		require.NoError(t, err)
    98  
    99  		for index, keyName := range keyNames {
   100  			_, err = kb.CreateAccount(
   101  				keyName,
   102  				mnemonic,
   103  				"",
   104  				"123",
   105  				0,
   106  				uint32(index),
   107  			)
   108  
   109  			require.NoError(t, err)
   110  		}
   111  
   112  		require.NoError(t, cmd.ParseAndRun(ctx, args))
   113  
   114  		// Verify the key is multisig
   115  		original, err := kb.GetByName(keyNames[0])
   116  		require.NoError(t, err)
   117  		require.NotNil(t, original)
   118  
   119  		assert.Equal(t, original.GetType(), keys.TypeMulti)
   120  	})
   121  }