neo-go/pkg/core/transaction/witness_scope_test.go
Anna Shaleva 9f69522ff5 neorpc: adjust SignerWithWitness scopes parsing
Ensure that Scopes can be properly parsed not only from the string
representation, but also from a single byte. transaction.Signer
is not affected (checked against the C# implementation), only
RPC-related signer scopes are allowed to be unmarshalled from byte.

Close #3059.

Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>
2023-07-20 10:33:48 +03:00

115 lines
2.4 KiB
Go

package transaction
import (
"strconv"
"testing"
"github.com/stretchr/testify/require"
)
func TestScopesFromString(t *testing.T) {
_, err := ScopesFromString("")
require.Error(t, err)
_, err = ScopesFromString("123")
require.Error(t, err)
s, err := ScopesFromString("Global")
require.NoError(t, err)
require.Equal(t, Global, s)
s, err = ScopesFromString("CalledByEntry")
require.NoError(t, err)
require.Equal(t, CalledByEntry, s)
s, err = ScopesFromString("CustomContracts")
require.NoError(t, err)
require.Equal(t, CustomContracts, s)
s, err = ScopesFromString("CustomGroups")
require.NoError(t, err)
require.Equal(t, CustomGroups, s)
s, err = ScopesFromString("CalledByEntry,CustomGroups")
require.NoError(t, err)
require.Equal(t, CalledByEntry|CustomGroups, s)
_, err = ScopesFromString("Global,CustomGroups")
require.Error(t, err)
_, err = ScopesFromString("CalledByEntry,Global,CustomGroups")
require.Error(t, err)
s, err = ScopesFromString("CalledByEntry,CustomGroups,CustomGroups")
require.NoError(t, err)
require.Equal(t, CalledByEntry|CustomGroups, s)
s, err = ScopesFromString("CalledByEntry, CustomGroups")
require.NoError(t, err)
require.Equal(t, CalledByEntry|CustomGroups, s)
s, err = ScopesFromString("CalledByEntry, CustomGroups, CustomContracts")
require.NoError(t, err)
require.Equal(t, CalledByEntry|CustomGroups|CustomContracts, s)
}
func TestScopesFromByte(t *testing.T) {
testCases := []struct {
in byte
expected WitnessScope
shouldFail bool
}{
{
in: 0,
expected: None,
},
{
in: 1,
expected: CalledByEntry,
},
{
in: 16,
expected: CustomContracts,
},
{
in: 32,
expected: CustomGroups,
},
{
in: 64,
expected: Rules,
},
{
in: 128,
expected: Global,
},
{
in: 17,
expected: CalledByEntry | CustomContracts,
},
{
in: 48,
expected: CustomContracts | CustomGroups,
},
{
in: 128 + 1, // Global can't be combined with others.
shouldFail: true,
},
{
in: 2, // No such scope.
shouldFail: true,
},
}
for _, tc := range testCases {
t.Run(strconv.Itoa(int(tc.in)), func(t *testing.T) {
actual, err := ScopesFromByte(tc.in)
if tc.shouldFail {
require.Error(t, err, tc.in)
} else {
require.NoError(t, err, tc.in)
require.Equal(t, tc.expected, actual, tc.in)
}
})
}
}