Failed while writing test

I’m trying to write test script, but it fails with this error:
code:

const test = require("tape");
const { ECDSAKeyIdentity } = require("@dfinity/identity");

const {
    idlFactory: contract_interface,
} = require("../.dfx/local/canisters/contract/service.did.test.cjs")

// canister ids
const canister_ids = require("../.dfx/local/canister_ids.json");
const contract = canister_ids.contract.local;
const token = canister_ids.token.local;

// identities
let ram_identity = ECDSAKeyIdentity.generate();
let sam_identity = ECDSAKeyIdentity.generate();

Error:

/Users/pramitgaha/programs/contract/node_modules/@dfinity/identity/lib/cjs/identity/ecdsa.js:26
        throw new CryptoError('Global crypto was not available and none was provided. Please inlcude a SubtleCrypto implementation. See https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto');
              ^
CryptoError: Global crypto was not available and none was provided. Please inlcude a SubtleCrypto implementation. See https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto
    at _getEffectiveCrypto (/Users/pramitgaha/programs/contract/node_modules/@dfinity/identity/lib/cjs/identity/ecdsa.js:26:15)
    at ECDSAKeyIdentity.generate (/Users/pramitgaha/programs/Local-ICP/node_modules/@dfinity/identity/lib/cjs/identity/ecdsa.js:51:33)
    at Object.<anonymous> (/Users/pramitgaha/programs/contract/test/contract.test.cjs:14:37)
    at Module._compile (node:internal/modules/cjs/loader:1254:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
    at Module.load (node:internal/modules/cjs/loader:1117:32)
    at Module._load (node:internal/modules/cjs/loader:958:12)
    at Module.require (node:internal/modules/cjs/loader:1141:19)
    at require (node:internal/modules/cjs/helpers:110:18)
    at importOrRequire (/Users/pramitgaha/programs/contract/node_modules/tape/bin/import-or-require.js:14:2)
Node.js v18.14.1

Try to mock Crypto with a polyfill as for example @peculiar/webcrypto - npm

import { Crypto as SubtleCrypto } from "@peculiar/webcrypto";

const crypto = new SubtleCrypto();
Object.defineProperty(global, "crypto", {
  value: crypto,
});

It’s what we do for the jest test suite in NNS dapp https://github.com/dfinity/nns-dapp/blob/29f6ceaeff9602e0230e71eae183eff23035072d/frontend/jest-setup.ts#LL16C1-L19C4

1 Like

Thank you for the help.
I also figured out another solution:
using Ed25519KeyIdentity instead of ECDSAKeyIdentity worked for me.

2 Likes

For test purpose you mean?

yes sir. changing that worked.

1 Like

also, can you help with this one?
my response looks like this:

const Response = IDL.Variant({
    'Success': IDL.Null,
    'TemporarilyUnavailable' : IDL.Null,
    'TooOld' : IDL.Null,
    'InsufficientFunds' : IDL.Record({ 'balance' : Tokens }),
  });

how do I compare the result:

const response = await contract.function();
response.equals(???);

Seems like a JavaScript related question. Here’s the first result I got when I google “javascript compare object” https://dmitripavlutin.com/how-to-compare-objects-in-javascript/

For further question, you might be more lucky starting new threads.