feat: implement permanent audio access grants with pay-to-unlock
This commit is contained in:
67
test/access.test.js
Normal file
67
test/access.test.js
Normal file
@@ -0,0 +1,67 @@
|
||||
"use strict";
|
||||
|
||||
const test = require("node:test");
|
||||
const assert = require("node:assert/strict");
|
||||
const { WalletStore } = require("../src/lib/wallet");
|
||||
const { AudioAccessStore } = require("../src/lib/access");
|
||||
|
||||
const audio = {
|
||||
id: "a1",
|
||||
ownerUserId: "owner-1",
|
||||
creditsCharged: 3,
|
||||
};
|
||||
|
||||
test("owner can access without payment", () => {
|
||||
const access = new AudioAccessStore();
|
||||
const result = access.canAccess({ audio, userId: "owner-1" });
|
||||
assert.equal(result.allowed, true);
|
||||
assert.equal(result.reason, "owner");
|
||||
});
|
||||
|
||||
test("non-owner requires payment", () => {
|
||||
const access = new AudioAccessStore();
|
||||
const result = access.canAccess({ audio, userId: "u2" });
|
||||
assert.equal(result.allowed, false);
|
||||
assert.equal(result.reason, "payment_required");
|
||||
assert.equal(result.creditsRequired, 3);
|
||||
});
|
||||
|
||||
test("unlock debits same credits and creates permanent grant", () => {
|
||||
const access = new AudioAccessStore();
|
||||
const wallet = new WalletStore();
|
||||
|
||||
wallet.applyTransaction({
|
||||
userId: "u2",
|
||||
type: "credit",
|
||||
amount: 10,
|
||||
reason: "topup",
|
||||
idempotencyKey: "credit-u2",
|
||||
});
|
||||
|
||||
const unlocked = access.unlockWithCredits({ audio, userId: "u2", wallet });
|
||||
assert.equal(unlocked.unlocked, true);
|
||||
assert.equal(unlocked.charged, 3);
|
||||
assert.equal(wallet.getBalance("u2"), 7);
|
||||
|
||||
const canAccess = access.canAccess({ audio, userId: "u2" });
|
||||
assert.equal(canAccess.allowed, true);
|
||||
assert.equal(canAccess.reason, "grant");
|
||||
});
|
||||
|
||||
test("second unlock call is idempotent and does not double charge", () => {
|
||||
const access = new AudioAccessStore();
|
||||
const wallet = new WalletStore();
|
||||
|
||||
wallet.applyTransaction({
|
||||
userId: "u2",
|
||||
type: "credit",
|
||||
amount: 10,
|
||||
reason: "topup",
|
||||
idempotencyKey: "credit-u2-2",
|
||||
});
|
||||
|
||||
access.unlockWithCredits({ audio, userId: "u2", wallet });
|
||||
access.unlockWithCredits({ audio, userId: "u2", wallet });
|
||||
|
||||
assert.equal(wallet.getBalance("u2"), 7);
|
||||
});
|
||||
Reference in New Issue
Block a user