MotorSignal-App/website/tests/navigation-auth.cjs

61 lines
2.7 KiB
JavaScript

const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const Module = require('node:module');
const ts = require('typescript');
const { NextRequest } = require('next/server');
Module._extensions['.ts'] = (loaded, filename) => loaded._compile(
ts.transpileModule(fs.readFileSync(filename, 'utf8'), {
compilerOptions: { module: ts.ModuleKind.CommonJS },
}).outputText,
filename,
);
let refreshToken = 'test-refresh';
function loadRoute() {
const filename = path.resolve(__dirname, '../app/api/auth/[action]/route.ts');
const loaded = new Module(filename, module);
loaded.filename = filename;
loaded.paths = module.paths;
const originalRequire = loaded.require.bind(loaded);
loaded.require = (name) => name === 'next/headers'
? { cookies: async () => ({ get: () => refreshToken ? { value: refreshToken } : undefined }) }
: originalRequire(name);
loaded._compile(ts.transpileModule(fs.readFileSync(filename, 'utf8'), {
compilerOptions: { module: ts.ModuleKind.CommonJS },
}).outputText, filename);
return loaded.exports.POST;
}
(async () => {
const post = loadRoute();
const request = (origin = 'https://motorsignal.app') => new NextRequest('http://127.0.0.1:3001/api/auth/logout', {
method: 'POST', headers: { origin, host: 'motorsignal.app', 'x-forwarded-proto': 'https' },
});
const context = { params: Promise.resolve({ action: 'logout' }) };
let called = false;
global.fetch = async (_, options) => {
called = true;
assert.deepEqual(JSON.parse(options.body), { refresh_token: 'test-refresh' });
return new Response(null, { status: 204 });
};
assert.equal((await post(request('https://other.example'), context)).status, 403);
assert.equal(called, false);
const response = await post(request(), context);
assert.equal(response.status, 204);
assert.equal(called, true);
assert.equal(response.cookies.get('motorsignal_access_token').value, '');
assert.equal(response.cookies.get('motorsignal_refresh_token').value, '');
global.fetch = async () => { throw new Error('offline'); };
assert.equal((await post(request(), context)).status, 502);
refreshToken = undefined;
assert.equal((await post(request(), context)).status, 204);
global.fetch = async () => new Response(null, { status: 204 });
const reset = new NextRequest('https://motorsignal.app/api/auth/password-reset', {
method: 'POST', body: JSON.stringify({ token: 'dummy', password: 'dummy-password' }),
});
assert.equal((await post(reset, { params: Promise.resolve({ action: 'password-reset' }) })).status, 204);
console.log('PASS: logout origin, revocation, cookies, outages, expired session, and reset 204');
})().catch(error => { console.error(error); process.exitCode = 1; });