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; });