@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 CHANGED
@@ -1,9 +1,12 @@
1
- import { expect } from 'vitest';
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
- export class Checker {
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
- export const check = (value, msg) => {
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
- export const checkEvents = ({ events }, ...filters) => check(events, 'events')
164
+ exports.check = check;
165
+ const checkEvents = ({ events }, ...filters) => (0, exports.check)(events, 'events')
161
166
  .filterEvents(...filters)
162
167
  .redact();
163
- export const checkSystemEvents = ({ api }, ...filters) => check(api.query.system.events(), 'system events')
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
- export const checkUmp = ({ api }) => check(api.query.parachainSystem.upwardMessages(), 'ump').map((value) => api.createType('Vec<XcmVersionedXcm>', value).toJSON());
167
- export const checkHrmp = ({ api }) => check(api.query.parachainSystem.hrmpOutboundMessages(), 'hrmp').map((value) => value.map(({ recipient, data }) => ({
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 declare const setupContext: ({ endpoint, blockNumber, blockHash, wasmOverride, db, timeout }: SetupOption) => Promise<{
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
- import { ApiPromise, WsProvider } from '@polkadot/api';
2
- import { BuildBlockMode, setupWithServer } from '@acala-network/chopsticks';
3
- import { Keyring, createTestKeyring } from '@polkadot/keyring';
4
- import { expect } from 'vitest';
5
- export * from './check';
6
- export const setupContext = async ({ endpoint, blockNumber, blockHash, wasmOverride, db, timeout }) => {
7
- // random port
8
- const port = Math.floor(Math.random() * 10000) + 10000;
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
- const { chain, listenPort, close } = await setupWithServer(config);
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
- export const expectJson = (codec) => {
67
- return expect(toJson(codec));
125
+ const expectJson = (codec) => {
126
+ return (0, vitest_1.expect)(toJson(codec));
68
127
  };
69
- export const expectHex = (codec) => {
70
- return expect(toHex(codec));
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
- export const matchEvents = async (events, ...filters) => {
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
- export const matchSystemEvents = async ({ api }, ...filters) => {
92
- await _matchEvents('system events', redact(api.query.system.events()), ...filters);
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
- export const redact = async (data) => {
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
- export function defer() {
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
- export const sendTransaction = async (tx) => {
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
- export const testingPairs = (keyringType = 'ed25519', ss58Format) => {
156
- const keyringEth = createTestKeyring({ type: 'ethereum' });
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.0",
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.0"
11
+ "@acala-network/chopsticks": "0.7.2"
12
12
  },
13
13
  "peerDependencies": {
14
14
  "vitest": "^0.33.0"