Files
rea/tests/composition/evmModuleContract.test.ts
T
Ysopwnableandfactory-droid[bot] 4f4f6cd7b5 test(evm): verify static descriptor bindings before use (#2427)
Verify the static EVM descriptor operation, CLI command, factory and input/output schema bindings with compiler-backed negative assignability checks. Prove SDK duplicate registration and invalid target input fail before provider invocation, preserving named bindings and separate lazy owners.

Validated complete supported single-thread typecheck, focused12 SDK/composition cases plus a targeted2-case provider-spy rerun, static checks, checked pre-push, manual review and all exact-head CI checks. Production behavior/defaults and provider identity remain unchanged. Dynamic third-party module admission and ABI negotiation remain deferred.

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-10-13 09:07:40 +08:00

63 lines
2.3 KiB
TypeScript

import { expect, expectTypeOf, it, vi } from "vitest";
import { z } from "zod";
import { evmInterfaceModule } from "../../src/composition/evm.js";
import { wasmArtifactModule } from "../../src/composition/wasm.js";
import { CLI_COMMANDS } from "../../src/cliCommandNames.js";
import { INSPECT_EVM_INTERFACE_CONTRACT } from "../../src/contracts/evm/evmToolContracts.js";
it("rejects incompatible static bindings through the complete project typecheck", () => {
// expect-type's negative assertions are checked by tsc, not the runtime
// test runner. No malformed descriptor is registered or executed here.
expectTypeOf({
...evmInterfaceModule,
contract: wasmArtifactModule.contract,
}).not.toExtend<typeof evmInterfaceModule>();
expectTypeOf({
...evmInterfaceModule,
cliCommand: CLI_COMMANDS.inspectWasmArtifact,
}).not.toExtend<typeof evmInterfaceModule>();
expectTypeOf({
...evmInterfaceModule,
create: wasmArtifactModule.create,
}).not.toExtend<typeof evmInterfaceModule>();
expectTypeOf({
...evmInterfaceModule,
contract: {
...evmInterfaceModule.contract,
inputSchema: z.strictObject({ unrelated: z.string() }),
},
}).not.toExtend<typeof evmInterfaceModule>();
expectTypeOf({
...evmInterfaceModule,
contract: {
...evmInterfaceModule.contract,
outputSchema: z.strictObject({ unrelated: z.string() }),
},
}).not.toExtend<typeof evmInterfaceModule>();
});
it("keeps the named binding and gives each caller a separate lazy service owner", async () => {
expect(evmInterfaceModule.contract).toBe(INSPECT_EVM_INTERFACE_CONTRACT);
expect(evmInterfaceModule.cliCommand).toBe(CLI_COMMANDS.inspectEvmInterface);
const first = evmInterfaceModule.create({});
const second = evmInterfaceModule.create({});
try {
expect(first).not.toBe(second);
expect(first.provider).not.toBe(second.provider);
await first.close();
const inspect = vi.spyOn(second.provider, "inspect");
const invalid = await second.inspect({
path: "relative.hex",
encoding: "hex",
});
expect(invalid).toMatchObject({
ok: false,
error: { _tag: "AnalysisInputError" },
});
expect(inspect).not.toHaveBeenCalled();
} finally {
await first.close();
await second.close();
}
});