Files
agents-marketplace/tests/unit/surplus-dashboard.test.ts
2026-08-28 10:28:39 +02:00

242 lines
7.5 KiB
TypeScript

import { describe, expect, it, vi } from "vitest";
import request from "supertest";
import type { SurplusManagerConfig } from "../../supplier/src/surplus/config.js";
import {
SurplusDashboardService,
type SurplusDashboardSnapshot,
} from "../../supplier/src/surplus/dashboard.js";
import { createSurplusServer } from "../../supplier/src/cli/surplus-seller.js";
import type { SurplusControllerStatus } from "../../supplier/src/surplus/controller.js";
const STATUS: SurplusControllerStatus = {
ok: true,
phase: "active",
live: true,
model: "deepseek-v4-flash",
providerModelId: "deepseek/deepseek-v4-flash",
offerId: "offer-1",
inputUsdPer1m: "0.003972",
outputUsdPer1m: "0.007944",
competitorId: "external",
remainingAllowanceUsd: "16.313443",
reserveThresholdUsd: "1.00",
totalEarnedUsd: "0.186810",
lastCycleAt: "2026-08-28T12:00:00.000Z",
lastSuccessAt: "2026-08-28T12:00:00.000Z",
lastError: null,
};
function config(): SurplusManagerConfig {
return {
live: true,
apiBaseUrl: "https://api.surplusintelligence.ai",
sellerApiKey: "si_seller_test_secret",
providerApiKey: "sk-or-v1-test-secret",
providerBaseUrl: "https://openrouter.ai/api/v1",
capacityBaseUrl: "https://openrouter.ai/api",
perOfferCapUsd: "0.05",
aggregateCapUsd: "0.05",
sellerWallet: "0x1111111111111111111111111111111111111111",
payoutAddress: "0x1111111111111111111111111111111111111111",
maxCandidateOrderBooks: 10,
reserveUsd: "1.00",
maxProviderLimitUsd: "20.00",
recoveryBps: 490,
undercutBps: 10,
pollIntervalMs: 300_000,
requestTimeoutMs: 120_000,
stopAfterTrades: 0,
settledStatuses: ["confirmed"],
statePath: "/tmp/surplus-dashboard-test.json",
port: 8080,
};
}
function snapshot(): SurplusDashboardSnapshot {
return {
generatedAt: "2026-08-28T12:00:00.000Z",
controller: STATUS,
identity: {
sellerWallet: "0x1111111111111111111111111111111111111111",
payoutAddress: "0x1111111111111111111111111111111111111111",
},
provider: {
name: "OpenRouter",
hardLimitUsd: "20.000000",
remainingUsd: "16.313443",
usedUsd: "3.686557",
reserveUsd: "1.00",
estimatedDailyExposureUsd: "1.020408",
},
surplus: {
offer: {
id: "offer-1",
model: "deepseek-v4-flash",
providerModel: "deepseek/deepseek-v4-flash",
status: "active",
dailyCapUsd: "0.050000",
costMultiplier: 0.04995,
inputUsdPer1m: "0.003972",
outputUsdPer1m: "0.007944",
rank: 10,
available: true,
healthy: true,
trusted: true,
trades24h: 429,
volume24hUsd: "0.064030",
capRemainingUsd: "0.050000",
},
earnings: {
totalUsd: "0.186810",
pendingUsd: "0.176817",
paidUsd: "0.009993",
requests: 1_093,
tokens: 104_698_905,
today: null,
topModel: "deepseek-v4-flash",
payoutHoldReason: "new_seller",
payoutHoldReleasesAt: "2026-08-29T11:24:42.552Z",
},
recentSales: [],
},
vector: {
status: "retired",
model: "deepseek/deepseek-v4-flash",
supplierWallet: "addr1test",
advertRef: `${"a".repeat(64)}#0`,
retirementTransaction: "b".repeat(64),
retiredOn: "2026-08-27",
historicalAp3xEarned: "1.600000",
historicalSettledJobs: 8,
historicalUpstreamSpendUsd: "0.000093",
},
};
}
describe("SurplusDashboardService", () => {
it("combines safe live metrics with the Vector migration record", async () => {
const listAllOffers = vi.fn(async () => [{
id: "offer-1",
model: "deepseek-v4-flash",
sellerBaseUrl: "https://openrouter.ai/api/v1",
status: "active" as const,
capDailyUsd: 0.05,
costMultiplierPpm: 49_950,
inputMicroUsdPer1m: 3_972,
outputMicroUsdPer1m: 7_944,
}]);
const getEarnings = vi.fn(async () => ({
totalEarnedMicroUsd: 186_810,
pendingMicroUsd: 176_817,
paidMicroUsd: 9_993,
daily: [{
day: "2026-08-28",
earnedUsd: 0.01,
inputTokens: 10,
outputTokens: 2,
requests: 1,
totalTokens: 12,
}],
byModel: [],
requestCount: 1_093,
tokenCount: 104_698_905,
topModel: "deepseek-v4-flash",
payoutHoldReason: "new_seller",
payoutHoldReleasesAt: "2026-08-29T11:24:42.552Z",
recentSales: [{
id: "sale-1",
model: "deepseek-v4-flash",
offerId: "offer-1",
settlementStatus: "confirmed",
createdAt: "2026-08-28T11:00:00.000Z",
sellerCostMicroUsd: 83,
inputTokens: 10,
outputTokens: 2,
cacheReadTokens: 3,
effectiveInputUsdPer1m: 0.003972,
effectiveOutputUsdPer1m: 0.007944,
transactionHash: "0x" + "c".repeat(64),
}],
}));
const getOrderBook = vi.fn(async () => ({
model: "deepseek-v4-flash",
offers: [{
id: "offer-1",
seller: "0x1111111111111111111111111111111111111111",
sellerBaseUrl: "https://openrouter.ai/api/v1",
inputMicroUsdPer1m: 3_972,
outputMicroUsdPer1m: 7_944,
available: true,
healthy: true,
trusted: true,
trades24h: 429,
rank: 10,
capRemainingMicroUsd: 50_000,
volume24hMicroUsd: 64_030,
}],
}));
const service = new SurplusDashboardService({
controller: { snapshot: () => STATUS },
client: { listAllOffers, getEarnings, getOrderBook },
allowance: {
readAllowance: async () => ({
limitUsdNanos: 20_000_000_000n,
remainingUsdNanos: 16_313_443_131n,
reset: null,
checkedAtMs: Date.parse("2026-08-28T12:00:00.000Z"),
}),
},
config: config(),
now: () => Date.parse("2026-08-28T12:00:00.000Z"),
});
const first = await service.getSnapshot();
const second = await service.getSnapshot();
expect(first.surplus.offer).toMatchObject({
id: "offer-1",
rank: 10,
available: true,
dailyCapUsd: "0.050000",
});
expect(first.surplus.earnings).toMatchObject({
totalUsd: "0.186810",
requests: 1_093,
topModel: "deepseek-v4-flash",
});
expect(first.provider).toMatchObject({
usedUsd: "3.686556",
estimatedDailyExposureUsd: "1.020408",
});
expect(first.vector).toMatchObject({ status: "retired", historicalSettledJobs: 8 });
expect(first.surplus.recentSales[0]).toMatchObject({
settlementStatus: "confirmed",
revenueUsd: "0.000083",
});
expect(JSON.stringify(first)).not.toContain("si_seller_test_secret");
expect(JSON.stringify(first)).not.toContain("sk-or-v1-test-secret");
expect(second).toBe(first);
expect(listAllOffers).toHaveBeenCalledTimes(1);
expect(getEarnings).toHaveBeenCalledTimes(1);
expect(getOrderBook).toHaveBeenCalledTimes(1);
});
});
describe("private supplier dashboard data surface", () => {
it("serves redacted data internally without hosting a dashboard page", async () => {
const data = snapshot();
const server = createSurplusServer(
{ snapshot: () => STATUS, healthy: () => true },
{ getSnapshot: async () => data },
);
const api = await request(server).get("/internal/resale-dashboard");
expect(api.status).toBe(200);
expect(api.body).toEqual(data);
expect(JSON.stringify(api.body)).not.toContain("test-secret");
expect((await request(server).get("/reseller")).status).toBe(404);
expect((await request(server).get("/")).status).toBe(404);
server.close();
});
});