Skip to content

Commit 94582e8

Browse files
authored
Negative/failure governance e2e tests (#306)
* Begin refactor of governance e2e tests * Test low approval/support ref failures * Update PAH/KAH governance snaps * Create track capacity overflow test Also, refactor tests to referenda negative execution into own tree. * Reduce number of tracks being tested, upd. snaps * Test track overflow mechanism * Update AH governance snapshots * Test track overflow handling in referenda submission * Update governance snapshots * Bump biome * Fix lint in governance E2E tests * Bump block numbers * Remove unstable voting snapshots
1 parent 2de597b commit 94582e8

6 files changed

Lines changed: 1367 additions & 28 deletions

File tree

biome.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"$schema": "https://biomejs.dev/schemas/2.3.2/schema.json",
2+
"$schema": "https://biomejs.dev/schemas/2.4.5/schema.json",
33
"vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true },
44
"files": {
55
"ignoreUnknown": false,

packages/kusama/src/__snapshots__/assetHubKusama.governance.e2e.test.ts.snap

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,140 @@
11
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

3+
exports[`Kusama Asset Hub Governance > referenda tests > negative execution flows > big_spender > insufficient approval rejection > decision deposit refund after rejection (insufficient approval) - big_spender 1`] = `
4+
[
5+
{
6+
"data": {
7+
"amount": "(rounded 13000000000000)",
8+
"who": "FoQJpPyadYccjavVdTWxpxU7rUEaYhfLCPwXgkfD6Zat9QP",
9+
},
10+
"method": "DecisionDepositRefunded",
11+
"section": "referenda",
12+
},
13+
]
14+
`;
15+
16+
exports[`Kusama Asset Hub Governance > referenda tests > negative execution flows > big_spender > insufficient support rejection > decision deposit refund after rejection (insufficient support) - big_spender 1`] = `
17+
[
18+
{
19+
"data": {
20+
"amount": "(rounded 13000000000000)",
21+
"who": "FoQJpPyadYccjavVdTWxpxU7rUEaYhfLCPwXgkfD6Zat9QP",
22+
},
23+
"method": "DecisionDepositRefunded",
24+
"section": "referenda",
25+
},
26+
]
27+
`;
28+
29+
exports[`Kusama Asset Hub Governance > referenda tests > negative execution flows > big_spender > missing decision deposit timeout > timed-out referendum event (missing decision deposit) - big_spender 1`] = `
30+
{
31+
"event": {
32+
"data": [
33+
644,
34+
{
35+
"ayes": 0,
36+
"nays": 0,
37+
"support": 0,
38+
},
39+
],
40+
},
41+
"phase": {
42+
"initialization": null,
43+
},
44+
"topics": [],
45+
}
46+
`;
47+
48+
exports[`Kusama Asset Hub Governance > referenda tests > negative execution flows > referendum_killer > insufficient approval rejection > decision deposit refund after rejection (insufficient approval) - referendum_killer 1`] = `
49+
[
50+
{
51+
"data": {
52+
"amount": "(rounded 1700000000000000)",
53+
"who": "FoQJpPyadYccjavVdTWxpxU7rUEaYhfLCPwXgkfD6Zat9QP",
54+
},
55+
"method": "DecisionDepositRefunded",
56+
"section": "referenda",
57+
},
58+
]
59+
`;
60+
61+
exports[`Kusama Asset Hub Governance > referenda tests > negative execution flows > referendum_killer > insufficient support rejection > decision deposit refund after rejection (insufficient support) - referendum_killer 1`] = `
62+
[
63+
{
64+
"data": {
65+
"amount": "(rounded 1700000000000000)",
66+
"who": "FoQJpPyadYccjavVdTWxpxU7rUEaYhfLCPwXgkfD6Zat9QP",
67+
},
68+
"method": "DecisionDepositRefunded",
69+
"section": "referenda",
70+
},
71+
]
72+
`;
73+
74+
exports[`Kusama Asset Hub Governance > referenda tests > negative execution flows > referendum_killer > missing decision deposit timeout > timed-out referendum event (missing decision deposit) - referendum_killer 1`] = `
75+
{
76+
"event": {
77+
"data": [
78+
644,
79+
{
80+
"ayes": 0,
81+
"nays": 0,
82+
"support": 0,
83+
},
84+
],
85+
},
86+
"phase": {
87+
"initialization": null,
88+
},
89+
"topics": [],
90+
}
91+
`;
92+
93+
exports[`Kusama Asset Hub Governance > referenda tests > negative execution flows > root > insufficient approval rejection > decision deposit refund after rejection (insufficient approval) - root 1`] = `
94+
[
95+
{
96+
"data": {
97+
"amount": "(rounded 3300000000000000)",
98+
"who": "FoQJpPyadYccjavVdTWxpxU7rUEaYhfLCPwXgkfD6Zat9QP",
99+
},
100+
"method": "DecisionDepositRefunded",
101+
"section": "referenda",
102+
},
103+
]
104+
`;
105+
106+
exports[`Kusama Asset Hub Governance > referenda tests > negative execution flows > root > insufficient support rejection > decision deposit refund after rejection (insufficient support) - root 1`] = `
107+
[
108+
{
109+
"data": {
110+
"amount": "(rounded 3300000000000000)",
111+
"who": "FoQJpPyadYccjavVdTWxpxU7rUEaYhfLCPwXgkfD6Zat9QP",
112+
},
113+
"method": "DecisionDepositRefunded",
114+
"section": "referenda",
115+
},
116+
]
117+
`;
118+
119+
exports[`Kusama Asset Hub Governance > referenda tests > negative execution flows > root > missing decision deposit timeout > timed-out referendum event (missing decision deposit) - root 1`] = `
120+
{
121+
"event": {
122+
"data": [
123+
644,
124+
{
125+
"ayes": 0,
126+
"nays": 0,
127+
"support": 0,
128+
},
129+
],
130+
},
131+
"phase": {
132+
"initialization": null,
133+
},
134+
"topics": [],
135+
}
136+
`;
137+
3138
exports[`Kusama Asset Hub Governance > referenda tests > referendum lifecycle test - submission, decision deposit, various voting should all work > cancelling referendum with signed origin 1`] = `
4139
[
5140
{
Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,24 @@
11
import { assetHubKusama } from '@e2e-test/networks/chains'
2-
import { baseGovernanceE2ETests, registerTestTree } from '@e2e-test/shared'
2+
import { baseGovernanceE2ETests, type GovernanceTestConfig, registerTestTree } from '@e2e-test/shared'
33

4-
registerTestTree(
5-
baseGovernanceE2ETests(assetHubKusama, {
6-
testSuiteName: 'Kusama Asset Hub Governance',
7-
}),
8-
)
4+
// Tracks selected by referendum volume (Polkassembly, all-time) + criticality.
5+
// Only one track is active: the per-track tests are identical in logic and each takes ~15 s,
6+
// so running every track is repetitive. Uncomment additional tracks as needed.
7+
const governanceConfig: GovernanceTestConfig = {
8+
testSuiteName: 'Kusama Asset Hub Governance',
9+
tracks: [
10+
// --- high-volume tracks (by referendum count) ---
11+
//{ trackId: 33, trackName: 'medium_spender', originName: 'MediumSpender' }, // 123 refs (19.2 %)
12+
{ trackId: 34, trackName: 'big_spender', originName: 'BigSpender' }, // 90 refs (14.0 %)
13+
//{ trackId: 32, trackName: 'small_spender', originName: 'SmallSpender' }, // 61 refs (9.5 %)
14+
//{ trackId: 30, trackName: 'small_tipper', originName: 'SmallTipper' }, // 46 refs (7.2 %)
15+
//{ trackId: 31, trackName: 'big_tipper', originName: 'BigTipper' }, // 19 refs (3.0 %)
16+
// --- critical tracks (low volume, high impact) ---
17+
{ trackId: 0, trackName: 'root', originName: 'Root', systemOrigin: true }, // 41 refs (6.4 %)
18+
//{ trackId: 1, trackName: 'whitelisted_caller', originName: 'WhitelistedCaller' }, // 124 refs (19.3 %)
19+
//{ trackId: 20, trackName: 'referendum_canceller', originName: 'ReferendumCanceller' }, // 12 refs (1.9 %)
20+
{ trackId: 21, trackName: 'referendum_killer', originName: 'ReferendumKiller' }, // 5 refs (0.8 %)
21+
],
22+
}
23+
24+
registerTestTree(baseGovernanceE2ETests(assetHubKusama, governanceConfig))

packages/polkadot/src/__snapshots__/assetHubPolkadot.governance.e2e.test.ts.snap

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,140 @@
11
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

3+
exports[`Polkadot Asset Hub Governance > referenda tests > negative execution flows > big_spender > insufficient approval rejection > decision deposit refund after rejection (insufficient approval) - big_spender 1`] = `
4+
[
5+
{
6+
"data": {
7+
"amount": 50000000000000,
8+
"who": "14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3",
9+
},
10+
"method": "DecisionDepositRefunded",
11+
"section": "referenda",
12+
},
13+
]
14+
`;
15+
16+
exports[`Polkadot Asset Hub Governance > referenda tests > negative execution flows > big_spender > insufficient support rejection > decision deposit refund after rejection (insufficient support) - big_spender 1`] = `
17+
[
18+
{
19+
"data": {
20+
"amount": 50000000000000,
21+
"who": "14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3",
22+
},
23+
"method": "DecisionDepositRefunded",
24+
"section": "referenda",
25+
},
26+
]
27+
`;
28+
29+
exports[`Polkadot Asset Hub Governance > referenda tests > negative execution flows > big_spender > missing decision deposit timeout > timed-out referendum event (missing decision deposit) - big_spender 1`] = `
30+
{
31+
"event": {
32+
"data": [
33+
1873,
34+
{
35+
"ayes": 0,
36+
"nays": 0,
37+
"support": 0,
38+
},
39+
],
40+
},
41+
"phase": {
42+
"initialization": null,
43+
},
44+
"topics": [],
45+
}
46+
`;
47+
48+
exports[`Polkadot Asset Hub Governance > referenda tests > negative execution flows > referendum_killer > insufficient approval rejection > decision deposit refund after rejection (insufficient approval) - referendum_killer 1`] = `
49+
[
50+
{
51+
"data": {
52+
"amount": 500000000000000,
53+
"who": "14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3",
54+
},
55+
"method": "DecisionDepositRefunded",
56+
"section": "referenda",
57+
},
58+
]
59+
`;
60+
61+
exports[`Polkadot Asset Hub Governance > referenda tests > negative execution flows > referendum_killer > insufficient support rejection > decision deposit refund after rejection (insufficient support) - referendum_killer 1`] = `
62+
[
63+
{
64+
"data": {
65+
"amount": 500000000000000,
66+
"who": "14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3",
67+
},
68+
"method": "DecisionDepositRefunded",
69+
"section": "referenda",
70+
},
71+
]
72+
`;
73+
74+
exports[`Polkadot Asset Hub Governance > referenda tests > negative execution flows > referendum_killer > missing decision deposit timeout > timed-out referendum event (missing decision deposit) - referendum_killer 1`] = `
75+
{
76+
"event": {
77+
"data": [
78+
1873,
79+
{
80+
"ayes": 0,
81+
"nays": 0,
82+
"support": 0,
83+
},
84+
],
85+
},
86+
"phase": {
87+
"initialization": null,
88+
},
89+
"topics": [],
90+
}
91+
`;
92+
93+
exports[`Polkadot Asset Hub Governance > referenda tests > negative execution flows > root > insufficient approval rejection > decision deposit refund after rejection (insufficient approval) - root 1`] = `
94+
[
95+
{
96+
"data": {
97+
"amount": 1000000000000000,
98+
"who": "14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3",
99+
},
100+
"method": "DecisionDepositRefunded",
101+
"section": "referenda",
102+
},
103+
]
104+
`;
105+
106+
exports[`Polkadot Asset Hub Governance > referenda tests > negative execution flows > root > insufficient support rejection > decision deposit refund after rejection (insufficient support) - root 1`] = `
107+
[
108+
{
109+
"data": {
110+
"amount": 1000000000000000,
111+
"who": "14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3",
112+
},
113+
"method": "DecisionDepositRefunded",
114+
"section": "referenda",
115+
},
116+
]
117+
`;
118+
119+
exports[`Polkadot Asset Hub Governance > referenda tests > negative execution flows > root > missing decision deposit timeout > timed-out referendum event (missing decision deposit) - root 1`] = `
120+
{
121+
"event": {
122+
"data": [
123+
1873,
124+
{
125+
"ayes": 0,
126+
"nays": 0,
127+
"support": 0,
128+
},
129+
],
130+
},
131+
"phase": {
132+
"initialization": null,
133+
},
134+
"topics": [],
135+
}
136+
`;
137+
3138
exports[`Polkadot Asset Hub Governance > referenda tests > referendum lifecycle test - submission, decision deposit, various voting should all work > cancelling referendum with signed origin 1`] = `
4139
[
5140
{
Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,24 @@
11
import { assetHubPolkadot } from '@e2e-test/networks/chains'
2-
import { baseGovernanceE2ETests, registerTestTree } from '@e2e-test/shared'
2+
import { baseGovernanceE2ETests, type GovernanceTestConfig, registerTestTree } from '@e2e-test/shared'
33

4-
registerTestTree(
5-
baseGovernanceE2ETests(assetHubPolkadot, {
6-
testSuiteName: 'Polkadot Asset Hub Governance',
7-
}),
8-
)
4+
// Tracks selected by referendum volume (Polkassembly, all-time) + criticality.
5+
// Only one track is active: the per-track tests are identical in logic and each takes ~15 s,
6+
// so running every track is repetitive. Uncomment additional tracks as needed.
7+
const governanceConfig: GovernanceTestConfig = {
8+
testSuiteName: 'Polkadot Asset Hub Governance',
9+
tracks: [
10+
// --- high-volume tracks (by referendum count) ---
11+
//{ trackId: 33, trackName: 'medium_spender', originName: 'MediumSpender' }, // 609 refs (32.7 %)
12+
//{ trackId: 32, trackName: 'small_spender', originName: 'SmallSpender' }, // 275 refs (14.8 %)
13+
//{ trackId: 30, trackName: 'small_tipper', originName: 'SmallTipper' }, // 235 refs (12.6 %)
14+
{ trackId: 34, trackName: 'big_spender', originName: 'BigSpender' }, // 173 refs (9.3 %)
15+
//{ trackId: 31, trackName: 'big_tipper', originName: 'BigTipper' }, // 153 refs (8.2 %)
16+
// --- critical tracks (low volume, high impact) ---
17+
{ trackId: 0, trackName: 'root', originName: 'Root', systemOrigin: true }, // 59 refs (3.2 %)
18+
//{ trackId: 1, trackName: 'whitelisted_caller', originName: 'WhitelistedCaller' }, // 106 refs (5.7 %)
19+
//{ trackId: 20, trackName: 'referendum_canceller', originName: 'ReferendumCanceller' }, // 27 refs (1.4 %)
20+
{ trackId: 21, trackName: 'referendum_killer', originName: 'ReferendumKiller' }, // 6 refs (0.3 %)
21+
],
22+
}
23+
24+
registerTestTree(baseGovernanceE2ETests(assetHubPolkadot, governanceConfig))

0 commit comments

Comments
 (0)