github.com/KiraCore/sekai@v0.3.43/x/gov/keeper/network_actor_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	simapp "github.com/KiraCore/sekai/app"
     7  	"github.com/KiraCore/sekai/x/gov/types"
     8  	tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
     9  	sdk "github.com/cosmos/cosmos-sdk/types"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestNewKeeper_SaveNetworkActor(t *testing.T) {
    14  	app := simapp.Setup(false)
    15  	ctx := app.NewContext(false, tmproto.Header{})
    16  
    17  	addrs := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction))
    18  	addr := addrs[0]
    19  
    20  	networkActor := types.NetworkActor{
    21  		Address: addr,
    22  	}
    23  
    24  	app.CustomGovKeeper.SaveNetworkActor(ctx, networkActor)
    25  
    26  	savedActor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, networkActor.Address)
    27  	require.True(t, found)
    28  
    29  	require.Equal(t, networkActor, savedActor)
    30  }
    31  
    32  func TestKeeper_GetNetworkActorByAddress_FailsIfItDoesNotExist(t *testing.T) {
    33  	app := simapp.Setup(false)
    34  	ctx := app.NewContext(false, tmproto.Header{})
    35  
    36  	addrs := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction))
    37  	addr := addrs[0]
    38  
    39  	_, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr)
    40  	require.False(t, found)
    41  }
    42  
    43  func TestKeeper_AssignRoleToAddress(t *testing.T) {
    44  	app := simapp.Setup(false)
    45  	ctx := app.NewContext(false, tmproto.Header{})
    46  
    47  	addrs := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction))
    48  	addr := addrs[0]
    49  
    50  	actor := types.NewDefaultActor(addr)
    51  	app.CustomGovKeeper.AssignRoleToActor(ctx, actor, types.RoleSudo)
    52  
    53  	savedActor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr)
    54  	require.True(t, found)
    55  	require.True(t, savedActor.HasRole(types.RoleSudo))
    56  }
    57  
    58  func TestKeeper_AddPermissionToNetworkActor(t *testing.T) {
    59  	app := simapp.Setup(false)
    60  	ctx := app.NewContext(false, tmproto.Header{})
    61  
    62  	addrs := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction))
    63  	addr := addrs[0]
    64  
    65  	networkActor := types.NewNetworkActor(
    66  		addr,
    67  		nil,
    68  		1,
    69  		nil,
    70  		types.NewPermissions(nil, nil),
    71  		1,
    72  	)
    73  
    74  	app.CustomGovKeeper.SaveNetworkActor(ctx, networkActor)
    75  
    76  	// We check he does not have permissions
    77  	savedNetworkActor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr)
    78  	require.True(t, found)
    79  	require.False(t, savedNetworkActor.Permissions.IsWhitelisted(types.PermSetPermissions))
    80  
    81  	// We add permissions and we save it again.
    82  	err := app.CustomGovKeeper.AddWhitelistPermission(ctx, savedNetworkActor, types.PermSetPermissions)
    83  	require.NoError(t, err)
    84  
    85  	// And we check that now it has permissions
    86  	savedNetworkActor, found = app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr)
    87  	require.True(t, found)
    88  	require.True(t, savedNetworkActor.Permissions.IsWhitelisted(types.PermSetPermissions))
    89  
    90  	_, found = app.CustomGovKeeper.GetCouncilor(ctx, addr)
    91  	require.False(t, found)
    92  
    93  	// check gov claim permission
    94  	err = app.CustomGovKeeper.AddWhitelistPermission(ctx, savedNetworkActor, types.PermClaimCouncilor)
    95  	require.NoError(t, err)
    96  	savedNetworkActor, found = app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr)
    97  	require.True(t, found)
    98  	require.True(t, savedNetworkActor.Permissions.IsWhitelisted(types.PermClaimCouncilor))
    99  
   100  	councilor, found := app.CustomGovKeeper.GetCouncilor(ctx, addr)
   101  	require.True(t, found)
   102  	require.Equal(t, councilor.Status, types.CouncilorWaiting)
   103  }
   104  
   105  func TestKeeper_RemoveWhitelistPermission(t *testing.T) {
   106  	app := simapp.Setup(false)
   107  	ctx := app.NewContext(false, tmproto.Header{})
   108  
   109  	addrs := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction))
   110  
   111  	err := whitelistPermToMultipleAddrs(app, ctx, addrs, types.PermSetPermissions)
   112  	require.NoError(t, err)
   113  
   114  	iterator := app.CustomGovKeeper.GetNetworkActorsByWhitelistedPermission(ctx, types.PermSetPermissions)
   115  	requireIteratorCount(t, iterator, 2)
   116  	assertAddrsHaveWhitelistedPerm(t, app, ctx, addrs, types.PermSetPermissions)
   117  
   118  	actor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addrs[0])
   119  	require.True(t, found)
   120  	err = app.CustomGovKeeper.RemoveWhitelistedPermission(ctx, actor, types.PermSetPermissions)
   121  	require.NoError(t, err)
   122  
   123  	iterator = app.CustomGovKeeper.GetNetworkActorsByWhitelistedPermission(ctx, types.PermSetPermissions)
   124  	requireIteratorCount(t, iterator, 1)
   125  
   126  	assertAddrsDontHaveWhitelistedPerm(t, app, ctx, []sdk.AccAddress{addrs[0]}, types.PermSetPermissions)
   127  	assertAddrsHaveWhitelistedPerm(t, app, ctx, []sdk.AccAddress{addrs[1]}, types.PermSetPermissions)
   128  }
   129  
   130  func TestAssignRoleToAccount(t *testing.T) {
   131  	app := simapp.Setup(false)
   132  	ctx := app.NewContext(false, tmproto.Header{})
   133  
   134  	addrs := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction))
   135  	addr := addrs[0]
   136  
   137  	networkActor := types.NewNetworkActor(
   138  		addr,
   139  		nil,
   140  		1,
   141  		nil,
   142  		types.NewPermissions(nil, nil),
   143  		1,
   144  	)
   145  
   146  	app.CustomGovKeeper.SaveNetworkActor(ctx, networkActor)
   147  
   148  	// check sudo role assign
   149  	err := app.CustomGovKeeper.AssignRoleToAccount(ctx, addr, types.RoleSudo)
   150  	require.NoError(t, err)
   151  	savedNetworkActor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr)
   152  	require.True(t, found)
   153  	require.True(t, savedNetworkActor.HasRole(types.RoleSudo))
   154  
   155  	councilor, found := app.CustomGovKeeper.GetCouncilor(ctx, addr)
   156  	require.True(t, found)
   157  	require.Equal(t, councilor.Status, types.CouncilorWaiting)
   158  }
   159  
   160  func TestKeeper_GetActorsByRole(t *testing.T) {
   161  	app := simapp.Setup(false)
   162  	ctx := app.NewContext(false, tmproto.Header{})
   163  
   164  	addrs := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction))
   165  
   166  	addRoleToMultipleAddrs(app, ctx, addrs, types.RoleSudo)
   167  
   168  	iterator := app.CustomGovKeeper.GetNetworkActorsByRole(ctx, types.RoleSudo)
   169  	requireIteratorCount(t, iterator, 2)
   170  
   171  	assertAddrsHaveRole(t, app, ctx, addrs, types.RoleSudo)
   172  }
   173  
   174  func TestKeeper_UnassignRole(t *testing.T) {
   175  	app := simapp.Setup(false)
   176  	ctx := app.NewContext(false, tmproto.Header{})
   177  
   178  	addrs := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction))
   179  
   180  	addRoleToMultipleAddrs(app, ctx, addrs, types.RoleSudo)
   181  
   182  	iterator := app.CustomGovKeeper.GetNetworkActorsByRole(ctx, types.RoleSudo)
   183  	requireIteratorCount(t, iterator, 2)
   184  
   185  	assertAddrsHaveRole(t, app, ctx, addrs, types.RoleSudo)
   186  
   187  	actor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addrs[0])
   188  	require.True(t, found)
   189  	require.True(t, actor.HasRole(types.RoleSudo))
   190  
   191  	app.CustomGovKeeper.UnassignRoleFromActor(ctx, actor, types.RoleSudo)
   192  
   193  	actor, found = app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addrs[0])
   194  	require.True(t, found)
   195  	require.False(t, actor.HasRole(types.RoleSudo))
   196  
   197  	iterator = app.CustomGovKeeper.GetNetworkActorsByRole(ctx, types.RoleSudo)
   198  	requireIteratorCount(t, iterator, 1)
   199  
   200  }
   201  
   202  func TestKeeper_GetActorsByWhitelistedPerm(t *testing.T) {
   203  	app := simapp.Setup(false)
   204  	ctx := app.NewContext(false, tmproto.Header{})
   205  
   206  	addrs := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction))
   207  
   208  	err := whitelistPermToMultipleAddrs(app, ctx, addrs, types.PermSetPermissions)
   209  	require.NoError(t, err)
   210  
   211  	iterator := app.CustomGovKeeper.GetNetworkActorsByWhitelistedPermission(ctx, types.PermSetPermissions)
   212  	requireIteratorCount(t, iterator, 2)
   213  
   214  	assertAddrsHaveWhitelistedPerm(t, app, ctx, addrs, types.PermSetPermissions)
   215  }
   216  
   217  func TestKeeper_GetNetworkActorsByAbsoluteWhitelistPermission(t *testing.T) {
   218  	tests := []struct {
   219  		name       string
   220  		prepareApp func(app *simapp.SekaiApp, ctx sdk.Context) []types.NetworkActor
   221  	}{
   222  		{
   223  			name: "some addresses whitelisted",
   224  			prepareApp: func(app *simapp.SekaiApp, ctx sdk.Context) []types.NetworkActor {
   225  				addrs := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction))
   226  
   227  				err := whitelistPermToMultipleAddrs(app, ctx, addrs, types.PermSetPermissions)
   228  				require.NoError(t, err)
   229  
   230  				expectedActors := []types.NetworkActor{
   231  					types.NewDefaultActor(addrs[0]),
   232  					types.NewDefaultActor(addrs[1]),
   233  				}
   234  
   235  				return expectedActors
   236  			},
   237  		},
   238  		{
   239  			name: "some addresses whitelisted by role",
   240  			prepareApp: func(app *simapp.SekaiApp, ctx sdk.Context) []types.NetworkActor {
   241  				addrs := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction))
   242  
   243  				// Create role
   244  				app.CustomGovKeeper.SetRole(ctx, types.Role{
   245  					Id:          12345,
   246  					Sid:         "12345",
   247  					Description: "12345",
   248  				})
   249  				err := app.CustomGovKeeper.WhitelistRolePermission(ctx, 12345, types.PermSetPermissions)
   250  				require.NoError(t, err)
   251  
   252  				for _, addr := range addrs {
   253  					actor := types.NewDefaultActor(addr)
   254  					app.CustomGovKeeper.AssignRoleToActor(ctx, actor, 12345)
   255  				}
   256  
   257  				expectedActors := []types.NetworkActor{
   258  					types.NewDefaultActor(addrs[0]),
   259  					types.NewDefaultActor(addrs[1]),
   260  				}
   261  
   262  				return expectedActors
   263  			},
   264  		},
   265  		{
   266  			name: "whitelisted address whitelisted by role and personal permission (case 1)",
   267  			prepareApp: func(app *simapp.SekaiApp, ctx sdk.Context) []types.NetworkActor {
   268  				addrs := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction))
   269  
   270  				// Create role
   271  				app.CustomGovKeeper.SetRole(ctx, types.Role{
   272  					Id:          12345,
   273  					Sid:         "12345",
   274  					Description: "12345",
   275  				})
   276  				err := app.CustomGovKeeper.WhitelistRolePermission(ctx, 12345, types.PermSetPermissions)
   277  				require.NoError(t, err)
   278  
   279  				// We whitelist all by the role.
   280  				for _, addr := range addrs {
   281  					actor := types.NewDefaultActor(addr)
   282  					app.CustomGovKeeper.AssignRoleToActor(ctx, actor, 12345)
   283  				}
   284  
   285  				err = app.CustomGovKeeper.AddWhitelistPermission(ctx, types.NewDefaultActor(addrs[0]), types.PermSetPermissions)
   286  				require.NoError(t, err)
   287  
   288  				expectedActors := []types.NetworkActor{
   289  					types.NewDefaultActor(addrs[0]),
   290  					types.NewDefaultActor(addrs[1]),
   291  				}
   292  
   293  				return expectedActors
   294  			},
   295  		},
   296  		{
   297  			name: "whitelisted address whitelisted by role and personal permission (case 2)",
   298  			prepareApp: func(app *simapp.SekaiApp, ctx sdk.Context) []types.NetworkActor {
   299  				addrs := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction))
   300  
   301  				// Create role
   302  				app.CustomGovKeeper.SetRole(ctx, types.Role{
   303  					Id:          12345,
   304  					Sid:         "12345",
   305  					Description: "12345",
   306  				})
   307  				err := app.CustomGovKeeper.WhitelistRolePermission(ctx, 12345, types.PermSetPermissions)
   308  				require.NoError(t, err)
   309  
   310  				// We assign role to first actor.
   311  				actor := types.NewDefaultActor(addrs[0])
   312  				app.CustomGovKeeper.AssignRoleToActor(ctx, actor, 12345)
   313  
   314  				err = whitelistPermToMultipleAddrs(app, ctx, addrs, types.PermSetPermissions)
   315  				require.NoError(t, err)
   316  
   317  				expectedActors := []types.NetworkActor{
   318  					types.NewDefaultActor(addrs[0]),
   319  					types.NewDefaultActor(addrs[1]),
   320  				}
   321  
   322  				return expectedActors
   323  			},
   324  		},
   325  	}
   326  
   327  	for _, tt := range tests {
   328  		tt := tt
   329  		t.Run(tt.name, func(t *testing.T) {
   330  			app := simapp.Setup(false)
   331  			ctx := app.NewContext(false, tmproto.Header{})
   332  
   333  			expectecActors := tt.prepareApp(app, ctx)
   334  			savedPerms := app.CustomGovKeeper.GetNetworkActorsByAbsoluteWhitelistPermission(ctx, types.PermSetPermissions)
   335  
   336  			require.Equal(t, len(expectecActors), len(savedPerms))
   337  			for i, actor := range expectecActors {
   338  				require.Equal(t, actor.Address, savedPerms[i].Address)
   339  			}
   340  		})
   341  	}
   342  }
   343  
   344  func addRoleToMultipleAddrs(app *simapp.SekaiApp, ctx sdk.Context, addrs []sdk.AccAddress, role uint64) {
   345  	for _, addr := range addrs {
   346  		app.CustomGovKeeper.AssignRoleToActor(ctx, types.NewDefaultActor(addr), role)
   347  	}
   348  }
   349  
   350  func whitelistPermToMultipleAddrs(app *simapp.SekaiApp, ctx sdk.Context, addrs []sdk.AccAddress, permissions types.PermValue) error {
   351  	for _, addr := range addrs {
   352  		err := app.CustomGovKeeper.AddWhitelistPermission(ctx, types.NewDefaultActor(addr), permissions)
   353  		if err != nil {
   354  			return err
   355  		}
   356  	}
   357  
   358  	return nil
   359  }
   360  
   361  func requireIteratorCount(t *testing.T, iterator sdk.Iterator, expectedCount int) {
   362  	c := 0
   363  	for ; iterator.Valid(); iterator.Next() {
   364  		c++
   365  	}
   366  
   367  	require.Equal(t, expectedCount, c)
   368  }
   369  
   370  func assertAddrsHaveWhitelistedPerm(
   371  	t *testing.T,
   372  	app *simapp.SekaiApp,
   373  	ctx sdk.Context,
   374  	addrs []sdk.AccAddress,
   375  	perm types.PermValue,
   376  ) {
   377  	for _, addr := range addrs {
   378  		actor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr)
   379  		require.True(t, found)
   380  		require.True(t, actor.Permissions.IsWhitelisted(perm))
   381  	}
   382  }
   383  
   384  func assertAddrsHaveRole(
   385  	t *testing.T,
   386  	app *simapp.SekaiApp,
   387  	ctx sdk.Context,
   388  	addrs []sdk.AccAddress,
   389  	role uint64,
   390  ) {
   391  	for _, addr := range addrs {
   392  		actor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr)
   393  		require.True(t, found)
   394  		require.True(t, actor.HasRole(role))
   395  	}
   396  }
   397  
   398  func assertAddrsDontHaveWhitelistedPerm(
   399  	t *testing.T,
   400  	app *simapp.SekaiApp,
   401  	ctx sdk.Context,
   402  	addrs []sdk.AccAddress,
   403  	perm types.PermValue,
   404  ) {
   405  	for _, addr := range addrs {
   406  		actor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr)
   407  		require.True(t, found)
   408  		require.False(t, actor.Permissions.IsWhitelisted(perm))
   409  	}
   410  }