diff --git a/packages/amino/src/encoding.spec.ts b/packages/amino/src/encoding.spec.ts index 0a056e9826..67bb4b424d 100644 --- a/packages/amino/src/encoding.spec.ts +++ b/packages/amino/src/encoding.spec.ts @@ -81,8 +81,8 @@ describe("encoding", () => { }); }); - it("works for sr25519", () => { - pending("No test data available"); + xit("works for sr25519", () => { + // No test data available }); it("works for multisig", () => { diff --git a/packages/crypto/src/libsodium.spec.ts b/packages/crypto/src/libsodium.spec.ts index 6a39039036..98b478b442 100644 --- a/packages/crypto/src/libsodium.spec.ts +++ b/packages/crypto/src/libsodium.spec.ts @@ -129,7 +129,7 @@ describe("Libsodium", () => { // 8 bytes await Argon2id.execute(password, fromHex("aabbccddeeff0011"), options) .then(() => { - fail("Argon2id with invalid salt length must not resolve"); + throw new Error("Argon2id with invalid salt length must not resolve"); }) .catch((e) => { expect(e).toMatch(/invalid salt length/); @@ -137,7 +137,7 @@ describe("Libsodium", () => { // 15 bytes await Argon2id.execute(password, fromHex("aabbccddeeff001122334455667788"), options) .then(() => { - fail("Argon2id with invalid salt length must not resolve"); + throw new Error("Argon2id with invalid salt length must not resolve"); }) .catch((e) => { expect(e).toMatch(/invalid salt length/); @@ -145,7 +145,7 @@ describe("Libsodium", () => { // 17 bytes await Argon2id.execute(password, fromHex("aabbccddeeff00112233445566778899aa"), options) .then(() => { - fail("Argon2id with invalid salt length must not resolve"); + throw new Error("Argon2id with invalid salt length must not resolve"); }) .catch((e) => { expect(e).toMatch(/invalid salt length/); @@ -157,7 +157,7 @@ describe("Libsodium", () => { options, ) .then(() => { - fail("Argon2id with invalid salt length must not resolve"); + throw new Error("Argon2id with invalid salt length must not resolve"); }) .catch((e) => { expect(e).toMatch(/invalid salt length/); @@ -235,7 +235,7 @@ describe("Libsodium", () => { const seed = fromHex("43a9c17ccbb0e767ea29ce1f10813afde5f1e0a7a504e89b4d2cc2b952b8e0"); await Ed25519.makeKeypair(seed) .then(() => { - fail("promise must not resolve"); + throw new Error("promise must not resolve"); }) .catch((error) => { expect(error.message).toContain("key of length 32 expected"); @@ -247,7 +247,7 @@ describe("Libsodium", () => { const seed = fromHex("43a9c17ccbb0e767ea29ce1f10813afde5f1e0a7a504e89b4d2cc2b952b8e0b9aa"); await Ed25519.makeKeypair(seed) .then(() => { - fail("promise must not resolve"); + throw new Error("promise must not resolve"); }) .catch((error) => { expect(error.message).toContain("key of length 32 expected"); @@ -423,7 +423,7 @@ describe("Libsodium", () => { const key = fromHex(""); await Xchacha20poly1305Ietf.encrypt(message, key, nonce) .then(() => { - fail("encryption must not succeed"); + throw new Error("encryption must not succeed"); }) .catch((error) => { expect(error).toMatch(/key, got length=0/); @@ -434,7 +434,7 @@ describe("Libsodium", () => { const key = fromHex("1324cdddc4b94e625bbabcac862c9429ba011e2184a1ccad60e7c3f6ff4916"); await Xchacha20poly1305Ietf.encrypt(message, key, nonce) .then(() => { - fail("encryption must not succeed"); + throw new Error("encryption must not succeed"); }) .catch((error) => { expect(error).toMatch(/key, got length=31/); @@ -445,7 +445,7 @@ describe("Libsodium", () => { const key = fromHex("1324cdddc4b94e625bbabcac862c9429ba011e2184a1ccad60e7c3f6ff4916d8aa"); await Xchacha20poly1305Ietf.encrypt(message, key, nonce) .then(() => { - fail("encryption must not succeed"); + throw new Error("encryption must not succeed"); }) .catch((error) => { expect(error).toMatch(/key, got length=33/); @@ -458,7 +458,7 @@ describe("Libsodium", () => { ); await Xchacha20poly1305Ietf.encrypt(message, key, nonce) .then(() => { - fail("encryption must not succeed"); + throw new Error("encryption must not succeed"); }) .catch((error) => { expect(error).toMatch(/key, got length=64/); @@ -484,7 +484,7 @@ describe("Libsodium", () => { const corruptedCiphertext = ciphertext.map((x, i) => (i === 0 ? x ^ 0x01 : x)); await Xchacha20poly1305Ietf.decrypt(corruptedCiphertext, key, nonce).then( () => { - fail("promise must not resolve"); + throw new Error("promise must not resolve"); }, (error) => { expect(error.message).toMatch(/invalid tag/i); @@ -496,7 +496,7 @@ describe("Libsodium", () => { const corruptedKey = key.map((x, i) => (i === 0 ? x ^ 0x01 : x)); await Xchacha20poly1305Ietf.decrypt(ciphertext, corruptedKey, nonce).then( () => { - fail("promise must not resolve"); + throw new Error("promise must not resolve"); }, (error) => { expect(error.message).toMatch(/invalid tag/i); @@ -508,7 +508,7 @@ describe("Libsodium", () => { const corruptedNonce = nonce.map((x, i) => (i === 0 ? x ^ 0x01 : x)); await Xchacha20poly1305Ietf.decrypt(ciphertext, key, corruptedNonce).then( () => { - fail("promise must not resolve"); + throw new Error("promise must not resolve"); }, (error) => { expect(error.message).toMatch(/invalid tag/i); diff --git a/packages/crypto/src/pbkdf2.spec.ts b/packages/crypto/src/pbkdf2.spec.ts index 74eb3d4bf0..4be9bc617d 100644 --- a/packages/crypto/src/pbkdf2.spec.ts +++ b/packages/crypto/src/pbkdf2.spec.ts @@ -123,9 +123,8 @@ describe("pbkdf2", () => { describe("pbkdf2Sha512Subtle", () => { it("works", async () => { const subtle = await getSubtle(); - if (!subtle) { - pending("Subtle is not available in this environment"); - return; + if (subtle === undefined) { + throw new Error("Subtle is not available in this environment"); } { diff --git a/packages/crypto/src/secp256k1.spec.ts b/packages/crypto/src/secp256k1.spec.ts index c6bc2cf488..6c5e2c52ab 100644 --- a/packages/crypto/src/secp256k1.spec.ts +++ b/packages/crypto/src/secp256k1.spec.ts @@ -70,14 +70,14 @@ describe("Secp256k1", () => { // too short and too long await Secp256k1.makeKeypair(fromHex("e4ade2a5232a7c6f37e7b854a774e25e6047ee7c6d63e8304ae04fa190bc17")) .then(() => { - fail("promise must be rejected"); + throw new Error("promise must be rejected"); }) .catch((error) => { expect(error.message).toContain("not a valid secp256k1 private key"); }); await Secp256k1.makeKeypair(fromHex("e4ade2a5232a7c6f37e7b854a774e25e6047ee7c6d63e8304ae04fa190bc1732aa")) .then(() => { - fail("promise must be rejected"); + throw new Error("promise must be rejected"); }) .catch((error) => { expect(error.message).toContain("not a valid secp256k1 private key"); @@ -85,7 +85,7 @@ describe("Secp256k1", () => { // value out of range (too small) await Secp256k1.makeKeypair(fromHex("0000000000000000000000000000000000000000000000000000000000000000")) .then(() => { - fail("promise must be rejected"); + throw new Error("promise must be rejected"); }) .catch((error) => { expect(error.message).toContain("not a valid secp256k1 private key"); @@ -93,14 +93,14 @@ describe("Secp256k1", () => { // value out of range (>= n) await Secp256k1.makeKeypair(fromHex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")) .then(() => { - fail("promise must be rejected"); + throw new Error("promise must be rejected"); }) .catch((error) => { expect(error.message).toContain("not a valid secp256k1 private key"); }); await Secp256k1.makeKeypair(fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141")) .then(() => { - fail("promise must be rejected"); + throw new Error("promise must be rejected"); }) .catch((error) => { expect(error.message).toContain("not a valid secp256k1 private key"); @@ -133,7 +133,7 @@ describe("Secp256k1", () => { const messageHash = new Uint8Array([]); await Secp256k1.createSignature(messageHash, keypair.privkey) .then(() => { - fail("must not resolve"); + throw new Error("must not resolve"); }) .catch((error) => { expect(error).toMatch(/message hash must not be empty/i); @@ -146,7 +146,7 @@ describe("Secp256k1", () => { const messageHash = fromHex("11223344556677889900aabbccddeeff11223344556677889900aabbccddeeff11"); await Secp256k1.createSignature(messageHash, keypair.privkey) .then(() => { - fail("must not resolve"); + throw new Error("must not resolve"); }) .catch((error) => { expect(error).toMatch(/message hash length must not exceed 32 bytes/i); @@ -202,7 +202,7 @@ describe("Secp256k1", () => { const messageHash = new Uint8Array([]); await Secp256k1.verifySignature(dummySignature, messageHash, keypair.pubkey) .then(() => { - fail("must not resolve"); + throw new Error("must not resolve"); }) .catch((error) => { expect(error).toMatch(/message hash must not be empty/i); @@ -221,7 +221,7 @@ describe("Secp256k1", () => { const messageHash = fromHex("11223344556677889900aabbccddeeff11223344556677889900aabbccddeeff11"); await Secp256k1.verifySignature(dummySignature, messageHash, keypair.privkey) .then(() => { - fail("must not resolve"); + throw new Error("must not resolve"); }) .catch((error) => { expect(error).toMatch(/message hash length must not exceed 32 bytes/i); diff --git a/packages/faucet-client/src/faucetclient.spec.ts b/packages/faucet-client/src/faucetclient.spec.ts index 6b46833737..cc5955e055 100644 --- a/packages/faucet-client/src/faucetclient.spec.ts +++ b/packages/faucet-client/src/faucetclient.spec.ts @@ -1,10 +1,6 @@ import { FaucetClient } from "./faucetclient"; -function pendingWithoutFaucet(): void { - if (!process.env.FAUCET_ENABLED) { - pending("Set FAUCET_ENABLED to enable tests that need a faucet"); - } -} +const enabled = !!globalThis.process?.env.FAUCET_ENABLED; describe("FaucetClient", () => { const faucetUrl = "http://localhost:8000"; @@ -25,24 +21,21 @@ describe("FaucetClient", () => { expect(new FaucetClient("https://localhost/")).toBeTruthy(); }); - it("can be used to credit a wallet", async () => { - pendingWithoutFaucet(); + (enabled ? it : xit)("can be used to credit a wallet", async () => { const faucet = new FaucetClient(faucetUrl); await faucet.credit(defaultAddress, primaryToken); }); - it("can be used to credit a wallet with a different token", async () => { - pendingWithoutFaucet(); + (enabled ? it : xit)("can be used to credit a wallet with a different token", async () => { const faucet = new FaucetClient(faucetUrl); await faucet.credit(defaultAddress, secondaryToken); }); - it("throws for invalid ticker", async () => { - pendingWithoutFaucet(); + (enabled ? it : xit)("throws for invalid ticker", async () => { const faucet = new FaucetClient(faucetUrl); await faucet.credit(defaultAddress, "ETH").then( () => { - fail("must not resolve"); + throw new Error("must not resolve"); }, (error) => { expect(error).toMatch(/token is not available/i); @@ -50,14 +43,13 @@ describe("FaucetClient", () => { ); }); - it("throws for invalid address", async () => { - pendingWithoutFaucet(); + (enabled ? it : xit)("throws for invalid address", async () => { const faucet = new FaucetClient(faucetUrl); for (const address of ["be5cc2cc05db2cdb4313c18306a5157291cfdcd1", "1234L"]) { await faucet.credit(address, primaryToken).then( () => { - fail("must not resolve"); + throw new Error("must not resolve"); }, (error) => { expect(error).toMatch(/address is not in the expected format for this chain/i); diff --git a/packages/faucet/src/faucet.spec.ts b/packages/faucet/src/faucet.spec.ts index 5d42883959..f0642f61e6 100644 --- a/packages/faucet/src/faucet.spec.ts +++ b/packages/faucet/src/faucet.spec.ts @@ -6,12 +6,7 @@ import { assert } from "@cosmjs/utils"; import { Faucet } from "./faucet"; import { TokenConfiguration } from "./tokenmanager"; -function pendingWithoutSimapp(): void { - if (!process.env.SIMAPP47_ENABLED && !process.env.SIMAPP50_ENABLED) { - pending("Set SIMAPP{47,50}_ENABLED to enabled Stargate node-based tests"); - return; - } -} +const enabled = !!(globalThis.process?.env.SIMAPP47_ENABLED || globalThis.process?.env.SIMAPP50_ENABLED); const defaultTokenConfig: TokenConfiguration = { bankTokens: ["ucosm", "ustake"], @@ -25,7 +20,7 @@ function makeRandomAddress(): string { const faucetMnemonic = "economy stock theory fatal elder harbor betray wasp final emotion task crumble siren bottom lizard educate guess current outdoor pair theory focus wife stone"; -describe("Faucet", () => { +(enabled ? describe : xdescribe)("Faucet", () => { const pathBuilder = makeCosmoshubPath; const apiUrl = "http://localhost:26658"; @@ -44,7 +39,6 @@ describe("Faucet", () => { describe("stargate", () => { describe("constructor", () => { it("can be constructed", async () => { - pendingWithoutSimapp(); const faucet = await Faucet.make( apiUrl, defaultAddressPrefix, @@ -60,7 +54,6 @@ describe("Faucet", () => { describe("availableTokens", () => { it("is empty when no tokens are configured", async () => { - pendingWithoutSimapp(); const faucet = await Faucet.make( apiUrl, defaultAddressPrefix, @@ -75,7 +68,6 @@ describe("Faucet", () => { }); it("is not empty with default token config", async () => { - pendingWithoutSimapp(); const faucet = await Faucet.make( apiUrl, defaultAddressPrefix, @@ -92,7 +84,6 @@ describe("Faucet", () => { describe("send", () => { it("can send bank token", async () => { - pendingWithoutSimapp(); const faucet = await Faucet.make( apiUrl, defaultAddressPrefix, @@ -126,7 +117,6 @@ describe("Faucet", () => { describe("refill", () => { it("works", async () => { - pendingWithoutSimapp(); const faucet = await Faucet.make( apiUrl, defaultAddressPrefix, @@ -155,7 +145,6 @@ describe("Faucet", () => { describe("credit", () => { it("works for fee token", async () => { - pendingWithoutSimapp(); const faucet = await Faucet.make( apiUrl, defaultAddressPrefix, @@ -180,7 +169,6 @@ describe("Faucet", () => { }); it("works for stake token", async () => { - pendingWithoutSimapp(); const faucet = await Faucet.make( apiUrl, defaultAddressPrefix, @@ -207,7 +195,6 @@ describe("Faucet", () => { describe("configuredTokens", () => { it("works", async () => { - pendingWithoutSimapp(); const faucet = await Faucet.make( apiUrl, defaultAddressPrefix, @@ -224,7 +211,6 @@ describe("Faucet", () => { describe("loadAccounts", () => { it("works", async () => { - pendingWithoutSimapp(); const faucet = await Faucet.make( apiUrl, defaultAddressPrefix, diff --git a/packages/json-rpc/src/jsonrpcclient.spec.ts b/packages/json-rpc/src/jsonrpcclient.spec.ts index 97fa364ba6..2e26238072 100644 --- a/packages/json-rpc/src/jsonrpcclient.spec.ts +++ b/packages/json-rpc/src/jsonrpcclient.spec.ts @@ -6,12 +6,6 @@ import { JsonRpcClient, SimpleMessagingConnection } from "./jsonrpcclient"; import { parseJsonRpcResponse } from "./parse"; import { JsonRpcRequest, JsonRpcResponse } from "./types"; -function pendingWithoutWorker(): void { - if (typeof Worker === "undefined") { - pending("Environment without WebWorker support detected. Marked as pending."); - } -} - function makeSimpleMessagingConnection( worker: Worker, ): SimpleMessagingConnection { @@ -34,12 +28,10 @@ function makeSimpleMessagingConnection( }; } -describe("JsonRpcClient", () => { +(typeof Worker !== "undefined" ? describe : xdescribe)("JsonRpcClient", () => { const dummyserviceKarmaUrl = "/base/dist/web/dummyservice.worker.js"; it("can be constructed with a Worker", () => { - pendingWithoutWorker(); - const worker = new Worker(dummyserviceKarmaUrl); const client = new JsonRpcClient(makeSimpleMessagingConnection(worker)); expect(client).toBeTruthy(); @@ -47,8 +39,6 @@ describe("JsonRpcClient", () => { }); it("can communicate with worker", async () => { - pendingWithoutWorker(); - const worker = new Worker(dummyserviceKarmaUrl); const client = new JsonRpcClient(makeSimpleMessagingConnection(worker)); @@ -66,8 +56,6 @@ describe("JsonRpcClient", () => { }); it("supports params as dictionary", async () => { - pendingWithoutWorker(); - const worker = new Worker(dummyserviceKarmaUrl); const client = new JsonRpcClient(makeSimpleMessagingConnection(worker)); diff --git a/packages/ledger-amino/src/ledgersigner.spec.ts b/packages/ledger-amino/src/ledgersigner.spec.ts index 6548953bc7..6b65a39255 100644 --- a/packages/ledger-amino/src/ledgersigner.spec.ts +++ b/packages/ledger-amino/src/ledgersigner.spec.ts @@ -18,14 +18,7 @@ import { sleep } from "@cosmjs/utils"; import Transport from "@ledgerhq/hw-transport"; import { LedgerSigner } from "./ledgersigner"; -import { - faucet, - ledgerEnabled, - pendingWithoutLedger, - pendingWithoutSimapp, - simapp, - simappEnabled, -} from "./testutils.spec"; +import { faucet, ledgerEnabled, simapp, simappEnabled } from "./testutils.spec"; const interactiveTimeout = 120_000; @@ -45,7 +38,7 @@ async function createTransport(): Promise { return TransportClass.create(interactiveTimeout, interactiveTimeout); } -describe("LedgerSigner", () => { +(ledgerEnabled() ? describe : xdescribe)("LedgerSigner", () => { const defaultChainId = "testing"; const defaultFee = calculateFee(100_000, "0.025ucosm"); const defaultMemo = "Some memo"; @@ -72,20 +65,15 @@ describe("LedgerSigner", () => { }); beforeEach(async () => { - if (ledgerEnabled()) { - transport = await createTransport(); - } + transport = await createTransport(); }); afterEach(async () => { - if (ledgerEnabled()) { - await transport.close(); - } + await transport.close(); }); describe("getAccount", () => { it("works", async () => { - pendingWithoutLedger(); const signer = new LedgerSigner(transport, { testModeAllowed: true, hdPaths: [makeCosmoshubPath(0), makeCosmoshubPath(1), makeCosmoshubPath(10)], @@ -122,7 +110,6 @@ describe("LedgerSigner", () => { it( "returns valid signature", async () => { - pendingWithoutLedger(); const signer = new LedgerSigner(transport, { testModeAllowed: true, hdPaths: [makeCosmoshubPath(0), makeCosmoshubPath(1), makeCosmoshubPath(10)], @@ -160,11 +147,9 @@ describe("LedgerSigner", () => { interactiveTimeout, ); - it( + (simappEnabled() ? it : xit)( "creates signature accepted by Stargate backend", async () => { - pendingWithoutLedger(); - pendingWithoutSimapp(); const signer = new LedgerSigner(transport, { testModeAllowed: true, hdPaths: [makeCosmoshubPath(0), makeCosmoshubPath(1), makeCosmoshubPath(10)], diff --git a/packages/ledger-amino/src/testutils.spec.ts b/packages/ledger-amino/src/testutils.spec.ts index 93edfcb0d1..0c9409e544 100644 --- a/packages/ledger-amino/src/testutils.spec.ts +++ b/packages/ledger-amino/src/testutils.spec.ts @@ -9,25 +9,11 @@ export const faucet = { }; export function ledgerEnabled(): boolean { - return !!process.env.LEDGER_ENABLED; -} - -export function pendingWithoutLedger(): void { - if (!ledgerEnabled()) { - pending("Set LEDGER_ENABLED to enable Ledger-based tests"); - return; - } + return !!globalThis.process?.env.LEDGER_ENABLED; } export function simappEnabled(): boolean { - return !!process.env.SIMAPP47_ENABLED || !!process.env.SIMAPP50_ENABLED; -} - -export function pendingWithoutSimapp(): void { - if (!simappEnabled()) { - pending("Set SIMAPP{47,50}_ENABLED to enable Simapp-based tests"); - return; - } + return !!(globalThis.process?.env.SIMAPP47_ENABLED || globalThis.process?.env.SIMAPP50_ENABLED); } export const simapp = { diff --git a/packages/math/src/integers.spec.ts b/packages/math/src/integers.spec.ts index c3c4db6c16..c16972545a 100644 --- a/packages/math/src/integers.spec.ts +++ b/packages/math/src/integers.spec.ts @@ -13,7 +13,7 @@ describe("Integers", () => { expect(Uint32.fromBytes([0xff, 0xff, 0xff, 0xff]).toNumber()).toEqual(4294967295); }); - it("can be constructed from Buffer", () => { + (typeof Buffer !== "undefined" ? it : xit)("can be constructed from Buffer", () => { expect(Uint32.fromBytes(Buffer.from([0, 0, 0, 0])).toNumber()).toEqual(0); expect(Uint32.fromBytes(Buffer.from([0, 0, 0, 1])).toNumber()).toEqual(1); expect(Uint32.fromBytes(Buffer.from([0, 0, 0, 42])).toNumber()).toEqual(42); diff --git a/packages/socket/src/queueingstreamingsocket.spec.ts b/packages/socket/src/queueingstreamingsocket.spec.ts index ed7b89e475..772ede0d16 100644 --- a/packages/socket/src/queueingstreamingsocket.spec.ts +++ b/packages/socket/src/queueingstreamingsocket.spec.ts @@ -1,10 +1,6 @@ import { ConnectionStatus, QueueingStreamingSocket } from "./queueingstreamingsocket"; -function pendingWithoutSocketServer(): void { - if (!process.env.SOCKETSERVER_ENABLED) { - pending("Set SOCKETSERVER_ENABLED to enable socket tests"); - } -} +const enabled = !!globalThis.process?.env.SOCKETSERVER_ENABLED; describe("QueueingStreamingSocket", () => { const socketServerUrl = "ws://localhost:4444/websocket"; @@ -14,9 +10,13 @@ describe("QueueingStreamingSocket", () => { expect(socket).toBeTruthy(); }); - describe("queueRequest", () => { - it("can queue and process requests with a connection", (done) => { - pendingWithoutSocketServer(); + (enabled ? describe : xdescribe)("queueRequest", () => { + it("can queue and process requests with a connection", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const socket = new QueueingStreamingSocket(socketServerUrl); const requests = ["request 1", "request 2", "request 3"] as const; let eventsSeen = 0; @@ -35,10 +35,16 @@ describe("QueueingStreamingSocket", () => { requests.forEach((request) => { socket.queueRequest(request); }); + + return ret; }); - it("can queue requests without a connection and process them later", (done) => { - pendingWithoutSocketServer(); + it("can queue requests without a connection and process them later", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const socket = new QueueingStreamingSocket(socketServerUrl); const requests = ["request 1", "request 2", "request 3"] as const; let eventsSeen = 0; @@ -60,12 +66,18 @@ describe("QueueingStreamingSocket", () => { expect(socket.getQueueLength()).toEqual(3); socket.connect(); }, 5_000); + + return ret; }); }); - describe("reconnect", () => { - it("does not emit a completed event when disconnected", (done) => { - pendingWithoutSocketServer(); + (enabled ? describe : xdescribe)("reconnect", () => { + it("does not emit a completed event when disconnected", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const request = "request"; const socket = new QueueingStreamingSocket(socketServerUrl); socket.events.subscribe({ @@ -84,10 +96,16 @@ describe("QueueingStreamingSocket", () => { socket.disconnect(); socket.reconnect(); socket.queueRequest(request); + + return ret; }); - it("can reconnect and process remaining queue", (done) => { - pendingWithoutSocketServer(); + it("can reconnect and process remaining queue", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const socket = new QueueingStreamingSocket(socketServerUrl); const requests = ["request 1", "request 2", "request 3"] as const; let eventsSeen = 0; @@ -110,19 +128,31 @@ describe("QueueingStreamingSocket", () => { }, }); socket.reconnect(); + + return ret; }); - it("notifies on reconnection via a callback", (done) => { - pendingWithoutSocketServer(); + it("notifies on reconnection via a callback", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const socket = new QueueingStreamingSocket(socketServerUrl, undefined, done); socket.reconnect(); + + return ret; }); }); describe("connectionStatus", () => { - it("exposes connection status", (done) => { - pendingWithoutSocketServer(); + it("exposes connection status", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const socket = new QueueingStreamingSocket(socketServerUrl); let statusChangesSeen = 0; socket.connectionStatus.updates.subscribe({ @@ -160,6 +190,8 @@ describe("QueueingStreamingSocket", () => { socket.disconnect(); }, 1000); }, 1000); + + return ret; }); }); }); diff --git a/packages/socket/src/reconnectingsocket.spec.ts b/packages/socket/src/reconnectingsocket.spec.ts index f552c2d784..b2762716a2 100644 --- a/packages/socket/src/reconnectingsocket.spec.ts +++ b/packages/socket/src/reconnectingsocket.spec.ts @@ -5,11 +5,7 @@ type Exec = (command: string, callback: (error: null | (Error & { readonly code? const getExec = async (): Promise => (await import("child_process")).exec; -function pendingWithoutSocketServer(): void { - if (!process.env.SOCKETSERVER_ENABLED) { - pending("Set SOCKETSERVER_ENABLED to enable socket tests"); - } -} +const enabled = !!globalThis.process?.env.SOCKETSERVER_ENABLED; describe("ReconnectingSocket", () => { const socketServerUrl = "ws://localhost:4444/websocket"; @@ -19,9 +15,13 @@ describe("ReconnectingSocket", () => { expect(socket).toBeTruthy(); }); - describe("connect", () => { - it("cannot connect after being connected", (done) => { - pendingWithoutSocketServer(); + (enabled ? describe : xdescribe)("connect", () => { + it("cannot connect after being connected", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const socket = new ReconnectingSocket(socketServerUrl); // Necessary otherwise the producer doesn’t start socket.events.subscribe({}); @@ -34,12 +34,18 @@ describe("ReconnectingSocket", () => { }).toThrowError(/cannot connect/i); done(); }, 1000); + + return ret; }); }); - describe("disconnect", () => { - it("ends the events stream", (done) => { - pendingWithoutSocketServer(); + (enabled ? describe : xdescribe)("disconnect", () => { + it("ends the events stream", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const socket = new ReconnectingSocket(socketServerUrl); socket.events.subscribe({ complete: done, @@ -50,10 +56,16 @@ describe("ReconnectingSocket", () => { setTimeout(() => { socket.disconnect(); }, 1000); + + return ret; }); - it("cannot connect after being disconnected", (done) => { - pendingWithoutSocketServer(); + it("cannot connect after being disconnected", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const socket = new ReconnectingSocket(socketServerUrl); // Necessary otherwise the producer doesn’t start socket.events.subscribe({}); @@ -67,10 +79,11 @@ describe("ReconnectingSocket", () => { }).toThrowError(/cannot connect/i); done(); }, 1000); + + return ret; }); it("can disconnect without waiting for open", () => { - pendingWithoutSocketServer(); const socket = new ReconnectingSocket(socketServerUrl); expect(() => { socket.connect(); @@ -79,7 +92,7 @@ describe("ReconnectingSocket", () => { }); }); - describe("reconnection", () => { + (enabled ? describe : xdescribe)("reconnection", () => { const dirPath = "../../scripts/socketserver"; const codePkillNoProcessesMatched = 1; const startServerCmd = `${dirPath}/start.sh`; @@ -94,12 +107,9 @@ describe("ReconnectingSocket", () => { const exec = await getExec(); if (exec === undefined) { - pending("Run test in an environment which supports child processes to enable socket tests"); - return; + throw new Error("Socket test was enabled in an environment without child processes!"); } - pendingWithoutSocketServer(); - exec(stopServerCmd, (stopError) => { if (stopError && stopError.code !== codePkillNoProcessesMatched) { fail(stopError); @@ -148,12 +158,9 @@ describe("ReconnectingSocket", () => { const exec = await getExec(); if (exec === undefined) { - pending("Run test in an environment which supports child processes to enable socket tests"); - return; + throw new Error("Socket test was enabled in an environment without child processes!"); } - pendingWithoutSocketServer(); - const socket = new ReconnectingSocket(socketServerUrl); const requests = ["request 1", "request 2", "request 3"] as const; let eventsSeen = 0; diff --git a/packages/socket/src/socketwrapper.spec.ts b/packages/socket/src/socketwrapper.spec.ts index 71256731de..f6877167df 100644 --- a/packages/socket/src/socketwrapper.spec.ts +++ b/packages/socket/src/socketwrapper.spec.ts @@ -1,23 +1,27 @@ import { SocketWrapper } from "./socketwrapper"; -function pendingWithoutSocketServer(): void { - if (!process.env.SOCKETSERVER_ENABLED) { - pending("Set SOCKETSERVER_ENABLED to enable socket tests"); - } -} +const enabled = !!globalThis.process?.env.SOCKETSERVER_ENABLED; -describe("SocketWrapper", () => { +(enabled ? describe : xdescribe)("SocketWrapper", () => { const socketServerUrlNonExisting = "ws://localhost:4443/websocket"; const socketServerUrl = "ws://localhost:4444/websocket"; const socketServerUrlSlow = "ws://localhost:4445/websocket"; it("can be constructed", () => { - const socket = new SocketWrapper(socketServerUrl, fail, fail); + const socket = new SocketWrapper( + socketServerUrl, + () => {}, + () => {}, + ); expect(socket).toBeTruthy(); }); - it("can connect", (done) => { - pendingWithoutSocketServer(); + it("can connect", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const socket = new SocketWrapper( socketServerUrl, @@ -34,10 +38,16 @@ describe("SocketWrapper", () => { ); expect(socket).toBeTruthy(); socket.connect(); + + return ret; }); - it("fails to connect to non-existing server", (done) => { - pendingWithoutSocketServer(); + it("fails to connect to non-existing server", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const socket = new SocketWrapper( socketServerUrlNonExisting, @@ -57,10 +67,16 @@ describe("SocketWrapper", () => { ); expect(socket).toBeTruthy(); socket.connect(); + + return ret; }); - it("fails to connect to non-existing server but timeout is not triggered", (done) => { - pendingWithoutSocketServer(); + it("fails to connect to non-existing server but timeout is not triggered", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const timeout = 1200; // ms const socket = new SocketWrapper( @@ -82,10 +98,16 @@ describe("SocketWrapper", () => { ); expect(socket).toBeTruthy(); socket.connect(); + + return ret; }); - it("can connect to slow server", (done) => { - pendingWithoutSocketServer(); + it("can connect to slow server", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const socket = new SocketWrapper( socketServerUrlSlow, @@ -102,24 +124,24 @@ describe("SocketWrapper", () => { ); expect(socket).toBeTruthy(); socket.connect(); + + return ret; }); it("times out when establishing connection takes too long", async () => { - pendingWithoutSocketServer(); - const socket = new SocketWrapper( socketServerUrlSlow, () => { - fail("Got unexpected message event"); + throw new Error("Got unexpected message event"); }, (error) => { - fail(error.message || "Unknown socket error"); + throw new Error(error.message || "Unknown socket error"); }, () => { - fail("Got unexpected opened event"); + throw new Error("Got unexpected opened event"); }, () => { - fail("Got unexpected closed event"); + throw new Error("Got unexpected closed event"); }, 2_000, ); @@ -127,15 +149,19 @@ describe("SocketWrapper", () => { await socket.connected .then(() => { - fail("must not resolve"); + throw new Error("must not resolve"); }) .catch((error) => { expect(error).toMatch(/connection attempt timed out/i); }); }); - it("can connect and disconnect", (done) => { - pendingWithoutSocketServer(); + it("can connect and disconnect", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); let opened = 0; @@ -160,10 +186,16 @@ describe("SocketWrapper", () => { }, ); socket.connect(); + + return ret; }); - it("can disconnect before waiting for open", (done) => { - pendingWithoutSocketServer(); + it("can disconnect before waiting for open", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const socket = new SocketWrapper( socketServerUrl, @@ -184,10 +216,16 @@ describe("SocketWrapper", () => { ); socket.connect(); socket.disconnect(); + + return ret; }); - it("can disconnect before waiting for open and timeout will not be triggered", (done) => { - pendingWithoutSocketServer(); + it("can disconnect before waiting for open and timeout will not be triggered", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const timeout = 500; // ms const socket = new SocketWrapper( @@ -212,10 +250,16 @@ describe("SocketWrapper", () => { ); socket.connect(); socket.disconnect(); + + return ret; }); - it("can send events when connected", (done) => { - pendingWithoutSocketServer(); + it("can send events when connected", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const responseMessages = new Array(); @@ -243,10 +287,16 @@ describe("SocketWrapper", () => { }, ); socket.connect(); + + return ret; }); - it("can send events after timeout period", (done) => { - pendingWithoutSocketServer(); + it("can send events after timeout period", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); // The "timeout period" is the period in which a timeout could potentially be triggered @@ -271,10 +321,16 @@ describe("SocketWrapper", () => { socket.connect(); setTimeout(() => socket.send("Hello world"), 2 * timeoutPeriodLength); + + return ret; }); - it("cannot send on a disconnect socket (it will never come back)", (done) => { - pendingWithoutSocketServer(); + it("cannot send on a disconnect socket (it will never come back)", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const socket = new SocketWrapper( socketServerUrl, @@ -300,5 +356,7 @@ describe("SocketWrapper", () => { }, ); socket.connect(); + + return ret; }); }); diff --git a/packages/socket/src/streamingsocket.spec.ts b/packages/socket/src/streamingsocket.spec.ts index ef06fb49cb..0560ad24ed 100644 --- a/packages/socket/src/streamingsocket.spec.ts +++ b/packages/socket/src/streamingsocket.spec.ts @@ -2,17 +2,9 @@ import { toListPromise } from "@cosmjs/stream"; import { StreamingSocket } from "./streamingsocket"; -function skipTests(): boolean { - return !process.env.SOCKETSERVER_ENABLED; -} +const enabled = !!globalThis.process?.env.SOCKETSERVER_ENABLED; -function pendingWithoutSocketServer(): void { - if (skipTests()) { - pending("Set SOCKETSERVER_ENABLED to enable socket tests"); - } -} - -describe("StreamingSocket", () => { +(enabled ? describe : xdescribe)("StreamingSocket", () => { const socketServerUrl = "ws://localhost:4444/websocket"; const socketServerUrlSlow = "ws://localhost:4445/websocket"; @@ -22,8 +14,6 @@ describe("StreamingSocket", () => { }); it("can connect", async () => { - pendingWithoutSocketServer(); - const socket = new StreamingSocket(socketServerUrl); expect(socket).toBeTruthy(); socket.connect(); @@ -32,8 +22,6 @@ describe("StreamingSocket", () => { }); it("can connect to slow server", async () => { - pendingWithoutSocketServer(); - const socket = new StreamingSocket(socketServerUrlSlow); expect(socket).toBeTruthy(); socket.connect(); @@ -42,14 +30,12 @@ describe("StreamingSocket", () => { }); it("times out when establishing connection takes too long", async () => { - pendingWithoutSocketServer(); - const socket = new StreamingSocket(socketServerUrlSlow, 2_000); socket.connect(); await socket.connected .then(() => { - fail("must not resolve"); + throw new Error("must not resolve"); }) .catch((error) => { expect(error).toMatch(/connection attempt timed out/i); @@ -57,8 +43,6 @@ describe("StreamingSocket", () => { }); it("can send events when connected", async () => { - pendingWithoutSocketServer(); - const socket = new StreamingSocket(socketServerUrl); const responsePromise = toListPromise(socket.events, 3); @@ -76,8 +60,12 @@ describe("StreamingSocket", () => { socket.disconnect(); }); - it("completes stream when disconnected", (done) => { - pendingWithoutSocketServer(); + it("completes stream when disconnected", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const socket = new StreamingSocket(socketServerUrl); expect(socket).toBeTruthy(); @@ -96,5 +84,7 @@ describe("StreamingSocket", () => { await socket.send("lalala"); socket.disconnect(); })().catch(done.fail); + + return ret; }); }); diff --git a/packages/stream/src/concat.spec.ts b/packages/stream/src/concat.spec.ts index 52d8c6c57c..fe901c720e 100644 --- a/packages/stream/src/concat.spec.ts +++ b/packages/stream/src/concat.spec.ts @@ -7,7 +7,12 @@ async function producerIsStopped(): Promise { } describe("concat", () => { - it("can concat 0 streams", (done) => { + it("can concat 0 streams", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const concatenatedStream = concat(); const expected: string[] = []; @@ -21,9 +26,16 @@ describe("concat", () => { }, error: done.fail, }); + + return ret; }); - it("can concat 1 streams", (done) => { + it("can concat 1 streams", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const stream1 = Stream.of("1", "2", "3"); const concatenatedStream = concat(stream1); const expected = ["1", "2", "3"]; @@ -38,9 +50,16 @@ describe("concat", () => { }, error: done.fail, }); + + return ret; }); - it("can concat 2 streams", (done) => { + it("can concat 2 streams", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const stream1 = Stream.of("1", "2", "3"); const stream2 = Stream.of("a", "b", "c"); const concatenatedStream = concat(stream1, stream2); @@ -56,9 +75,16 @@ describe("concat", () => { }, error: done.fail, }); + + return ret; }); - it("can concat 3 streams", (done) => { + it("can concat 3 streams", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const stream1 = Stream.of("1", "2", "3"); const stream2 = Stream.of("a", "b", "c"); const stream3 = Stream.of("X", "Y", "Z"); @@ -75,9 +101,16 @@ describe("concat", () => { }, error: done.fail, }); + + return ret; }); - it("changes output order when order of streams switch", (done) => { + it("changes output order when order of streams switch", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const stream1 = Stream.of("1", "2", "3"); const stream2 = Stream.of("a", "b", "c"); const concatenatedStream = concat(stream2, stream1); @@ -93,9 +126,16 @@ describe("concat", () => { }, error: done.fail, }); + + return ret; }); - it("should concat two asynchronous short streams together", (done) => { + it("should concat two asynchronous short streams together", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const stream1 = Stream.periodic(25).take(3); const stream2 = Stream.periodic(50).take(2); const concatenatedStream = concat(stream1, stream2); @@ -111,9 +151,16 @@ describe("concat", () => { }, error: done.fail, }); + + return ret; }); - it("should append a synchronous stream after an asynchronous stream", (done) => { + it("should append a synchronous stream after an asynchronous stream", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const stream1 = Stream.periodic(25).take(3); const stream2 = Stream.of(30, 40, 50, 60); const concatenatedStream = concat(stream1, stream2); @@ -129,9 +176,16 @@ describe("concat", () => { }, error: done.fail, }); + + return ret; }); - it("buffers asynchronous events of second stream until first stream completes", (done) => { + it("buffers asynchronous events of second stream until first stream completes", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const sourceStream = Stream.periodic(25); const stream1 = sourceStream.take(3); const stream2 = sourceStream.take(3); @@ -148,9 +202,16 @@ describe("concat", () => { }, error: done.fail, }); + + return ret; }); - it("unsubscribes and re-subscribes from source streams", (done) => { + it("unsubscribes and re-subscribes from source streams", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); // For browsers and CI, clocks and runtimes are very unreliable. // Especialls Mac+Firefox on Travis is makes big trouble. Thus we need huge intervals. const intervalDuration = 1000; @@ -224,5 +285,7 @@ describe("concat", () => { done(); }, 3.75 * intervalDuration); }, 6 * intervalDuration); + + return ret; }); }); diff --git a/packages/stream/src/defaultvalueproducer.spec.ts b/packages/stream/src/defaultvalueproducer.spec.ts index 3fba548d3d..b87567faca 100644 --- a/packages/stream/src/defaultvalueproducer.spec.ts +++ b/packages/stream/src/defaultvalueproducer.spec.ts @@ -12,7 +12,12 @@ describe("DefaultValueProducer", () => { expect(producer.value).toEqual(1); }); - it("can be used as a stream backend", (done) => { + it("can be used as a stream backend", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const producer = new DefaultValueProducer(42); const stream = Stream.createWithMemory(producer); stream.addListener({ @@ -23,9 +28,16 @@ describe("DefaultValueProducer", () => { error: done.fail, complete: done.fail, }); + + return ret; }); - it("can send updates", (done) => { + it("can send updates", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const producer = new DefaultValueProducer(42); const stream = Stream.createWithMemory(producer); @@ -46,9 +58,16 @@ describe("DefaultValueProducer", () => { producer.update(43); producer.update(44); producer.update(45); + + return ret; }); - it("can send errors", (done) => { + it("can send errors", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const producer = new DefaultValueProducer(42); const stream = Stream.createWithMemory(producer); @@ -66,6 +85,8 @@ describe("DefaultValueProducer", () => { producer.update(2); producer.update(3); producer.error("oh no :("); + + return ret; }); it("calls callbacks", async () => { diff --git a/packages/stream/src/dropduplicates.spec.ts b/packages/stream/src/dropduplicates.spec.ts index 70cabf9379..380ff9724a 100644 --- a/packages/stream/src/dropduplicates.spec.ts +++ b/packages/stream/src/dropduplicates.spec.ts @@ -8,7 +8,12 @@ describe("dropDuplicates", () => { expect(operand).toBeTruthy(); }); - it("passes unique values", (done) => { + it("passes unique values", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const instream = Stream.fromArray([0, 1, 2, 3]); const operand = dropDuplicates((value) => `${value}`); @@ -20,9 +25,16 @@ describe("dropDuplicates", () => { done(); }, }); + + return ret; }); - it("drops consecutive duplicates", (done) => { + it("drops consecutive duplicates", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const instream = Stream.fromArray([1, 2, 2, 3, 3, 3, 4, 4, 4, 4]); const operand = dropDuplicates((value) => `${value}`); @@ -34,9 +46,16 @@ describe("dropDuplicates", () => { done(); }, }); + + return ret; }); - it("drops non-consecutive duplicates", (done) => { + it("drops non-consecutive duplicates", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const instream = Stream.fromArray([1, 2, 3, 4, 3, 2, 1]); const operand = dropDuplicates((value) => `${value}`); @@ -48,9 +67,16 @@ describe("dropDuplicates", () => { done(); }, }); + + return ret; }); - it("uses value to key method for duplicate checks", (done) => { + it("uses value to key method for duplicate checks", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const instream = Stream.fromArray([1, 10, 100, 2000, 2, 27, 1337, 3.14, 33]); // use first character of native string representation const valueToKey = (value: number): string => `${value}`.charAt(0); @@ -64,9 +90,16 @@ describe("dropDuplicates", () => { done(); }, }); + + return ret; }); - it("works for empty string keys", (done) => { + it("works for empty string keys", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); interface Name { readonly first: string; readonly last: string; @@ -91,5 +124,7 @@ describe("dropDuplicates", () => { done(); }, }); + + return ret; }); }); diff --git a/packages/stream/src/promise.spec.ts b/packages/stream/src/promise.spec.ts index a7db4ac36e..c95b9d63e8 100644 --- a/packages/stream/src/promise.spec.ts +++ b/packages/stream/src/promise.spec.ts @@ -80,7 +80,7 @@ describe("promise", () => { it("rejects for simple stream with less events than count", async () => { await toListPromise(Stream.fromArray([1, 6, 92]), 5) .then(() => { - fail("must not resolve"); + throw new Error("must not resolve"); }) .catch((error) => { expect(error).toMatch(/stream completed before all events could be collected/i); @@ -120,7 +120,7 @@ describe("promise", () => { it("rejects for stream with no events", async () => { await firstEvent(Stream.fromArray([])) .then(() => { - fail("must not resolve"); + throw new Error("must not resolve"); }) .catch((error) => { expect(error).toMatch(/stream completed before all events could be collected/i); diff --git a/packages/stream/src/reducer.spec.ts b/packages/stream/src/reducer.spec.ts index 45ff8906b2..549dc2084f 100644 --- a/packages/stream/src/reducer.spec.ts +++ b/packages/stream/src/reducer.spec.ts @@ -47,7 +47,7 @@ describe("Test stream helpers", () => { try { const result = asArray(stream); await result.finished(); - fail("This should have thrown an error"); + throw new Error("This should have thrown an error"); } catch (err) { expect(err).toEqual("error"); } diff --git a/packages/stream/src/valueandupdates.spec.ts b/packages/stream/src/valueandupdates.spec.ts index cd04a83514..dffaabe8d9 100644 --- a/packages/stream/src/valueandupdates.spec.ts +++ b/packages/stream/src/valueandupdates.spec.ts @@ -73,7 +73,12 @@ describe("ValueAndUpdates", () => { } }); - it("emits initial value to new listeners", (done) => { + it("emits initial value to new listeners", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const vau = new ValueAndUpdates(new DefaultValueProducer(123)); const listener2: Listener = { @@ -103,9 +108,16 @@ describe("ValueAndUpdates", () => { }; vau.updates.addListener(listener1); + + return ret; }); - it("emits current value to new listeners", (done) => { + it("emits current value to new listeners", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const producer = new DefaultValueProducer(123); const vau = new ValueAndUpdates(producer); producer.update(99); @@ -137,9 +149,16 @@ describe("ValueAndUpdates", () => { }; vau.updates.addListener(listener1); + + return ret; }); - it("emits updates to listener", (done) => { + it("emits updates to listener", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); const producer = new DefaultValueProducer(11); const vau = new ValueAndUpdates(producer); @@ -173,6 +192,8 @@ describe("ValueAndUpdates", () => { setTimeout(() => { producer.update(44); }, 30); + + return ret; }); it("can wait for value", async () => { @@ -248,7 +269,7 @@ describe("ValueAndUpdates", () => { }, 10); await vau.waitFor(3).then( () => { - fail("must not resolve"); + throw new Error("must not resolve"); }, (error) => { expect(error).toMatch(/something went wrong/); diff --git a/packages/tendermint-rpc/src/comet38/comet38client.spec.ts b/packages/tendermint-rpc/src/comet38/comet38client.spec.ts index e5970a1f92..64c5889d52 100644 --- a/packages/tendermint-rpc/src/comet38/comet38client.spec.ts +++ b/packages/tendermint-rpc/src/comet38/comet38client.spec.ts @@ -627,7 +627,12 @@ function defaultTestSuite(rpcFactory: () => RpcClient, expected: ExpectedValues) } function websocketTestSuite(rpcFactory: () => RpcClient, expected: ExpectedValues): void { - it("can subscribe to block header events", (done) => { + it("can subscribe to block header events", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); pendingWithoutTendermint(); const testStart = ReadonlyDate.now(); @@ -684,6 +689,8 @@ function websocketTestSuite(rpcFactory: () => RpcClient, expected: ExpectedValue }, }); })().catch(done.fail); + + return ret; }); it("can subscribe to block events", async () => { @@ -910,7 +917,7 @@ describe("Comet38Client with CometBFT 0.38 backend", () => { describe("With WebsocketClient", () => { // don't print out WebSocket errors if marked pending - const onError = process.env.TENDERMINT_ENABLED ? console.error : () => 0; + const onError = globalThis.process?.env.TENDERMINT_ENABLED ? console.error : () => 0; const factory = (): WebsocketClient => new WebsocketClient("ws://" + url, onError); defaultTestSuite(factory, expected); websocketTestSuite(factory, expected); @@ -946,7 +953,7 @@ describe("Comet38Client with CometBFT 1 backend", () => { describe("With WebsocketClient", () => { // don't print out WebSocket errors if marked pending - const onError = process.env.TENDERMINT_ENABLED ? console.error : () => 0; + const onError = globalThis.process?.env.TENDERMINT_ENABLED ? console.error : () => 0; const factory = (): WebsocketClient => new WebsocketClient("ws://" + url, onError); defaultTestSuite(factory, expected); websocketTestSuite(factory, expected); diff --git a/packages/tendermint-rpc/src/rpcclients/http.spec.ts b/packages/tendermint-rpc/src/rpcclients/http.spec.ts index bcfeec0fa6..3eb16f324b 100644 --- a/packages/tendermint-rpc/src/rpcclients/http.spec.ts +++ b/packages/tendermint-rpc/src/rpcclients/http.spec.ts @@ -3,9 +3,10 @@ import { defaultInstance, pendingWithoutTendermint } from "../testutil.spec"; import { http } from "./http"; function pendingWithoutHttpServer(): void { - if (!process.env.HTTPSERVER_ENABLED) { - pending("Set HTTPSERVER_ENABLED to enable HTTP tests"); + if (globalThis.process?.env.HTTPSERVER_ENABLED) { + return; } + pending("Set HTTPSERVER_ENABLED to enable HTTP tests"); } const tendermintUrl = defaultInstance.url; diff --git a/packages/tendermint-rpc/src/rpcclients/httpbatchclient.spec.ts b/packages/tendermint-rpc/src/rpcclients/httpbatchclient.spec.ts index 04da95f8f2..831c0ed52a 100644 --- a/packages/tendermint-rpc/src/rpcclients/httpbatchclient.spec.ts +++ b/packages/tendermint-rpc/src/rpcclients/httpbatchclient.spec.ts @@ -25,7 +25,7 @@ describe("HttpBatchClient", () => { await client .execute(createJsonRpcRequest("no-such-method")) .then(() => { - fail("must not resolve"); + throw new Error("must not resolve"); }) .catch((error) => { expect(error).toBeTruthy(); diff --git a/packages/tendermint-rpc/src/rpcclients/httpclient.spec.ts b/packages/tendermint-rpc/src/rpcclients/httpclient.spec.ts index 93bc9e24a1..15486bc15f 100644 --- a/packages/tendermint-rpc/src/rpcclients/httpclient.spec.ts +++ b/packages/tendermint-rpc/src/rpcclients/httpclient.spec.ts @@ -25,7 +25,7 @@ describe("HttpClient", () => { await client .execute(createJsonRpcRequest("no-such-method")) .then(() => { - fail("must not resolve"); + throw new Error("must not resolve"); }) .catch((error) => { expect(error).toBeTruthy(); diff --git a/packages/tendermint-rpc/src/rpcclients/websocketclient.spec.ts b/packages/tendermint-rpc/src/rpcclients/websocketclient.spec.ts index 9ab52b8486..bef1529bfa 100644 --- a/packages/tendermint-rpc/src/rpcclients/websocketclient.spec.ts +++ b/packages/tendermint-rpc/src/rpcclients/websocketclient.spec.ts @@ -8,9 +8,10 @@ import { SubscriptionEvent } from "./rpcclient"; import { WebsocketClient } from "./websocketclient"; function pendingWithoutTendermint(): void { - if (!process.env.TENDERMINT_ENABLED) { - pending("Set TENDERMINT_ENABLED to enable Tendermint RPC tests"); + if (globalThis.process?.env.TENDERMINT_ENABLED) { + return; } + pending("Set TENDERMINT_ENABLED to enable Tendermint RPC tests"); } describe("WebsocketClient", () => { @@ -32,7 +33,7 @@ describe("WebsocketClient", () => { await client .execute(createJsonRpcRequest("no-such-method")) .then(() => { - fail("must not resolve"); + throw new Error("must not resolve"); }) .catch((error) => { expect(error).toBeTruthy(); @@ -41,7 +42,12 @@ describe("WebsocketClient", () => { client.disconnect(); }); - it("can listen to events", (done) => { + it("can listen to events", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); pendingWithoutTendermint(); const client = new WebsocketClient(tendermintUrl); @@ -79,6 +85,8 @@ describe("WebsocketClient", () => { } }, }); + + return ret; }); it("can listen to the same query twice", async () => { @@ -106,7 +114,12 @@ describe("WebsocketClient", () => { client.disconnect(); }); - it("can execute commands while listening to events", (done) => { + it("can execute commands while listening to events", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); pendingWithoutTendermint(); const client = new WebsocketClient(tendermintUrl); @@ -146,9 +159,16 @@ describe("WebsocketClient", () => { expect(startusResponse).toBeTruthy(); }) .catch(done.fail); + + return ret; }); - it("can end event listening by disconnecting", (done) => { + it("can end event listening by disconnecting", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); pendingWithoutTendermint(); const client = new WebsocketClient(tendermintUrl); @@ -171,6 +191,8 @@ describe("WebsocketClient", () => { done(); }, }); + + return ret; }); it("fails when executing on a disconnected client", async () => { @@ -185,14 +207,19 @@ describe("WebsocketClient", () => { await client .execute(createJsonRpcRequest("health")) .then(() => { - fail("must not resolve"); + throw new Error("must not resolve"); }) .catch((error) => { expect(error).toMatch(/socket has disconnected/i); }); }); - it("fails when listening to a disconnected client", (done) => { + it("fails when listening to a disconnected client", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); pendingWithoutTendermint(); // async and done does not work together with pending() in Jasmine 2.8 @@ -208,6 +235,8 @@ describe("WebsocketClient", () => { expect(() => client.listen(req).subscribe({})).toThrowError(/socket has disconnected/i); done(); })().catch(done.fail); + + return ret; }); it("cannot listen to simple requests", async () => { diff --git a/packages/tendermint-rpc/src/tendermint34/tendermint34client.spec.ts b/packages/tendermint-rpc/src/tendermint34/tendermint34client.spec.ts index 150b2a57b9..bf0af928ee 100644 --- a/packages/tendermint-rpc/src/tendermint34/tendermint34client.spec.ts +++ b/packages/tendermint-rpc/src/tendermint34/tendermint34client.spec.ts @@ -619,7 +619,12 @@ function defaultTestSuite(rpcFactory: () => RpcClient, expected: ExpectedValues) } function websocketTestSuite(rpcFactory: () => RpcClient, expected: ExpectedValues): void { - it("can subscribe to block header events", (done) => { + it("can subscribe to block header events", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); pendingWithoutTendermint(); const testStart = ReadonlyDate.now(); @@ -675,6 +680,8 @@ function websocketTestSuite(rpcFactory: () => RpcClient, expected: ExpectedValue }, }); })().catch(done.fail); + + return ret; }); it("can subscribe to block events", async () => { @@ -898,7 +905,7 @@ describe("Tendermint34Client", () => { describe("With WebsocketClient", () => { // don't print out WebSocket errors if marked pending - const onError = process.env.TENDERMINT_ENABLED ? console.error : () => 0; + const onError = globalThis.process?.env.TENDERMINT_ENABLED ? console.error : () => 0; const factory = (): WebsocketClient => new WebsocketClient("ws://" + url, onError); defaultTestSuite(factory, expected); websocketTestSuite(factory, expected); diff --git a/packages/tendermint-rpc/src/tendermint37/tendermint37client.spec.ts b/packages/tendermint-rpc/src/tendermint37/tendermint37client.spec.ts index 603aca6e2c..1280ef9bf2 100644 --- a/packages/tendermint-rpc/src/tendermint37/tendermint37client.spec.ts +++ b/packages/tendermint-rpc/src/tendermint37/tendermint37client.spec.ts @@ -624,7 +624,12 @@ function defaultTestSuite(rpcFactory: () => RpcClient, expected: ExpectedValues) } function websocketTestSuite(rpcFactory: () => RpcClient, expected: ExpectedValues): void { - it("can subscribe to block header events", (done) => { + it("can subscribe to block header events", async () => { + let done!: (() => void) & { fail: (e?: any) => void }; + const ret = new Promise((resolve, reject) => { + done = resolve as typeof done; + done.fail = reject; + }); pendingWithoutTendermint(); const testStart = ReadonlyDate.now(); @@ -681,6 +686,8 @@ function websocketTestSuite(rpcFactory: () => RpcClient, expected: ExpectedValue }, }); })().catch(done.fail); + + return ret; }); it("can subscribe to block events", async () => { @@ -907,7 +914,7 @@ describe("Tendermint37Client", () => { describe("With WebsocketClient", () => { // don't print out WebSocket errors if marked pending - const onError = process.env.TENDERMINT_ENABLED ? console.error : () => 0; + const onError = globalThis.process?.env.TENDERMINT_ENABLED ? console.error : () => 0; const factory = (): WebsocketClient => new WebsocketClient("ws://" + url, onError); defaultTestSuite(factory, expected); websocketTestSuite(factory, expected); diff --git a/packages/tendermint-rpc/src/testutil.spec.ts b/packages/tendermint-rpc/src/testutil.spec.ts index 7e834329d0..4fd9c9488d 100644 --- a/packages/tendermint-rpc/src/testutil.spec.ts +++ b/packages/tendermint-rpc/src/testutil.spec.ts @@ -100,7 +100,7 @@ export const tendermintInstances: Record = { export const defaultInstance: TendermintInstance = tendermintInstances[34]; export function tendermintEnabled(): boolean { - return !!process.env.TENDERMINT_ENABLED; + return !!globalThis.process?.env.TENDERMINT_ENABLED; } export function pendingWithoutTendermint(): void { diff --git a/packages/utils/src/typechecks.spec.ts b/packages/utils/src/typechecks.spec.ts index ddbf1209df..074493bd82 100644 --- a/packages/utils/src/typechecks.spec.ts +++ b/packages/utils/src/typechecks.spec.ts @@ -33,7 +33,7 @@ describe("typechecks", () => { expect(isUint8Array(new Uint8Array([1, 2, 3]))).toEqual(true); }); - it("returns false for Buffer", () => { + (typeof Buffer !== "undefined" ? it : xit)("returns false for Buffer", () => { // One could start a big debate about whether or not a Buffer is a Uint8Array, which // required a definition of "is a" in a languages that has no proper object oriented // programming support.