github.com/cosmos/cosmos-sdk@v0.50.10/x/group/types_test.go (about)

     1  package group_test
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/stretchr/testify/require"
     8  
     9  	"github.com/cosmos/cosmos-sdk/x/group"
    10  )
    11  
    12  func TestThresholdDecisionPolicyValidate(t *testing.T) {
    13  	g := group.GroupInfo{
    14  		TotalWeight: "10",
    15  	}
    16  	config := group.DefaultConfig()
    17  	testCases := []struct {
    18  		name   string
    19  		policy group.ThresholdDecisionPolicy
    20  		expErr bool
    21  	}{
    22  		{
    23  			"min exec period too big",
    24  			group.ThresholdDecisionPolicy{
    25  				Threshold: "5",
    26  				Windows: &group.DecisionPolicyWindows{
    27  					VotingPeriod:       time.Second,
    28  					MinExecutionPeriod: time.Hour * 24 * 30,
    29  				},
    30  			},
    31  			true,
    32  		},
    33  		{
    34  			"all good",
    35  			group.ThresholdDecisionPolicy{
    36  				Threshold: "5",
    37  				Windows: &group.DecisionPolicyWindows{
    38  					VotingPeriod:       time.Hour,
    39  					MinExecutionPeriod: time.Hour * 24,
    40  				},
    41  			},
    42  			false,
    43  		},
    44  	}
    45  	for _, tc := range testCases {
    46  		t.Run(tc.name, func(t *testing.T) {
    47  			err := tc.policy.Validate(g, config)
    48  			if tc.expErr {
    49  				require.Error(t, err)
    50  			} else {
    51  				require.NoError(t, err)
    52  			}
    53  		})
    54  	}
    55  }
    56  
    57  func TestPercentageDecisionPolicyValidate(t *testing.T) {
    58  	g := group.GroupInfo{}
    59  	config := group.DefaultConfig()
    60  	testCases := []struct {
    61  		name   string
    62  		policy group.PercentageDecisionPolicy
    63  		expErr bool
    64  	}{
    65  		{
    66  			"min exec period too big",
    67  			group.PercentageDecisionPolicy{
    68  				Percentage: "0.5",
    69  				Windows: &group.DecisionPolicyWindows{
    70  					VotingPeriod:       time.Second,
    71  					MinExecutionPeriod: time.Hour * 24 * 30,
    72  				},
    73  			},
    74  			true,
    75  		},
    76  		{
    77  			"all good",
    78  			group.PercentageDecisionPolicy{
    79  				Percentage: "0.5",
    80  				Windows: &group.DecisionPolicyWindows{
    81  					VotingPeriod:       time.Hour,
    82  					MinExecutionPeriod: time.Hour * 24,
    83  				},
    84  			},
    85  			false,
    86  		},
    87  	}
    88  	for _, tc := range testCases {
    89  		t.Run(tc.name, func(t *testing.T) {
    90  			err := tc.policy.Validate(g, config)
    91  			if tc.expErr {
    92  				require.Error(t, err)
    93  			} else {
    94  				require.NoError(t, err)
    95  			}
    96  		})
    97  	}
    98  }
    99  
   100  func TestPercentageDecisionPolicyAllow(t *testing.T) {
   101  	testCases := []struct {
   102  		name           string
   103  		policy         *group.PercentageDecisionPolicy
   104  		tally          *group.TallyResult
   105  		totalPower     string
   106  		votingDuration time.Duration
   107  		result         group.DecisionPolicyResult
   108  		expErr         bool
   109  	}{
   110  		{
   111  			"YesCount percentage > decision policy percentage",
   112  			&group.PercentageDecisionPolicy{
   113  				Percentage: "0.5",
   114  				Windows: &group.DecisionPolicyWindows{
   115  					VotingPeriod: time.Second * 100,
   116  				},
   117  			},
   118  			&group.TallyResult{
   119  				YesCount:        "2",
   120  				NoCount:         "0",
   121  				AbstainCount:    "0",
   122  				NoWithVetoCount: "0",
   123  			},
   124  			"3",
   125  			time.Second * 50,
   126  			group.DecisionPolicyResult{
   127  				Allow: true,
   128  				Final: true,
   129  			},
   130  			false,
   131  		},
   132  		{
   133  			"YesCount percentage == decision policy percentage",
   134  			&group.PercentageDecisionPolicy{
   135  				Percentage: "0.5",
   136  				Windows: &group.DecisionPolicyWindows{
   137  					VotingPeriod: time.Second * 100,
   138  				},
   139  			},
   140  			&group.TallyResult{
   141  				YesCount:        "2",
   142  				NoCount:         "0",
   143  				AbstainCount:    "0",
   144  				NoWithVetoCount: "0",
   145  			},
   146  			"4",
   147  			time.Second * 50,
   148  			group.DecisionPolicyResult{
   149  				Allow: true,
   150  				Final: true,
   151  			},
   152  			false,
   153  		},
   154  		{
   155  			"YesCount percentage < decision policy percentage",
   156  			&group.PercentageDecisionPolicy{
   157  				Percentage: "0.5",
   158  				Windows: &group.DecisionPolicyWindows{
   159  					VotingPeriod: time.Second * 100,
   160  				},
   161  			},
   162  			&group.TallyResult{
   163  				YesCount:        "1",
   164  				NoCount:         "0",
   165  				AbstainCount:    "0",
   166  				NoWithVetoCount: "0",
   167  			},
   168  			"3",
   169  			time.Second * 50,
   170  			group.DecisionPolicyResult{
   171  				Allow: false,
   172  				Final: false,
   173  			},
   174  			false,
   175  		},
   176  		{
   177  			"sum percentage (YesCount + undecided votes percentage) < decision policy percentage",
   178  			&group.PercentageDecisionPolicy{
   179  				Percentage: "0.5",
   180  				Windows: &group.DecisionPolicyWindows{
   181  					VotingPeriod: time.Second * 100,
   182  				},
   183  			},
   184  			&group.TallyResult{
   185  				YesCount:        "1",
   186  				NoCount:         "2",
   187  				AbstainCount:    "0",
   188  				NoWithVetoCount: "0",
   189  			},
   190  			"3",
   191  			time.Second * 50,
   192  			group.DecisionPolicyResult{
   193  				Allow: false,
   194  				Final: true,
   195  			},
   196  			false,
   197  		},
   198  		{
   199  			"sum percentage = decision policy percentage",
   200  			&group.PercentageDecisionPolicy{
   201  				Percentage: "0.5",
   202  				Windows: &group.DecisionPolicyWindows{
   203  					VotingPeriod: time.Second * 100,
   204  				},
   205  			},
   206  			&group.TallyResult{
   207  				YesCount:        "1",
   208  				NoCount:         "2",
   209  				AbstainCount:    "0",
   210  				NoWithVetoCount: "0",
   211  			},
   212  			"4",
   213  			time.Second * 50,
   214  			group.DecisionPolicyResult{
   215  				Allow: false,
   216  				Final: false,
   217  			},
   218  			false,
   219  		},
   220  		{
   221  			"sum percentage > decision policy percentage",
   222  			&group.PercentageDecisionPolicy{
   223  				Percentage: "0.5",
   224  				Windows: &group.DecisionPolicyWindows{
   225  					VotingPeriod: time.Second * 100,
   226  				},
   227  			},
   228  			&group.TallyResult{
   229  				YesCount:        "1",
   230  				NoCount:         "0",
   231  				AbstainCount:    "0",
   232  				NoWithVetoCount: "0",
   233  			},
   234  			"3",
   235  			time.Second * 50,
   236  			group.DecisionPolicyResult{
   237  				Allow: false,
   238  				Final: false,
   239  			},
   240  			false,
   241  		},
   242  	}
   243  	for _, tc := range testCases {
   244  		t.Run(tc.name, func(t *testing.T) {
   245  			policyResult, err := tc.policy.Allow(*tc.tally, tc.totalPower)
   246  			if tc.expErr {
   247  				require.Error(t, err)
   248  			} else {
   249  				require.NoError(t, err)
   250  				require.Equal(t, tc.result, policyResult)
   251  			}
   252  		})
   253  	}
   254  }
   255  
   256  func TestThresholdDecisionPolicyAllow(t *testing.T) {
   257  	testCases := []struct {
   258  		name           string
   259  		policy         *group.ThresholdDecisionPolicy
   260  		tally          *group.TallyResult
   261  		totalPower     string
   262  		votingDuration time.Duration
   263  		result         group.DecisionPolicyResult
   264  		expErr         bool
   265  	}{
   266  		{
   267  			"YesCount >= threshold decision policy",
   268  			&group.ThresholdDecisionPolicy{
   269  				Threshold: "2",
   270  				Windows: &group.DecisionPolicyWindows{
   271  					VotingPeriod: time.Second * 100,
   272  				},
   273  			},
   274  			&group.TallyResult{
   275  				YesCount:        "2",
   276  				NoCount:         "0",
   277  				AbstainCount:    "0",
   278  				NoWithVetoCount: "0",
   279  			},
   280  			"3",
   281  			time.Second * 50,
   282  			group.DecisionPolicyResult{
   283  				Allow: true,
   284  				Final: true,
   285  			},
   286  			false,
   287  		},
   288  		{
   289  			"YesCount < threshold decision policy",
   290  			&group.ThresholdDecisionPolicy{
   291  				Threshold: "2",
   292  				Windows: &group.DecisionPolicyWindows{
   293  					VotingPeriod: time.Second * 100,
   294  				},
   295  			},
   296  			&group.TallyResult{
   297  				YesCount:        "1",
   298  				NoCount:         "0",
   299  				AbstainCount:    "0",
   300  				NoWithVetoCount: "0",
   301  			},
   302  			"3",
   303  			time.Second * 50,
   304  			group.DecisionPolicyResult{
   305  				Allow: false,
   306  				Final: false,
   307  			},
   308  			false,
   309  		},
   310  		{
   311  			"YesCount == group total weight < threshold",
   312  			&group.ThresholdDecisionPolicy{
   313  				Threshold: "20",
   314  				Windows: &group.DecisionPolicyWindows{
   315  					VotingPeriod: time.Second * 100,
   316  				},
   317  			},
   318  			&group.TallyResult{
   319  				YesCount:        "3",
   320  				NoCount:         "0",
   321  				AbstainCount:    "0",
   322  				NoWithVetoCount: "0",
   323  			},
   324  			"3",
   325  			time.Second * 50,
   326  			group.DecisionPolicyResult{
   327  				Allow: true,
   328  				Final: true,
   329  			},
   330  			false,
   331  		},
   332  		{
   333  			"maxYesCount < threshold decision policy",
   334  			&group.ThresholdDecisionPolicy{
   335  				Threshold: "2",
   336  				Windows: &group.DecisionPolicyWindows{
   337  					VotingPeriod: time.Second * 100,
   338  				},
   339  			},
   340  			&group.TallyResult{
   341  				YesCount:        "0",
   342  				NoCount:         "1",
   343  				AbstainCount:    "1",
   344  				NoWithVetoCount: "0",
   345  			},
   346  			"3",
   347  			time.Second * 50,
   348  			group.DecisionPolicyResult{
   349  				Allow: false,
   350  				Final: true,
   351  			},
   352  			false,
   353  		},
   354  		{
   355  			"maxYesCount >= threshold decision policy",
   356  			&group.ThresholdDecisionPolicy{
   357  				Threshold: "2",
   358  				Windows: &group.DecisionPolicyWindows{
   359  					VotingPeriod: time.Second * 100,
   360  				},
   361  			},
   362  			&group.TallyResult{
   363  				YesCount:        "0",
   364  				NoCount:         "1",
   365  				AbstainCount:    "0",
   366  				NoWithVetoCount: "0",
   367  			},
   368  			"3",
   369  			time.Second * 50,
   370  			group.DecisionPolicyResult{
   371  				Allow: false,
   372  				Final: false,
   373  			},
   374  			false,
   375  		},
   376  	}
   377  	for _, tc := range testCases {
   378  		t.Run(tc.name, func(t *testing.T) {
   379  			policyResult, err := tc.policy.Allow(*tc.tally, tc.totalPower)
   380  			if tc.expErr {
   381  				require.Error(t, err)
   382  			} else {
   383  				require.NoError(t, err)
   384  				require.Equal(t, tc.result, policyResult)
   385  			}
   386  		})
   387  	}
   388  }