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 }