@acala-network/chopsticks-testing 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/check.js +17 -8
- package/lib/index.d.ts +42 -1
- package/lib/index.js +95 -28
- package/package.json +2 -2
package/lib/check.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkHrmp = exports.checkUmp = exports.checkSystemEvents = exports.checkEvents = exports.check = exports.Checker = void 0;
|
|
4
|
+
const vitest_1 = require("vitest");
|
|
2
5
|
const processCodecOrArray = (codec, fn) => Array.isArray(codec) ? codec.map(fn) : fn(codec);
|
|
3
6
|
const toHuman = (codec) => processCodecOrArray(codec, (c) => c?.toHuman?.() ?? c);
|
|
4
7
|
const toHex = (codec) => processCodecOrArray(codec, (c) => c?.toHex?.() ?? c);
|
|
5
8
|
const toJson = (codec) => processCodecOrArray(codec, (c) => c?.toJSON?.() ?? c);
|
|
6
|
-
|
|
9
|
+
class Checker {
|
|
7
10
|
#value;
|
|
8
11
|
#pipeline = [];
|
|
9
12
|
#format = 'json';
|
|
@@ -145,10 +148,11 @@ export class Checker {
|
|
|
145
148
|
return value;
|
|
146
149
|
}
|
|
147
150
|
async toMatchSnapshot(msg) {
|
|
148
|
-
return expect(await this.value()).toMatchSnapshot(msg ?? this.#message);
|
|
151
|
+
return (0, vitest_1.expect)(await this.value()).toMatchSnapshot(msg ?? this.#message);
|
|
149
152
|
}
|
|
150
153
|
}
|
|
151
|
-
|
|
154
|
+
exports.Checker = Checker;
|
|
155
|
+
const check = (value, msg) => {
|
|
152
156
|
if (value instanceof Checker) {
|
|
153
157
|
if (msg) {
|
|
154
158
|
return value.message(msg);
|
|
@@ -157,14 +161,19 @@ export const check = (value, msg) => {
|
|
|
157
161
|
}
|
|
158
162
|
return new Checker(value, msg);
|
|
159
163
|
};
|
|
160
|
-
|
|
164
|
+
exports.check = check;
|
|
165
|
+
const checkEvents = ({ events }, ...filters) => (0, exports.check)(events, 'events')
|
|
161
166
|
.filterEvents(...filters)
|
|
162
167
|
.redact();
|
|
163
|
-
|
|
168
|
+
exports.checkEvents = checkEvents;
|
|
169
|
+
const checkSystemEvents = ({ api }, ...filters) => (0, exports.check)(api.query.system.events(), 'system events')
|
|
164
170
|
.filterEvents(...filters)
|
|
165
171
|
.redact();
|
|
166
|
-
|
|
167
|
-
|
|
172
|
+
exports.checkSystemEvents = checkSystemEvents;
|
|
173
|
+
const checkUmp = ({ api }) => (0, exports.check)(api.query.parachainSystem.upwardMessages(), 'ump').map((value) => api.createType('Vec<XcmVersionedXcm>', value).toJSON());
|
|
174
|
+
exports.checkUmp = checkUmp;
|
|
175
|
+
const checkHrmp = ({ api }) => (0, exports.check)(api.query.parachainSystem.hrmpOutboundMessages(), 'hrmp').map((value) => value.map(({ recipient, data }) => ({
|
|
168
176
|
data: api.createType('(XcmpMessageFormat, XcmVersionedXcm)', data),
|
|
169
177
|
recipient,
|
|
170
178
|
})));
|
|
179
|
+
exports.checkHrmp = checkHrmp;
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ApiPromise, WsProvider } from '@polkadot/api';
|
|
2
2
|
import { Codec } from '@polkadot/types/types';
|
|
3
|
+
import { Config } from '@acala-network/chopsticks/schema';
|
|
3
4
|
import { HexString } from '@polkadot/util/types';
|
|
4
5
|
import { Keyring } from '@polkadot/keyring';
|
|
5
6
|
import { StorageValues } from '@acala-network/chopsticks/utils/set-storage';
|
|
@@ -12,8 +13,13 @@ export type SetupOption = {
|
|
|
12
13
|
wasmOverride?: string;
|
|
13
14
|
db?: string;
|
|
14
15
|
timeout?: number;
|
|
16
|
+
port?: number;
|
|
15
17
|
};
|
|
16
|
-
export
|
|
18
|
+
export type SetupConfig = Config & {
|
|
19
|
+
timeout?: number;
|
|
20
|
+
};
|
|
21
|
+
export declare const createConfig: ({ endpoint, blockNumber, blockHash, wasmOverride, db, timeout, port, }: SetupOption) => SetupConfig;
|
|
22
|
+
export declare const setupContext: (option: SetupOption) => Promise<{
|
|
17
23
|
url: string;
|
|
18
24
|
chain: import("@acala-network/chopsticks").Blockchain;
|
|
19
25
|
ws: WsProvider;
|
|
@@ -30,6 +36,41 @@ export declare const setupContext: ({ endpoint, blockNumber, blockHash, wasmOver
|
|
|
30
36
|
teardown(): Promise<void>;
|
|
31
37
|
pause(): Promise<unknown>;
|
|
32
38
|
}>;
|
|
39
|
+
export declare const setupContextWithConfig: ({ timeout, ...config }: SetupConfig) => Promise<{
|
|
40
|
+
url: string;
|
|
41
|
+
chain: import("@acala-network/chopsticks").Blockchain;
|
|
42
|
+
ws: WsProvider;
|
|
43
|
+
api: ApiPromise;
|
|
44
|
+
dev: {
|
|
45
|
+
newBlock: (param?: {
|
|
46
|
+
count?: number;
|
|
47
|
+
to?: number;
|
|
48
|
+
}) => Promise<string>;
|
|
49
|
+
setStorage: (values: StorageValues, blockHash?: string) => Promise<any>;
|
|
50
|
+
timeTravel: (date: string | number) => Promise<number>;
|
|
51
|
+
setHead: (hashOrNumber: string | number) => Promise<any>;
|
|
52
|
+
};
|
|
53
|
+
teardown(): Promise<void>;
|
|
54
|
+
pause(): Promise<unknown>;
|
|
55
|
+
}>;
|
|
56
|
+
export type NetworkContext = Awaited<ReturnType<typeof setupContext>>;
|
|
57
|
+
export declare const setupNetworks: (networkOptions: Partial<Record<string, Config | string | undefined>>) => Promise<Record<string, {
|
|
58
|
+
url: string;
|
|
59
|
+
chain: import("@acala-network/chopsticks").Blockchain;
|
|
60
|
+
ws: WsProvider;
|
|
61
|
+
api: ApiPromise;
|
|
62
|
+
dev: {
|
|
63
|
+
newBlock: (param?: {
|
|
64
|
+
count?: number;
|
|
65
|
+
to?: number;
|
|
66
|
+
}) => Promise<string>;
|
|
67
|
+
setStorage: (values: StorageValues, blockHash?: string) => Promise<any>;
|
|
68
|
+
timeTravel: (date: string | number) => Promise<number>;
|
|
69
|
+
setHead: (hashOrNumber: string | number) => Promise<any>;
|
|
70
|
+
};
|
|
71
|
+
teardown(): Promise<void>;
|
|
72
|
+
pause(): Promise<unknown>;
|
|
73
|
+
}>>;
|
|
33
74
|
type CodecOrArray = Codec | Codec[];
|
|
34
75
|
export declare const expectJson: (codec: CodecOrArray) => import("@vitest/expect").Assertion<any>;
|
|
35
76
|
export declare const expectHex: (codec: CodecOrArray) => import("@vitest/expect").Assertion<any>;
|
package/lib/index.js
CHANGED
|
@@ -1,24 +1,50 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.testingPairs = exports.sendTransaction = exports.defer = exports.redact = exports.matchSystemEvents = exports.matchEvents = exports.expectHex = exports.expectJson = exports.setupNetworks = exports.setupContextWithConfig = exports.setupContext = exports.createConfig = void 0;
|
|
18
|
+
const api_1 = require("@polkadot/api");
|
|
19
|
+
const chopsticks_1 = require("@acala-network/chopsticks");
|
|
20
|
+
const keyring_1 = require("@polkadot/keyring");
|
|
21
|
+
const vitest_1 = require("vitest");
|
|
22
|
+
__exportStar(require("./check"), exports);
|
|
23
|
+
const createConfig = ({ endpoint, blockNumber, blockHash, wasmOverride, db, timeout, port, }) => {
|
|
24
|
+
// random port if not specified
|
|
25
|
+
port = port ?? Math.floor(Math.random() * 10000) + 10000;
|
|
9
26
|
const config = {
|
|
10
27
|
endpoint,
|
|
11
28
|
port,
|
|
12
29
|
block: blockNumber || blockHash,
|
|
13
30
|
mockSignatureHost: true,
|
|
14
|
-
'build-block-mode': BuildBlockMode.Manual,
|
|
31
|
+
'build-block-mode': chopsticks_1.BuildBlockMode.Manual,
|
|
15
32
|
db,
|
|
16
33
|
'wasm-override': wasmOverride,
|
|
34
|
+
timeout,
|
|
17
35
|
};
|
|
18
|
-
|
|
36
|
+
return config;
|
|
37
|
+
};
|
|
38
|
+
exports.createConfig = createConfig;
|
|
39
|
+
const setupContext = async (option) => {
|
|
40
|
+
return (0, exports.setupContextWithConfig)((0, exports.createConfig)(option));
|
|
41
|
+
};
|
|
42
|
+
exports.setupContext = setupContext;
|
|
43
|
+
const setupContextWithConfig = async ({ timeout, ...config }) => {
|
|
44
|
+
const { chain, listenPort, close } = await (0, chopsticks_1.setupWithServer)(config);
|
|
19
45
|
const url = `ws://localhost:${listenPort}`;
|
|
20
|
-
const ws = new WsProvider(url, undefined, undefined, timeout);
|
|
21
|
-
const api = await ApiPromise.create({
|
|
46
|
+
const ws = new api_1.WsProvider(url, undefined, undefined, timeout);
|
|
47
|
+
const api = await api_1.ApiPromise.create({
|
|
22
48
|
provider: ws,
|
|
23
49
|
signedExtensions: {
|
|
24
50
|
SetEvmOrigin: {
|
|
@@ -52,23 +78,58 @@ export const setupContext = async ({ endpoint, blockNumber, blockHash, wasmOverr
|
|
|
52
78
|
await close();
|
|
53
79
|
},
|
|
54
80
|
async pause() {
|
|
55
|
-
await ws.send('dev_setBlockBuildMode', [BuildBlockMode.Instant]);
|
|
81
|
+
await ws.send('dev_setBlockBuildMode', [chopsticks_1.BuildBlockMode.Instant]);
|
|
56
82
|
// log a bit later to ensure the message is visible
|
|
57
83
|
setTimeout(() => console.log(`Test paused. Polkadot.js apps URL: https://polkadot.js.org/apps/?rpc=${url}`), 100);
|
|
58
84
|
return new Promise((_resolve) => { }); // wait forever
|
|
59
85
|
},
|
|
60
86
|
};
|
|
61
87
|
};
|
|
88
|
+
exports.setupContextWithConfig = setupContextWithConfig;
|
|
89
|
+
const setupNetworks = async (networkOptions) => {
|
|
90
|
+
const ret = {};
|
|
91
|
+
let wasmOverriden = false;
|
|
92
|
+
for (const [name, options] of Object.entries(networkOptions)) {
|
|
93
|
+
const config = typeof options === 'string' ? await (0, chopsticks_1.fetchConfig)(options) : options ?? (await (0, chopsticks_1.fetchConfig)(name));
|
|
94
|
+
ret[name] = await (0, exports.setupContextWithConfig)(config);
|
|
95
|
+
wasmOverriden ||= config['wasm-override'] != null;
|
|
96
|
+
}
|
|
97
|
+
const relaychainName = Object.keys(ret).filter((x) => ['polkadot', 'kusama'].includes(x.toLocaleLowerCase()))[0];
|
|
98
|
+
const { [relaychainName]: relaychain, ...parachains } = ret;
|
|
99
|
+
if (relaychain) {
|
|
100
|
+
for (const parachain of Object.values(parachains)) {
|
|
101
|
+
await (0, chopsticks_1.connectVertical)(relaychain.chain, parachain.chain);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const parachainList = Object.values(parachains).map((i) => i.chain);
|
|
105
|
+
if (parachainList.length > 0) {
|
|
106
|
+
await (0, chopsticks_1.connectParachains)(parachainList);
|
|
107
|
+
}
|
|
108
|
+
if (wasmOverriden) {
|
|
109
|
+
// trigger runtime upgrade if needed (due to wasm override)
|
|
110
|
+
for (const chain of Object.values(ret)) {
|
|
111
|
+
await chain.dev.newBlock();
|
|
112
|
+
}
|
|
113
|
+
// handle xcm version message if needed (due to wasm override triggered xcm version upgrade)
|
|
114
|
+
for (const chain of Object.values(ret)) {
|
|
115
|
+
await chain.dev.newBlock();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return ret;
|
|
119
|
+
};
|
|
120
|
+
exports.setupNetworks = setupNetworks;
|
|
62
121
|
const processCodecOrArray = (codec, fn) => Array.isArray(codec) ? codec.map(fn) : fn(codec);
|
|
63
122
|
const toHuman = (codec) => processCodecOrArray(codec, (c) => c?.toHuman?.() ?? c);
|
|
64
123
|
const toJson = (codec) => processCodecOrArray(codec, (c) => c?.toJSON?.() ?? c);
|
|
65
124
|
const toHex = (codec) => processCodecOrArray(codec, (c) => c?.toHex?.() ?? c);
|
|
66
|
-
|
|
67
|
-
return expect(toJson(codec));
|
|
125
|
+
const expectJson = (codec) => {
|
|
126
|
+
return (0, vitest_1.expect)(toJson(codec));
|
|
68
127
|
};
|
|
69
|
-
|
|
70
|
-
|
|
128
|
+
exports.expectJson = expectJson;
|
|
129
|
+
const expectHex = (codec) => {
|
|
130
|
+
return (0, vitest_1.expect)(toHex(codec));
|
|
71
131
|
};
|
|
132
|
+
exports.expectHex = expectHex;
|
|
72
133
|
const _matchEvents = async (msg, events, ...filters) => {
|
|
73
134
|
let data = toHuman(await events).map(({ event: { index: _, ...event } }) => event);
|
|
74
135
|
if (filters.length > 0) {
|
|
@@ -83,15 +144,17 @@ const _matchEvents = async (msg, events, ...filters) => {
|
|
|
83
144
|
});
|
|
84
145
|
});
|
|
85
146
|
}
|
|
86
|
-
return expect(data).toMatchSnapshot(msg);
|
|
147
|
+
return (0, vitest_1.expect)(data).toMatchSnapshot(msg);
|
|
87
148
|
};
|
|
88
|
-
|
|
89
|
-
return _matchEvents('events', redact(events), ...filters);
|
|
149
|
+
const matchEvents = async (events, ...filters) => {
|
|
150
|
+
return _matchEvents('events', (0, exports.redact)(events), ...filters);
|
|
90
151
|
};
|
|
91
|
-
|
|
92
|
-
|
|
152
|
+
exports.matchEvents = matchEvents;
|
|
153
|
+
const matchSystemEvents = async ({ api }, ...filters) => {
|
|
154
|
+
await _matchEvents('system events', (0, exports.redact)(api.query.system.events()), ...filters);
|
|
93
155
|
};
|
|
94
|
-
|
|
156
|
+
exports.matchSystemEvents = matchSystemEvents;
|
|
157
|
+
const redact = async (data) => {
|
|
95
158
|
const json = toHuman(await data);
|
|
96
159
|
const process = (obj) => {
|
|
97
160
|
if (obj == null) {
|
|
@@ -128,7 +191,8 @@ export const redact = async (data) => {
|
|
|
128
191
|
};
|
|
129
192
|
return process(json);
|
|
130
193
|
};
|
|
131
|
-
|
|
194
|
+
exports.redact = redact;
|
|
195
|
+
function defer() {
|
|
132
196
|
const deferred = {};
|
|
133
197
|
deferred.promise = new Promise((resolve, reject) => {
|
|
134
198
|
deferred.resolve = resolve;
|
|
@@ -136,7 +200,8 @@ export function defer() {
|
|
|
136
200
|
});
|
|
137
201
|
return deferred;
|
|
138
202
|
}
|
|
139
|
-
|
|
203
|
+
exports.defer = defer;
|
|
204
|
+
const sendTransaction = async (tx) => {
|
|
140
205
|
const signed = await tx;
|
|
141
206
|
const deferred = defer();
|
|
142
207
|
await signed.send((status) => {
|
|
@@ -152,10 +217,11 @@ export const sendTransaction = async (tx) => {
|
|
|
152
217
|
events: deferred.promise,
|
|
153
218
|
};
|
|
154
219
|
};
|
|
155
|
-
|
|
156
|
-
|
|
220
|
+
exports.sendTransaction = sendTransaction;
|
|
221
|
+
const testingPairs = (keyringType = 'ed25519', ss58Format) => {
|
|
222
|
+
const keyringEth = (0, keyring_1.createTestKeyring)({ type: 'ethereum' });
|
|
157
223
|
// default to ed25519 because sr25519 signature is non-deterministic
|
|
158
|
-
const keyring = new Keyring({ type: keyringType, ss58Format });
|
|
224
|
+
const keyring = new keyring_1.Keyring({ type: keyringType, ss58Format });
|
|
159
225
|
return {
|
|
160
226
|
alice: keyring.addFromUri('//Alice'),
|
|
161
227
|
bob: keyring.addFromUri('//Bob'),
|
|
@@ -171,3 +237,4 @@ export const testingPairs = (keyringType = 'ed25519', ss58Format) => {
|
|
|
171
237
|
keyringEth,
|
|
172
238
|
};
|
|
173
239
|
};
|
|
240
|
+
exports.testingPairs = testingPairs;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@acala-network/chopsticks-testing",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.2",
|
|
4
4
|
"author": "Bryan Chen <xlchen1291@gmail.com>",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"scripts": {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"build": "tsc -p ./tsconfig.json"
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@acala-network/chopsticks": "0.7.
|
|
11
|
+
"@acala-network/chopsticks": "0.7.2"
|
|
12
12
|
},
|
|
13
13
|
"peerDependencies": {
|
|
14
14
|
"vitest": "^0.33.0"
|