import { l402, LightningProvider, Invoice } from "l402-kit";
import request from "supertest";
import express from "express";
const mockProvider: LightningProvider = {
async createInvoice(amountSats: number): Promise<Invoice> {
const hash = "abc123def456abc123def456abc123def456abc123def456abc123def456abc1";
const macaroon = Buffer.from(
JSON.stringify({ hash, exp: Date.now() + 3_600_000 })
).toString("base64");
return { paymentRequest: "lnbc1...", paymentHash: hash, macaroon, amountSats };
},
async checkPayment(paymentHash: string): Promise<boolean> {
return true; // always paid in tests
},
};
const app = express();
app.get("/premium", l402({ priceSats: 10, lightning: mockProvider }), (_req, res) => {
res.json({ data: "ok" });
});
// 测试 1 — 无认证信息 → 402
const res402 = await request(app).get("/premium");
assert(res402.status === 402);
assert(res402.body.invoice === "lnbc1...");
// 测试 2 — 有效 token → 200
// SHA256("correct-preimage") 必须等于上方的 paymentHash,或使用真实的哈希对
const macaroon = res402.body.macaroon;
const preimage = "correct-preimage-hex"; // 必须满足 SHA256(preimage) == paymentHash
const res200 = await request(app)
.get("/premium")
.set("Authorization", `L402 ${macaroon}:${preimage}`);
assert(res200.status === 200);