61 lines
2.7 KiB
JavaScript
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; });
|