mirror of https://github.com/status-im/js-waku.git
Migrate to jest for better debugging experience
ava is not yet integrated in popular IDEs.
This commit is contained in:
parent
33a6176181
commit
5c29394937
|
@ -0,0 +1,9 @@
|
|||
const {defaults} = require('jest-config');
|
||||
module.exports = {
|
||||
testEnvironment: 'node',
|
||||
moduleFileExtensions: [...defaults.moduleFileExtensions, 'd.ts'],
|
||||
testTimeout: 10_000,
|
||||
roots: [
|
||||
'<rootDir>/build/main' // testing javascript output due to type issues with protobuf. TODO: try out ts-proto
|
||||
]
|
||||
};
|
File diff suppressed because it is too large
Load Diff
25
package.json
25
package.json
|
@ -23,13 +23,13 @@
|
|||
"test:lint": "eslint src --ext .ts",
|
||||
"test:prettier": "prettier \"src/**/*.ts\" --list-different",
|
||||
"test:spelling": "cspell \"{README.md,.github/*.md,src/**/*.ts}\"",
|
||||
"test:unit": "nyc --silent ava",
|
||||
"test:unit": "nyc --silent jest",
|
||||
"test:lint-proto": "buf lint",
|
||||
"check-cli": "run-s test diff-integration-tests check-integration-tests",
|
||||
"check-integration-tests": "run-s check-integration-test:*",
|
||||
"diff-integration-tests": "mkdir -p diff && rm -rf diff/test && cp -r test diff/test && rm -rf diff/test/test-*/.git && cd diff && git init --quiet && git add -A && git commit --quiet --no-verify --allow-empty -m 'WIP' && echo '\\n\\nCommitted most recent integration test output in the \"diff\" directory. Review the changes with \"cd diff && git diff HEAD\" or your preferred git diff viewer.'",
|
||||
"watch:build": "tsc -p tsconfig.json -w",
|
||||
"watch:test": "nyc --silent ava --watch",
|
||||
"watch:test": "nyc --silent jest --watch",
|
||||
"cov": "run-s build test:unit cov:html cov:lcov && open-cli coverage/index.html",
|
||||
"cov:html": "nyc report --reporter=html",
|
||||
"cov:lcov": "nyc report --reporter=lcov",
|
||||
|
@ -60,17 +60,16 @@
|
|||
"yarg": "^1.0.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@ava/typescript": "^1.1.1",
|
||||
"@istanbuljs/nyc-config-typescript": "^1.0.1",
|
||||
"@types/app-root-path": "^1.2.4",
|
||||
"@types/axios": "^0.14.0",
|
||||
"@types/google-protobuf": "^3.7.4",
|
||||
"@types/jest": "^26.0.20",
|
||||
"@types/node": "^14.14.31",
|
||||
"@types/tail": "^2.0.0",
|
||||
"@typescript-eslint/eslint-plugin": "^4.0.1",
|
||||
"@typescript-eslint/parser": "^4.0.1",
|
||||
"app-root-path": "^3.0.0",
|
||||
"ava": "^3.15.0",
|
||||
"ava-fast-check": "^4.0.2",
|
||||
"axios": "^0.21.1",
|
||||
"codecov": "^3.5.0",
|
||||
"cspell": "^4.1.0",
|
||||
|
@ -80,9 +79,11 @@
|
|||
"eslint-plugin-eslint-comments": "^3.2.0",
|
||||
"eslint-plugin-functional": "^3.0.2",
|
||||
"eslint-plugin-import": "^2.22.0",
|
||||
"fast-check": "^2.13.0",
|
||||
"fast-check": "^2.14.0",
|
||||
"gh-pages": "^3.1.0",
|
||||
"grpc_tools_node_protoc_ts": "^5.1.3",
|
||||
"jest": "^26.6.3",
|
||||
"jest-fast-check": "^1.0.2",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"nyc": "^15.1.0",
|
||||
"open-cli": "^6.0.1",
|
||||
|
@ -103,18 +104,6 @@
|
|||
"LICENSE",
|
||||
"README.md"
|
||||
],
|
||||
"ava": {
|
||||
"failFast": true,
|
||||
"timeout": "60s",
|
||||
"typescript": {
|
||||
"rewritePaths": {
|
||||
"src/": "build/main/"
|
||||
}
|
||||
},
|
||||
"files": [
|
||||
"!build/module/**"
|
||||
]
|
||||
},
|
||||
"config": {
|
||||
"commitizen": {
|
||||
"path": "cz-conventional-changelog"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import test from 'ava';
|
||||
import 'jest';
|
||||
import Libp2p from 'libp2p';
|
||||
import Pubsub from 'libp2p-interfaces/src/pubsub';
|
||||
|
||||
|
@ -8,7 +8,7 @@ import { createNode } from './node';
|
|||
import { Message } from './waku_message';
|
||||
import { CODEC, TOPIC, WakuRelay } from './waku_relay';
|
||||
|
||||
test('Publishes message', async (t) => {
|
||||
test('Publishes message', async () => {
|
||||
const message = Message.fromUtf8String('Bird bird bird, bird is the word!');
|
||||
|
||||
const [node1, node2] = await Promise.all([createNode(), createNode()]);
|
||||
|
@ -31,25 +31,25 @@ test('Publishes message', async (t) => {
|
|||
|
||||
const node1Received = await promise;
|
||||
|
||||
t.true(node1Received.isEqualTo(message));
|
||||
expect(node1Received.isEqualTo(message)).toBeTruthy();
|
||||
});
|
||||
|
||||
test('Registers waku relay protocol', async (t) => {
|
||||
test('Registers waku relay protocol', async () => {
|
||||
const node = await createNode();
|
||||
|
||||
const protocols = Array.from(node.upgrader.protocols.keys());
|
||||
|
||||
t.truthy(protocols.findIndex((value) => value == CODEC));
|
||||
expect(protocols.findIndex((value) => value == CODEC)).toBeTruthy();
|
||||
});
|
||||
|
||||
test('Does not register any sub protocol', async (t) => {
|
||||
test('Does not register any sub protocol', async () => {
|
||||
const node = await createNode();
|
||||
|
||||
const protocols = Array.from(node.upgrader.protocols.keys());
|
||||
t.truthy(protocols.findIndex((value) => value.match(/sub/)));
|
||||
expect(protocols.findIndex((value) => value.match(/sub/))).toBeTruthy();
|
||||
});
|
||||
|
||||
test('Nim-interop: nim-waku node connects to js node', async (t) => {
|
||||
test('Nim-interop: nim-waku node connects to js node', async () => {
|
||||
const node = await createNode();
|
||||
|
||||
const peerId = node.peerId.toB58String();
|
||||
|
@ -59,12 +59,12 @@ test('Nim-interop: nim-waku node connects to js node', async (t) => {
|
|||
);
|
||||
const multiAddrWithId = localMultiaddr + '/p2p/' + peerId;
|
||||
|
||||
const nimWaku = new NimWaku(t.title);
|
||||
const nimWaku = new NimWaku(expect.getState().currentTestName);
|
||||
await nimWaku.start({ staticnode: multiAddrWithId });
|
||||
|
||||
const nimPeers = await nimWaku.peers();
|
||||
|
||||
t.deepEqual(nimPeers, [
|
||||
expect(nimPeers).toEqual([
|
||||
{
|
||||
multiaddr: multiAddrWithId,
|
||||
protocol: CODEC,
|
||||
|
@ -75,10 +75,10 @@ test('Nim-interop: nim-waku node connects to js node', async (t) => {
|
|||
const nimPeerId = await nimWaku.getPeerId();
|
||||
const jsPeers = node.peerStore.peers;
|
||||
|
||||
t.true(jsPeers.has(nimPeerId.toB58String()));
|
||||
expect(jsPeers.has(nimPeerId.toB58String())).toBeTruthy();
|
||||
});
|
||||
|
||||
test('Nim-interop: js node receives default subscription from nim node', async (t) => {
|
||||
test('Nim-interop: js node receives default subscription from nim node', async () => {
|
||||
const node = await createNode();
|
||||
|
||||
const peerId = node.peerId.toB58String();
|
||||
|
@ -88,16 +88,16 @@ test('Nim-interop: js node receives default subscription from nim node', async (
|
|||
);
|
||||
const multiAddrWithId = localMultiaddr + '/p2p/' + peerId;
|
||||
|
||||
const nimWaku = new NimWaku(t.title);
|
||||
const nimWaku = new NimWaku(expect.getState().currentTestName);
|
||||
await nimWaku.start({ staticnode: multiAddrWithId });
|
||||
|
||||
const nimPeerId = await nimWaku.getPeerId();
|
||||
const subscribers = node.pubsub.getSubscribers(TOPIC);
|
||||
|
||||
t.true(subscribers.includes(nimPeerId.toB58String()));
|
||||
expect(subscribers).toContain(nimPeerId.toB58String());
|
||||
});
|
||||
|
||||
test('Nim-interop: js node sends message to nim node', async (t) => {
|
||||
test('Nim-interop: js node sends message to nim node', async () => {
|
||||
const message = Message.fromUtf8String('This is a message');
|
||||
const node = await createNode();
|
||||
const wakuRelayNode = new WakuRelay(node.pubsub);
|
||||
|
@ -113,7 +113,7 @@ test('Nim-interop: js node sends message to nim node', async (t) => {
|
|||
);
|
||||
const multiAddrWithId = localMultiaddr + '/p2p/' + peerId;
|
||||
|
||||
const nimWaku = new NimWaku(t.title);
|
||||
const nimWaku = new NimWaku(expect.getState().currentTestName);
|
||||
await nimWaku.start({ staticnode: multiAddrWithId });
|
||||
|
||||
await patchPeerStore(nimWaku, node);
|
||||
|
@ -124,14 +124,14 @@ test('Nim-interop: js node sends message to nim node', async (t) => {
|
|||
|
||||
const msgs = await nimWaku.messages();
|
||||
|
||||
t.is(msgs[0].contentTopic, message.contentTopic);
|
||||
t.is(msgs[0].version, message.version);
|
||||
expect(msgs[0].contentTopic).toEqual(message.contentTopic);
|
||||
expect(msgs[0].version).toEqual(message.version);
|
||||
|
||||
const payload = Buffer.from(msgs[0].payload);
|
||||
t.is(Buffer.compare(payload, message.payload), 0);
|
||||
expect(Buffer.compare(payload, message.payload)).toBe(0);
|
||||
});
|
||||
|
||||
test('Nim-interop: nim node sends message to js node', async (t) => {
|
||||
test('Nim-interop: nim node sends message to js node', async () => {
|
||||
const message = Message.fromUtf8String('Here is another message.');
|
||||
const node = await createNode();
|
||||
const wakuRelayNode = new WakuRelay(node.pubsub);
|
||||
|
@ -142,7 +142,7 @@ test('Nim-interop: nim node sends message to js node', async (t) => {
|
|||
);
|
||||
const multiAddrWithId = localMultiaddr + '/p2p/' + peerId;
|
||||
|
||||
const nimWaku = new NimWaku(t.title);
|
||||
const nimWaku = new NimWaku(expect.getState().currentTestName);
|
||||
await nimWaku.start({ staticnode: multiAddrWithId });
|
||||
|
||||
await patchPeerStore(nimWaku, node);
|
||||
|
@ -159,11 +159,11 @@ test('Nim-interop: nim node sends message to js node', async (t) => {
|
|||
|
||||
const receivedMsg = await receivedPromise;
|
||||
|
||||
t.is(receivedMsg.contentTopic, message.contentTopic);
|
||||
t.is(receivedMsg.version, message.version);
|
||||
expect(receivedMsg.contentTopic).toBe(message.contentTopic);
|
||||
expect(receivedMsg.version).toBe(message.version);
|
||||
|
||||
const payload = Buffer.from(receivedMsg.payload);
|
||||
t.is(Buffer.compare(payload, message.payload), 0);
|
||||
expect(Buffer.compare(payload, message.payload)).toBe(0);
|
||||
});
|
||||
|
||||
function waitForNextData(pubsub: Pubsub): Promise<Message> {
|
||||
|
|
|
@ -1,40 +1,15 @@
|
|||
import { fc, testProp } from 'ava-fast-check';
|
||||
|
||||
import { WakuMessage } from '../gen/proto/waku/v2/waku_pb';
|
||||
import { fc, testProp } from 'jest-fast-check';
|
||||
|
||||
import { Message } from './waku_message';
|
||||
|
||||
// This test is more about documenting how protobuf library works than testing it
|
||||
testProp('Protobuf round trip binary serialization', [fc.string()], (t, s) => {
|
||||
const wakuMsg = new WakuMessage();
|
||||
wakuMsg.setPayload(Buffer.from(s, 'utf-8'));
|
||||
|
||||
const binary = wakuMsg.serializeBinary();
|
||||
const actual = WakuMessage.deserializeBinary(binary);
|
||||
|
||||
const payload = actual.getPayload();
|
||||
|
||||
let buf;
|
||||
if (typeof payload === 'string') {
|
||||
buf = Buffer.from(payload, 'base64');
|
||||
} else {
|
||||
buf = Buffer.from(payload);
|
||||
}
|
||||
|
||||
t.deepEqual(s, buf.toString('utf-8'));
|
||||
});
|
||||
|
||||
testProp(
|
||||
'Waku message round trip binary serialization',
|
||||
[fc.string()],
|
||||
(t, s) => {
|
||||
[fc.fullUnicodeString()],
|
||||
(s) => {
|
||||
const msg = Message.fromUtf8String(s);
|
||||
const binary = msg.toBinary();
|
||||
const actual = Message.fromBinary(binary);
|
||||
|
||||
t.true(
|
||||
actual.isEqualTo(msg),
|
||||
`${JSON.stringify(actual)}\n${JSON.stringify(msg)}`
|
||||
);
|
||||
expect(actual.isEqualTo(msg)).toBeTruthy();
|
||||
}
|
||||
);
|
||||
|
|
|
@ -59,6 +59,7 @@ export class Message {
|
|||
// Purely for tests purposes.
|
||||
// We do consider protobuf field when checking equality
|
||||
// As the content is held by the other fields.
|
||||
// TODO: Consider using WakuMessage.equals
|
||||
isEqualTo(other: Message) {
|
||||
return (
|
||||
Buffer.compare(this.payload, other.payload) === 0 &&
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
import test from 'ava';
|
||||
|
||||
import { argsToArray, bufToHex, defaultArgs, strToHex } from './nim_waku';
|
||||
|
||||
test('Correctly serialized arguments', (t) => {
|
||||
test('Correctly serialized arguments', () => {
|
||||
const args = defaultArgs();
|
||||
Object.assign(args, { portsShift: 42 });
|
||||
|
||||
|
@ -17,18 +15,18 @@ test('Correctly serialized arguments', (t) => {
|
|||
'--ports-shift=42',
|
||||
];
|
||||
|
||||
t.deepEqual(actual, expected);
|
||||
expect(actual).toEqual(expected);
|
||||
});
|
||||
|
||||
test('Convert utf-8 string to hex', (t) => {
|
||||
test('Convert utf-8 string to hex', () => {
|
||||
const str = 'This is an utf-8 string.';
|
||||
const expected = '0x5468697320697320616e207574662d3820737472696e672e';
|
||||
|
||||
const actual = strToHex(str);
|
||||
t.deepEqual(actual, expected);
|
||||
expect(actual).toEqual(expected);
|
||||
});
|
||||
|
||||
test('Convert buffer to hex', (t) => {
|
||||
test('Convert buffer to hex', () => {
|
||||
const buf = Uint8Array.from([
|
||||
0x54,
|
||||
0x68,
|
||||
|
@ -58,5 +56,5 @@ test('Convert buffer to hex', (t) => {
|
|||
const expected = '0x5468697320697320616e207574662d3820737472696e672e';
|
||||
|
||||
const actual = bufToHex(buf);
|
||||
t.deepEqual(actual, expected);
|
||||
expect(actual).toEqual(expected);
|
||||
});
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
// "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */,
|
||||
|
||||
"lib": ["es2017"],
|
||||
"types": ["node"],
|
||||
"types": ["node", "jest"],
|
||||
"typeRoots": ["node_modules/@types", "src/types"]
|
||||
},
|
||||
"include": ["src/**/*.ts"],
|
||||
|
|
Loading…
Reference in New Issue