summaryrefslogtreecommitdiffhomepage
path: root/packages/server/src/helpers/iso/isoCrypto/getWebCrypto.test.ts
diff options
context:
space:
mode:
authorMatthew Miller <matthew@millerti.me>2023-10-27 13:20:28 -0700
committerGitHub <noreply@github.com>2023-10-27 13:20:28 -0700
commit6ef44cc1002fe498fd393c0244eed5a9afe185b5 (patch)
treee346abd6b2b1d1b26366cb34602c4964b4533aea /packages/server/src/helpers/iso/isoCrypto/getWebCrypto.test.ts
parent93067b16ec03285c4e1efe0b00fa2a9f69722548 (diff)
parent763f0b6734c8f0362d015e5b3fae4784f8e7c7f7 (diff)
Merge pull request #468 from MasterKale/fix/better-get-web-crypto
fix/better-get-web-crypto
Diffstat (limited to 'packages/server/src/helpers/iso/isoCrypto/getWebCrypto.test.ts')
-rw-r--r--packages/server/src/helpers/iso/isoCrypto/getWebCrypto.test.ts149
1 files changed, 149 insertions, 0 deletions
diff --git a/packages/server/src/helpers/iso/isoCrypto/getWebCrypto.test.ts b/packages/server/src/helpers/iso/isoCrypto/getWebCrypto.test.ts
new file mode 100644
index 0000000..26025b8
--- /dev/null
+++ b/packages/server/src/helpers/iso/isoCrypto/getWebCrypto.test.ts
@@ -0,0 +1,149 @@
+import { assertEquals, assertRejects } from 'https://deno.land/std@0.198.0/assert/mod.ts';
+import { returnsNext, stub } from 'https://deno.land/std@0.198.0/testing/mock.ts';
+
+import { _getWebCryptoInternals, getWebCrypto, MissingWebCrypto } from './getWebCrypto.ts';
+
+Deno.test('should return globalThis.crypto when present', async () => {
+ // Clear whatever version of crypto might have been set
+ _getWebCryptoInternals.setCachedCrypto(undefined);
+
+ // Pretend globalThis.crypto exists
+ const newGlobalThisCrypto = {};
+ const mockGlobalThisCrypto = stub(
+ _getWebCryptoInternals,
+ 'stubThisGlobalThisCrypto',
+ // @ts-ignore: globalThis.crypto
+ returnsNext([newGlobalThisCrypto]),
+ );
+
+ const returnedCrypto = await getWebCrypto();
+
+ assertEquals(returnedCrypto, newGlobalThisCrypto);
+
+ mockGlobalThisCrypto.restore();
+});
+
+Deno.test('should return node:crypto.webcrypto when globalThis.crypto is missing', async () => {
+ // Clear whatever version of crypto might have been set
+ _getWebCryptoInternals.setCachedCrypto(undefined);
+
+ // Pretend globalThis.crypto doesn't exist
+ const mockGlobalThisCrypto = stub(
+ _getWebCryptoInternals,
+ 'stubThisGlobalThisCrypto',
+ // @ts-ignore: globalThis.crypto
+ returnsNext([undefined]),
+ );
+
+ // Mock out just enough of the 'node:crypto' module
+ const fakeNodeCrypto = { webcrypto: {} };
+ const mockImportNodeCrypto = stub(
+ _getWebCryptoInternals,
+ 'stubThisImportNodeCrypto',
+ // @ts-ignore: node:crypto
+ returnsNext([fakeNodeCrypto]),
+ );
+
+ const returnedCrypto = await getWebCrypto();
+
+ assertEquals(returnedCrypto, fakeNodeCrypto.webcrypto);
+
+ mockGlobalThisCrypto.restore();
+ mockImportNodeCrypto.restore();
+});
+
+Deno.test(
+ 'should return globalThis.crypto when present, while node:crypto.webcrypto is present',
+ async () => {
+ // Clear whatever version of crypto might have been set
+ _getWebCryptoInternals.setCachedCrypto(undefined);
+
+ // Pretend globalThis.crypto exists
+ const fakeGlobalThisCrypto = {};
+ const mockGlobalThisCrypto = stub(
+ _getWebCryptoInternals,
+ 'stubThisGlobalThisCrypto',
+ // @ts-ignore: globalThis.crypto
+ returnsNext([fakeGlobalThisCrypto]),
+ );
+
+ // Mock out just enough of the 'node:crypto' module, but like we're in Node v14
+ const fakeNodeCrypto = { webcrypto: {} };
+ const mockImportNodeCrypto = stub(
+ _getWebCryptoInternals,
+ 'stubThisImportNodeCrypto',
+ // @ts-ignore: node:crypto
+ returnsNext([fakeNodeCrypto]),
+ );
+
+ const returnedCrypto = await getWebCrypto();
+
+ assertEquals(returnedCrypto, fakeGlobalThisCrypto);
+
+ mockGlobalThisCrypto.restore();
+ mockImportNodeCrypto.restore();
+ },
+);
+
+Deno.test(
+ 'should return globalThis.crypto when present, while node:crypto is present but missing webcrypto',
+ async () => {
+ // Clear whatever version of crypto might have been set
+ _getWebCryptoInternals.setCachedCrypto(undefined);
+
+ // Pretend globalThis.crypto exists
+ const fakeGlobalThisCrypto = {};
+ const mockGlobalThisCrypto = stub(
+ _getWebCryptoInternals,
+ 'stubThisGlobalThisCrypto',
+ // @ts-ignore: globalThis.crypto
+ returnsNext([fakeGlobalThisCrypto]),
+ );
+
+ // Mock out just enough of the 'node:crypto' module, but like we're in Node v14
+ const fakeNodeCrypto = { webcrypto: undefined };
+ const mockImportNodeCrypto = stub(
+ _getWebCryptoInternals,
+ 'stubThisImportNodeCrypto',
+ // @ts-ignore: node:crypto
+ returnsNext([fakeNodeCrypto]),
+ );
+
+ const returnedCrypto = await getWebCrypto();
+
+ assertEquals(returnedCrypto, fakeGlobalThisCrypto);
+
+ mockGlobalThisCrypto.restore();
+ mockImportNodeCrypto.restore();
+ },
+);
+
+Deno.test('should raise MissingWebCrypto error when nothing is available', async () => {
+ // Clear whatever version of crypto might have been set
+ _getWebCryptoInternals.setCachedCrypto(undefined);
+
+ // Pretend globalThis.crypto doesn't exist
+ const mockGlobalThisCrypto = stub(
+ _getWebCryptoInternals,
+ 'stubThisGlobalThisCrypto',
+ // @ts-ignore: globalThis.crypto
+ returnsNext([undefined]),
+ );
+
+ // Pretend node:crypto doesn't exist
+ const mockImportNodeCrypto = stub(
+ _getWebCryptoInternals,
+ 'stubThisImportNodeCrypto',
+ // @ts-ignore: node:crypto
+ returnsNext([undefined]),
+ );
+
+ await assertRejects(
+ () => getWebCrypto(),
+ MissingWebCrypto,
+ 'Crypto API could not be located',
+ );
+
+ mockGlobalThisCrypto.restore();
+ mockImportNodeCrypto.restore();
+});