import { tap, expect } from '@push.rocks/tapbundle'; import { Http01MemoryHandler } from '../ts/handlers/Http01MemoryHandler.js'; tap.test('Http01MemoryHandler serves in-memory challenges and cleans up', async () => { const handler = new Http01MemoryHandler(); const token = 'testtoken'; const keyAuth = 'keyAuthValue'; const webPath = `/.well-known/acme-challenge/${token}`; const challenge = { type: 'http-01', token, keyAuthorization: keyAuth, webPath }; // Prepare challenge (store in memory) await handler.prepare(challenge); // Serve existing challenge without next() const req1: any = { url: webPath }; const res1: any = { statusCode: 0, headers: {} as Record, body: '', setHeader(name: string, value: string) { this.headers[name] = value; }, end(body?: string) { this.body = body || ''; }, }; handler.handleRequest(req1, res1); expect(res1.statusCode).toEqual(200); expect(res1.body).toEqual(keyAuth); expect(res1.headers['content-type']).toEqual('text/plain'); // Cleanup challenge (remove from memory) await handler.cleanup(challenge); // Serve after cleanup without next() should give 404 const req2: any = { url: webPath }; const res2: any = { statusCode: 0, headers: {} as Record, body: '', setHeader(name: string, value: string) { this.headers[name] = value; }, end(body?: string) { this.body = body || ''; }, }; handler.handleRequest(req2, res2); expect(res2.statusCode).toEqual(404); // Serve after cleanup with next() should call next const req3: any = { url: webPath }; let nextCalled = false; const next = () => { nextCalled = true; }; const res3: any = { statusCode: 0, headers: {} as Record, body: '', setHeader(name: string, value: string) { this.headers[name] = value; }, end(body?: string) { this.body = body || ''; }, }; handler.handleRequest(req3, res3, next); expect(nextCalled).toEqual(true); }); export default tap.start();