Skip to content

Commit

Permalink
test cleanup and fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
niftyvictor committed Feb 5, 2025
1 parent 8e842c6 commit a4db5f3
Show file tree
Hide file tree
Showing 9 changed files with 901 additions and 118 deletions.
3 changes: 2 additions & 1 deletion lib/build/recipe/webauthn/recipeImplementation.js
Original file line number Diff line number Diff line change
Expand Up @@ -308,8 +308,9 @@ function getRecipeInterface(querier, getWebauthnConfig) {
},
registerCredential: async function ({ webauthnGeneratedOptionsId, credential, userContext, recipeUserId }) {
return await querier.sendPostRequest(
new normalisedURLPath_1.default(`/recipe/webauthn/user/${recipeUserId}/credential/register`),
new normalisedURLPath_1.default(`/recipe/webauthn/user/credential/register`),
{
recipeUserId,
webauthnGeneratedOptionsId,
credential,
},
Expand Down
3 changes: 2 additions & 1 deletion lib/ts/recipe/webauthn/recipeImplementation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -288,8 +288,9 @@ export default function getRecipeInterface(

registerCredential: async function ({ webauthnGeneratedOptionsId, credential, userContext, recipeUserId }) {
return await querier.sendPostRequest(
new NormalisedURLPath(`/recipe/webauthn/user/${recipeUserId}/credential/register`),
new NormalisedURLPath(`/recipe/webauthn/user/credential/register`),
{
recipeUserId,
webauthnGeneratedOptionsId,
credential,
},
Expand Down
93 changes: 1 addition & 92 deletions test/webauthn/apis.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ let { middleware, errorHandler } = require("../../framework/express");
let { isCDIVersionCompatible } = require("../utils");
const { readFile } = require("fs/promises");
const nock = require("nock");

require("./wasm_exec");
const getWebauthnLib = require("./lib/getWebAuthnLib");

describe(`apisFunctions: ${printPath("[test/webauthn/apis.test.js]")}`, function () {
beforeEach(async function () {
Expand Down Expand Up @@ -84,8 +83,6 @@ describe(`apisFunctions: ${printPath("[test/webauthn/apis.test.js]")}`, function
})
);

console.log("test registerOptions with default values", registerOptionsResponse);

assert(registerOptionsResponse.status === "OK");

assert(typeof registerOptionsResponse.webauthnGeneratedOptionsId === "string");
Expand Down Expand Up @@ -180,7 +177,6 @@ describe(`apisFunctions: ${printPath("[test/webauthn/apis.test.js]")}`, function
}
})
);
console.log("test registerOptions with custom values", registerOptionsResponse);

assert(registerOptionsResponse.status === "OK");

Expand All @@ -202,7 +198,6 @@ describe(`apisFunctions: ${printPath("[test/webauthn/apis.test.js]")}`, function
userContext: {},
}
);
console.log("generatedOptions", generatedOptions);
assert(generatedOptions.origin === "testOrigin.com");
});
});
Expand Down Expand Up @@ -246,7 +241,6 @@ describe(`apisFunctions: ${printPath("[test/webauthn/apis.test.js]")}`, function
}
})
);
console.log("test signInOptions with default values", signInOptionsResponse);

assert(signInOptionsResponse.status === "OK");

Expand All @@ -262,7 +256,6 @@ describe(`apisFunctions: ${printPath("[test/webauthn/apis.test.js]")}`, function
userContext: {},
}
);
console.log("generatedOptions", generatedOptions);

assert(generatedOptions.relyingPartyId === "api.supertokens.io");
assert(generatedOptions.origin === "https://supertokens.io");
Expand Down Expand Up @@ -318,7 +311,6 @@ describe(`apisFunctions: ${printPath("[test/webauthn/apis.test.js]")}`, function
}
})
);
console.log("test signInOptions with custom values", signInOptionsResponse);

assert(signInOptionsResponse.status === "OK");

Expand Down Expand Up @@ -400,7 +392,6 @@ describe(`apisFunctions: ${printPath("[test/webauthn/apis.test.js]")}`, function
}
})
);
console.log("registerOptionsResponse", registerOptionsResponse);
assert(registerOptionsResponse.status === "OK");

const { createCredential } = await getWebauthnLib();
Expand All @@ -411,7 +402,6 @@ describe(`apisFunctions: ${printPath("[test/webauthn/apis.test.js]")}`, function
userNotPresent: false,
userNotVerified: false,
});
console.log("credential", credential);

let signUpResponse = await new Promise((resolve, reject) =>
request(app)
Expand Down Expand Up @@ -503,7 +493,6 @@ describe(`apisFunctions: ${printPath("[test/webauthn/apis.test.js]")}`, function
}
})
);
console.log("registerOptionsResponse", registerOptionsResponse);
assert(registerOptionsResponse.status === "OK");

let signInOptionsResponse = await new Promise((resolve, reject) =>
Expand Down Expand Up @@ -724,83 +713,3 @@ describe(`apisFunctions: ${printPath("[test/webauthn/apis.test.js]")}`, function
});
});
});

const getWebauthnLib = async () => {
const wasmBuffer = await readFile(__dirname + "/webauthn.wasm");

// Set up the WebAssembly module instance
const go = new Go();
const { instance } = await WebAssembly.instantiate(wasmBuffer, go.importObject);
go.run(instance);

// Export extractURL from the global object
const createCredential = (
registerOptions,
{ userNotPresent = true, userNotVerified = true, rpId, rpName, origin }
) => {
const registerOptionsString = JSON.stringify(registerOptions);
const result = global.createCredential(
registerOptionsString,
rpId,
rpName,
origin,
userNotPresent,
userNotVerified
);

if (!result) {
throw new Error("Failed to create credential");
}

try {
const credential = JSON.parse(result);
return credential;
} catch (e) {
throw new Error("Failed to parse credential");
}
};

const createAndAssertCredential = (
registerOptions,
signInOptions,
{ userNotPresent = false, userNotVerified = false, rpId, rpName, origin }
) => {
const registerOptionsString = JSON.stringify(registerOptions);
const signInOptionsString = JSON.stringify(signInOptions);

const result = global.createAndAssertCredential(
registerOptionsString,
signInOptionsString,
rpId,
rpName,
origin,
userNotPresent,
userNotVerified
);

if (!result) {
throw new Error("Failed to create/assert credential");
}

try {
const parsedResult = JSON.parse(result);
return { attestation: parsedResult.attestation, assertion: parsedResult.assertion };
} catch (e) {
throw new Error("Failed to parse result");
}
};

return { createCredential, createAndAssertCredential };
};

const log = ({ ...args }) => {
Object.keys(args).forEach((key) => {
console.log();
console.log("------------------------------------------------");
console.log(`${key}`);
console.log("------------------------------------------------");
console.log(JSON.stringify(args[key], null, 2));
console.log("================================================");
console.log();
});
};
62 changes: 62 additions & 0 deletions test/webauthn/lib/createUser.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
const request = require("supertest");
const express = require("express");

let { middleware, errorHandler } = require("../../../framework/express");

const getWebauthnLib = require("./getWebAuthnLib");

const createUser = async (rpId, rpName, origin) => {
const app = express();
app.use(middleware());
app.use(errorHandler());

const email = `${Math.random().toString().slice(2)}@supertokens.com`;
let registerOptionsResponse = await new Promise((resolve, reject) =>
request(app)
.post("/auth/webauthn/options/register")
.send({
email,
})
.expect(200)
.end((err, res) => {
if (err) {
console.log(err);
reject(err);
} else {
resolve(JSON.parse(res.text));
}
})
);

const { createCredential } = await getWebauthnLib();
const credential = createCredential(registerOptionsResponse, {
rpId,
rpName,
origin,
userNotPresent: false,
userNotVerified: false,
});

let signUpResponse = await new Promise((resolve, reject) =>
request(app)
.post("/auth/webauthn/signup")
.send({
credential,
webauthnGeneratedOptionsId: registerOptionsResponse.webauthnGeneratedOptionsId,
shouldTryLinkingWithSessionUser: false,
})
.expect(200)
.end((err, res) => {
if (err) {
console.log(err);
reject(err);
} else {
resolve(JSON.parse(res.text));
}
})
);

return { email, signUpResponse, registerOptionsResponse, credential };
};

module.exports = createUser;
73 changes: 73 additions & 0 deletions test/webauthn/lib/getWebAuthnLib.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
const { readFile } = require("fs/promises");

require("./wasm_exec");

const getWebauthnLib = async () => {
const wasmBuffer = await readFile(__dirname + "/webauthn.wasm");

// Set up the WebAssembly module instance
const go = new Go();
const { instance } = await WebAssembly.instantiate(wasmBuffer, go.importObject);
go.run(instance);

// Export extractURL from the global object
const createCredential = (
registerOptions,
{ userNotPresent = true, userNotVerified = true, rpId, rpName, origin }
) => {
const registerOptionsString = JSON.stringify(registerOptions);
const result = global.createCredential(
registerOptionsString,
rpId,
rpName,
origin,
userNotPresent,
userNotVerified
);

if (!result) {
throw new Error("Failed to create credential");
}

try {
const credential = JSON.parse(result);
return credential;
} catch (e) {
throw new Error("Failed to parse credential");
}
};

const createAndAssertCredential = (
registerOptions,
signInOptions,
{ userNotPresent = false, userNotVerified = false, rpId, rpName, origin }
) => {
const registerOptionsString = JSON.stringify(registerOptions);
const signInOptionsString = JSON.stringify(signInOptions);

const result = global.createAndAssertCredential(
registerOptionsString,
signInOptionsString,
rpId,
rpName,
origin,
userNotPresent,
userNotVerified
);

if (!result) {
throw new Error("Failed to create/assert credential");
}

try {
const parsedResult = JSON.parse(result);
return { attestation: parsedResult.attestation, assertion: parsedResult.assertion };
} catch (e) {
throw new Error("Failed to parse result");
}
};

return { createCredential, createAndAssertCredential };
};

module.exports = getWebauthnLib;
7 changes: 7 additions & 0 deletions test/webauthn/lib/getWebAuthnRecipe.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
let SuperTokens = require("../../../lib/build/supertokens").default;

const getWebAuthnRecipe = () => {
return SuperTokens.getInstanceOrThrowError().recipeModules.find((rm) => rm.getRecipeId() === "webauthn");
};

module.exports = getWebAuthnRecipe;
File renamed without changes.
File renamed without changes.
Loading

0 comments on commit a4db5f3

Please sign in to comment.