2025-09-18 16:40:49 +09:00
|
|
|
#!/usr/bin/env node
|
|
|
|
|
|
|
|
|
|
const fs = require("node:fs");
|
|
|
|
|
const path = require("node:path");
|
|
|
|
|
const Module = require("node:module");
|
|
|
|
|
const ts = require("typescript");
|
|
|
|
|
|
|
|
|
|
const srcRoot = path.join(path.resolve(__dirname, ".."), "src");
|
|
|
|
|
|
|
|
|
|
const registerTsCompiler = extension => {
|
|
|
|
|
require.extensions[extension] = (module, filename) => {
|
|
|
|
|
const source = fs.readFileSync(filename, "utf8");
|
|
|
|
|
const { outputText } = ts.transpileModule(source, {
|
|
|
|
|
compilerOptions: {
|
|
|
|
|
module: ts.ModuleKind.CommonJS,
|
|
|
|
|
target: ts.ScriptTarget.ES2020,
|
|
|
|
|
jsx: ts.JsxEmit.ReactJSX,
|
|
|
|
|
esModuleInterop: true,
|
|
|
|
|
moduleResolution: ts.ModuleResolutionKind.NodeNext,
|
|
|
|
|
resolveJsonModule: true,
|
|
|
|
|
skipLibCheck: true,
|
|
|
|
|
},
|
|
|
|
|
fileName: filename,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
module._compile(outputText, filename);
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
registerTsCompiler(".ts");
|
|
|
|
|
registerTsCompiler(".tsx");
|
|
|
|
|
|
|
|
|
|
const originalResolveFilename = Module._resolveFilename;
|
|
|
|
|
Module._resolveFilename = function resolve(request, parent, isMain, options) {
|
|
|
|
|
if (request === "@/core/api") {
|
|
|
|
|
const stubPath = path.resolve(__dirname, "stubs/core-api.ts");
|
|
|
|
|
return originalResolveFilename.call(this, stubPath, parent, isMain, options);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (request.startsWith("@/")) {
|
|
|
|
|
const resolved = path.resolve(srcRoot, request.slice(2));
|
|
|
|
|
return originalResolveFilename.call(this, resolved, parent, isMain, options);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return originalResolveFilename.call(this, request, parent, isMain, options);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class LocalStorageMock {
|
|
|
|
|
constructor() {
|
|
|
|
|
this._store = new Map();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
clear() {
|
|
|
|
|
this._store.clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getItem(key) {
|
|
|
|
|
return this._store.has(key) ? this._store.get(key) : null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
key(index) {
|
|
|
|
|
return Array.from(this._store.keys())[index] ?? null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
removeItem(key) {
|
|
|
|
|
this._store.delete(key);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setItem(key, value) {
|
|
|
|
|
this._store.set(key, String(value));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get length() {
|
|
|
|
|
return this._store.size;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
global.localStorage = new LocalStorageMock();
|
|
|
|
|
|
|
|
|
|
const coreApiStub = require("./stubs/core-api.ts");
|
|
|
|
|
coreApiStub.postCalls.length = 0;
|
|
|
|
|
|
|
|
|
|
const { useAuthStore } = require("../src/features/auth/services/auth.store.ts");
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
try {
|
|
|
|
|
const payload = { email: "tester@example.com" };
|
|
|
|
|
await useAuthStore.getState().requestPasswordReset(payload);
|
|
|
|
|
|
|
|
|
|
if (coreApiStub.postCalls.length !== 1) {
|
|
|
|
|
throw new Error(`Expected 1 POST call, received ${coreApiStub.postCalls.length}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const [endpoint, options] = coreApiStub.postCalls[0];
|
|
|
|
|
if (endpoint !== "/auth/request-password-reset") {
|
2025-09-25 17:42:36 +09:00
|
|
|
throw new Error(
|
|
|
|
|
`Expected endpoint \"/auth/request-password-reset\" but received \"${endpoint}\"`
|
|
|
|
|
);
|
2025-09-18 16:40:49 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!options || typeof options !== "object") {
|
|
|
|
|
throw new Error("Password reset request did not include options payload");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const body = options.body;
|
|
|
|
|
if (!body || typeof body !== "object") {
|
|
|
|
|
throw new Error("Password reset request did not include a body");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (body.email !== payload.email) {
|
|
|
|
|
throw new Error(
|
|
|
|
|
`Expected request body email to be \"${payload.email}\" but received \"${body.email}\"`
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
console.log("Password reset request forwarded correctly:", { endpoint, body });
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error("Password reset request verification failed:", error);
|
|
|
|
|
process.exitCode = 1;
|
|
|
|
|
}
|
|
|
|
|
})();
|