github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/smartcontract/manifest/container_test.go (about)

     1  package manifest
     2  
     3  import (
     4  	"encoding/json"
     5  	"testing"
     6  
     7  	"github.com/nspcc-dev/neo-go/internal/random"
     8  	"github.com/nspcc-dev/neo-go/internal/testserdes"
     9  	"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestContainer_Restrict(t *testing.T) {
    14  	t.Run("string", func(t *testing.T) {
    15  		c := new(WildStrings)
    16  		require.True(t, c.IsWildcard())
    17  		require.True(t, c.Contains("abc"))
    18  		c.Restrict()
    19  		require.False(t, c.IsWildcard())
    20  		require.False(t, c.Contains("abc"))
    21  		require.Equal(t, 0, len(c.Value))
    22  	})
    23  
    24  	t.Run("PermissionDesc", func(t *testing.T) {
    25  		check := func(t *testing.T, u PermissionDesc) {
    26  			c := new(WildPermissionDescs)
    27  			require.True(t, c.IsWildcard())
    28  			require.True(t, c.Contains(u))
    29  			c.Restrict()
    30  			require.False(t, c.IsWildcard())
    31  			require.False(t, c.Contains(u))
    32  			require.Equal(t, 0, len(c.Value))
    33  		}
    34  		t.Run("Hash", func(t *testing.T) {
    35  			check(t, PermissionDesc{
    36  				Type:  PermissionHash,
    37  				Value: random.Uint160(),
    38  			})
    39  		})
    40  		t.Run("Group", func(t *testing.T) {
    41  			pk, err := keys.NewPrivateKey()
    42  			require.NoError(t, err)
    43  			check(t, PermissionDesc{
    44  				Type:  PermissionGroup,
    45  				Value: pk.PublicKey(),
    46  			})
    47  		})
    48  	})
    49  }
    50  
    51  func TestContainer_Add(t *testing.T) {
    52  	t.Run("string", func(t *testing.T) {
    53  		c := new(WildStrings)
    54  		require.Equal(t, []string(nil), c.Value)
    55  
    56  		c.Add("abc")
    57  		require.True(t, c.Contains("abc"))
    58  		require.False(t, c.Contains("aaa"))
    59  	})
    60  
    61  	t.Run("uint160", func(t *testing.T) {
    62  		c := new(WildPermissionDescs)
    63  		require.Equal(t, []PermissionDesc(nil), c.Value)
    64  		pk, err := keys.NewPrivateKey()
    65  		require.NoError(t, err)
    66  		exp := []PermissionDesc{
    67  			{Type: PermissionHash, Value: random.Uint160()},
    68  			{Type: PermissionGroup, Value: pk.PublicKey()},
    69  		}
    70  		for i := range exp {
    71  			c.Add(exp[i])
    72  		}
    73  		for i := range exp {
    74  			require.True(t, c.Contains(exp[i]))
    75  		}
    76  		pkRand, err := keys.NewPrivateKey()
    77  		require.NoError(t, err)
    78  		require.False(t, c.Contains(PermissionDesc{Type: PermissionHash, Value: random.Uint160()}))
    79  		require.False(t, c.Contains(PermissionDesc{Type: PermissionGroup, Value: pkRand.PublicKey()}))
    80  	})
    81  }
    82  
    83  func TestContainer_MarshalJSON(t *testing.T) {
    84  	t.Run("string", func(t *testing.T) {
    85  		t.Run("wildcard", func(t *testing.T) {
    86  			expected := new(WildStrings)
    87  			testserdes.MarshalUnmarshalJSON(t, expected, new(WildStrings))
    88  		})
    89  
    90  		t.Run("empty", func(t *testing.T) {
    91  			expected := new(WildStrings)
    92  			expected.Restrict()
    93  			testserdes.MarshalUnmarshalJSON(t, expected, new(WildStrings))
    94  		})
    95  
    96  		t.Run("non-empty", func(t *testing.T) {
    97  			expected := new(WildStrings)
    98  			expected.Add("string1")
    99  			expected.Add("string2")
   100  			testserdes.MarshalUnmarshalJSON(t, expected, new(WildStrings))
   101  		})
   102  
   103  		t.Run("invalid", func(t *testing.T) {
   104  			js := []byte(`[123]`)
   105  			c := new(WildStrings)
   106  			require.Error(t, json.Unmarshal(js, c))
   107  		})
   108  	})
   109  
   110  	t.Run("PermissionDesc", func(t *testing.T) {
   111  		t.Run("wildcard", func(t *testing.T) {
   112  			expected := new(WildPermissionDescs)
   113  			testserdes.MarshalUnmarshalJSON(t, expected, new(WildPermissionDescs))
   114  		})
   115  
   116  		t.Run("empty", func(t *testing.T) {
   117  			expected := new(WildPermissionDescs)
   118  			expected.Restrict()
   119  			testserdes.MarshalUnmarshalJSON(t, expected, new(WildPermissionDescs))
   120  		})
   121  
   122  		t.Run("non-empty", func(t *testing.T) {
   123  			expected := new(WildPermissionDescs)
   124  			expected.Add(PermissionDesc{
   125  				Type:  PermissionHash,
   126  				Value: random.Uint160(),
   127  			})
   128  			testserdes.MarshalUnmarshalJSON(t, expected, new(WildPermissionDescs))
   129  		})
   130  
   131  		t.Run("invalid", func(t *testing.T) {
   132  			js := []byte(`["notahex"]`)
   133  			c := new(WildPermissionDescs)
   134  			require.Error(t, json.Unmarshal(js, c))
   135  		})
   136  	})
   137  }