Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
e74390f
cover verifier report test gaps
chefbc2k Mar 19, 2026
c3b2229
Fix remaining verifier local fork funding
chefbc2k Mar 19, 2026
3408c0e
Stabilize live contract funding skips
chefbc2k Mar 19, 2026
52c4ae2
Add blocked-state workflow coverage
chefbc2k Apr 4, 2026
41e6f71
Fix verifier artifact classification and output
chefbc2k Apr 4, 2026
c31a8a1
Improve Base Sepolia setup diagnostics
chefbc2k Apr 4, 2026
bb55a0b
Improve fork-backed contract integration proofs
chefbc2k Apr 4, 2026
a0416f9
Fix fork-backed contract proof drift
chefbc2k Apr 4, 2026
a5bf715
Promote fork-backed verifier proofs
chefbc2k Apr 4, 2026
1363378
Harden fork-backed verifier runtime
chefbc2k Apr 4, 2026
2adcb73
Harden nonce retry recovery
chefbc2k Apr 4, 2026
65961dc
Pin forked writes to primary provider
chefbc2k Apr 5, 2026
e7f57e6
Stabilize whisperblock coverage retries
chefbc2k Apr 5, 2026
68ca759
Stabilize contract harness failover
chefbc2k Apr 5, 2026
f6454d6
Stabilize Base Sepolia contract integration suite
chefbc2k Apr 5, 2026
0148156
docs: record base sepolia contract sweep
chefbc2k Apr 5, 2026
e27c616
Tighten coverage accounting scope
chefbc2k Apr 5, 2026
ba8b10f
Stabilize coverage runner tempdir
chefbc2k Apr 5, 2026
b8052c4
Stabilize coverage harness and expand runtime tests
chefbc2k Apr 5, 2026
9a68536
Harden coverage shim and add helper tests
chefbc2k Apr 5, 2026
e661114
Tolerate coverage dir races and path fallbacks
chefbc2k Apr 5, 2026
1c0c725
Add helper coverage tests
chefbc2k Apr 5, 2026
fe0fbc8
Speed up register voice asset retries
chefbc2k Apr 5, 2026
481174d
docs: record coverage cleanup verification
chefbc2k Apr 5, 2026
23dc355
Document final helper coverage sweep
chefbc2k Apr 5, 2026
a06ad24
test: cover cdp smart wallet relay
chefbc2k Apr 5, 2026
f3f9567
test verifier license template helper
chefbc2k Apr 5, 2026
cae7c13
test: expand execution context coverage
chefbc2k Apr 5, 2026
e7e6ce1
Add coverage tests for app and script harnesses
chefbc2k Apr 5, 2026
2e1856f
test: expand shared api coverage
chefbc2k Apr 5, 2026
15cdd2f
test: expand vesting helper coverage
chefbc2k Apr 7, 2026
94fb7bf
test: expand setup and diagnostics coverage
chefbc2k Apr 8, 2026
12b8712
test: expand runtime coverage proofs
chefbc2k Apr 8, 2026
9d73d61
test: expand helper runtime coverage
chefbc2k Apr 8, 2026
1876592
test: deepen api surface coverage
chefbc2k Apr 8, 2026
2631fb2
test: expand alchemy debug runtime coverage
chefbc2k Apr 8, 2026
5dafdb1
Improve setup script coverage helpers
chefbc2k Apr 8, 2026
b6fe1c5
test: expand api surface coverage
chefbc2k Apr 8, 2026
63525e5
Fix runtime env boolean parsing
chefbc2k Apr 8, 2026
fa0d664
test: cover falsey env boolean parsing
chefbc2k Apr 8, 2026
9d9ed01
test: expand provider router coverage
chefbc2k Apr 8, 2026
6836dc3
test: expand alchemy diagnostics coverage
chefbc2k Apr 8, 2026
056b233
test: expand execution-context coverage
chefbc2k Apr 8, 2026
401d4e5
Classify marketplace purchase funding blocks
chefbc2k Apr 8, 2026
efb1f0b
test: expand workflow coverage branches
chefbc2k Apr 8, 2026
9054f91
Promote marketplace purchase proof via fork verifier
chefbc2k Apr 8, 2026
d5b28f2
Fix base sepolia setup fork bootstrap
chefbc2k Apr 8, 2026
a722745
Increase setup script coverage
chefbc2k Apr 8, 2026
289dc9d
Improve coverage accounting and setup tests
chefbc2k Apr 8, 2026
68aca46
Fix governance verifier fork proof
chefbc2k Apr 8, 2026
022e6db
test: expand operator setup coverage
chefbc2k Apr 8, 2026
87de66e
test: expand workflow coverage branches
chefbc2k Apr 8, 2026
461ee1f
test: expand marketplace purchase workflow coverage
chefbc2k Apr 8, 2026
7ac237b
test: expand base sepolia setup coverage
chefbc2k Apr 8, 2026
0c466c2
Improve Base Sepolia setup coverage
chefbc2k Apr 8, 2026
349f1c7
Add coverage tests for shared helpers
chefbc2k Apr 8, 2026
04f5617
test: close indexer worker coverage gaps
chefbc2k Apr 9, 2026
5d93646
test: expand claim reward workflow coverage
chefbc2k Apr 9, 2026
d334cb5
test: expand commercialization workflow coverage
chefbc2k Apr 9, 2026
852e7c3
test: expand emergency workflow coverage
chefbc2k Apr 9, 2026
17e62c9
test: expand api and indexer coverage
chefbc2k Apr 9, 2026
ada3ed0
test: harden execution context coverage
chefbc2k Apr 9, 2026
3e3cb03
test: expand workflow coverage branches
chefbc2k Apr 9, 2026
f10e35c
docs: record green live contract suite
chefbc2k Apr 9, 2026
a8a4051
test authorization introspection fallback
chefbc2k Apr 9, 2026
2c66081
test: expand license template lifecycle coverage
chefbc2k Apr 9, 2026
83cff87
Add focused workflow coverage branches
chefbc2k Apr 9, 2026
f748352
test: cover rights licensing helpers
chefbc2k Apr 9, 2026
a61b6e5
test: close reward campaign and license template gaps
chefbc2k Apr 9, 2026
176ac83
Stabilize live contract integration polling
chefbc2k Apr 9, 2026
3062b55
test: close vesting and license template branches
chefbc2k Apr 9, 2026
738d9f1
test: expand licensing workflow coverage
chefbc2k Apr 9, 2026
4cf2803
test: cover release escrow fallbacks
chefbc2k Apr 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,003 changes: 1,002 additions & 1 deletion CHANGELOG.md

Large diffs are not rendered by default.

6 changes: 4 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
"coverage:check": "tsx scripts/check-wrapper-coverage.ts && tsx scripts/check-http-api-coverage.ts",
"codegen": "pnpm run sync:abis && pnpm run sync:method-policy && pnpm run build:manifest && pnpm run sync:event-projections && pnpm run build:typechain && pnpm run build:abi-registry && pnpm run build:rpc-registry && pnpm run seed:api-surface && pnpm run build:http-api && pnpm run build:wrappers && pnpm run coverage:check",
"build": "pnpm run codegen && pnpm -r build",
"test": "vitest run",
"test:coverage": "vitest run --coverage.enabled true --coverage.reporter=text --maxWorkers 1",
"test": "vitest run --maxWorkers 1",
"test:coverage": "tsx scripts/run-test-coverage.ts",
"test:contract:api:base-sepolia": "API_LAYER_RUN_CONTRACT_INTEGRATION=1 vitest run packages/api/src/app.contract-integration.test.ts --maxWorkers 1",
"baseline:show": "tsx scripts/show-validated-baseline.ts",
"baseline:verify": "tsx scripts/verify-validated-baseline.ts",
Expand All @@ -46,7 +46,9 @@
"@types/express": "^5.0.3",
"@types/node": "^24.3.0",
"@types/pg": "^8.15.5",
"@vitest/coverage-istanbul": "3.2.4",
"@vitest/coverage-v8": "^3.2.4",
"c8": "^11.0.0",
"dotenv": "^16.4.7",
"ethers": "^6.15.0",
"tsx": "^4.20.5",
Expand Down
202 changes: 202 additions & 0 deletions packages/api/src/app.behavior.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";

import { HttpError } from "./shared/errors.js";

const mocks = vi.hoisted(() => {
const providerStatus = {
primary: "cbdp",
secondary: "alchemy",
active: "cbdp",
failoverActive: false,
};

const createApiExecutionContext = vi.fn(() => ({
providerRouter: {
getStatus: vi.fn(() => providerStatus),
},
}));

return {
providerStatus,
createApiExecutionContext,
getTransactionRequest: vi.fn(),
getTransactionStatus: vi.fn(),
mountDomainModules: vi.fn(),
createWorkflowRouter: vi.fn(() => (_request: unknown, _response: unknown, next: () => void) => next()),
};
});

vi.mock("./modules/index.js", () => ({
mountDomainModules: mocks.mountDomainModules,
}));

vi.mock("./shared/execution-context.js", () => ({
createApiExecutionContext: mocks.createApiExecutionContext,
getTransactionRequest: mocks.getTransactionRequest,
getTransactionStatus: mocks.getTransactionStatus,
}));

vi.mock("./workflows/index.js", () => ({
createWorkflowRouter: mocks.createWorkflowRouter,
}));

import { createApiServer } from "./app.js";

const originalEnv = { ...process.env };

async function startServer(options: Parameters<typeof createApiServer>[0] = {}) {
const server = createApiServer(options).listen();
await new Promise((resolve) => setTimeout(resolve, 25));
const address = server.address();
const port = typeof address === "object" && address ? address.port : 8787;
return {
server,
port,
};
}

async function jsonCall(port: number, path: string) {
const response = await fetch(`http://127.0.0.1:${port}${path}`);
return {
status: response.status,
payload: await response.json(),
};
}

describe("createApiServer coverage branches", () => {
beforeEach(() => {
process.env = { ...originalEnv };
vi.clearAllMocks();
});

afterEach(() => {
process.env = { ...originalEnv };
});

it("returns the configured system health chain id and provider status", async () => {
process.env.API_LAYER_CHAIN_ID = "31337";
process.env.CHAIN_ID = "84532";

const { server, port } = await startServer({ port: 0, quiet: true });

try {
const health = await jsonCall(port, "/v1/system/health");
const providerStatus = await jsonCall(port, "/v1/system/provider-status");

expect(health).toEqual({
status: 200,
payload: { ok: true, chainId: 31337 },
});
expect(providerStatus).toEqual({
status: 200,
payload: mocks.providerStatus,
});
expect(mocks.mountDomainModules).toHaveBeenCalledOnce();
expect(mocks.createWorkflowRouter).toHaveBeenCalledOnce();
} finally {
server.close();
}
});

it("returns transaction request payloads on success", async () => {
mocks.getTransactionRequest.mockResolvedValue({
id: "req-123",
status: "queued",
});

const { server, port } = await startServer({ port: 0, quiet: true });

try {
const result = await jsonCall(port, "/v1/transactions/requests/req-123");

expect(result).toEqual({
status: 200,
payload: {
id: "req-123",
status: "queued",
},
});
expect(mocks.getTransactionRequest).toHaveBeenCalledWith(
expect.objectContaining({
providerRouter: expect.any(Object),
}),
"req-123",
);
} finally {
server.close();
}
});

it("omits diagnostics when a transaction request error does not include them", async () => {
mocks.getTransactionRequest.mockRejectedValue(new Error("boom"));

const { server, port } = await startServer({ port: 0, quiet: true });

try {
const result = await jsonCall(port, "/v1/transactions/requests/req-404");

expect(result).toEqual({
status: 500,
payload: {
error: "boom",
},
});
} finally {
server.close();
}
});

it("includes diagnostics when transaction status lookup fails with them", async () => {
mocks.getTransactionStatus.mockRejectedValue(
new HttpError(429, "rate limit exceeded", { retryAfterMs: 500 }),
);

const { server, port } = await startServer({ port: 0, quiet: true });

try {
const result = await jsonCall(port, "/v1/transactions/0xabc");

expect(result).toEqual({
status: 429,
payload: {
error: "rate limit exceeded",
diagnostics: { retryAfterMs: 500 },
},
});
} finally {
server.close();
}
});

it("uses the environment port and logs startup when quiet mode is disabled", async () => {
process.env.API_LAYER_PORT = "0";
const logSpy = vi.spyOn(console, "log").mockImplementation(() => {});

const server = createApiServer().listen();

try {
await new Promise((resolve) => setTimeout(resolve, 25));
expect(logSpy).toHaveBeenCalledWith("USpeaks API listening on 0");
} finally {
server.close();
logSpy.mockRestore();
}
});

it("prefers the explicit listen port and falls back to CHAIN_ID when API_LAYER_CHAIN_ID is unset", async () => {
process.env.CHAIN_ID = "84531";

const { server, port } = await startServer({ port: 0, quiet: true });

try {
const health = await jsonCall(port, "/v1/system/health");

expect(health).toEqual({
status: 200,
payload: { ok: true, chainId: 84531 },
});
} finally {
server.close();
}
});
});
Loading