Bot & Automation
Market AI
/root/hermes-projects/Market AI
packages/core/src/analysis-engine.test.ts
text
import { describe, expect, it } from "vitest";
import {
buildMockCandidate,
filterCandidates,
generateMemeSignalAnalysis,
inferModeFromText,
inferTokenQueryFromText,
scoreMemeCandidate,
} from "./analysis-engine.js";
describe("meme coin analysis engine", () => {
it("infers token query and trading mode from free text", () => {
expect(inferTokenQueryFromText("BONK bagus dibeli?")).toBe("DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263");
expect(inferModeFromText("token baru listing untuk snipe?")).toBe("snipe");
expect(inferModeFromText("ini aman untuk beli?")).toBe("conservative");
});
it("scores risky candidates lower with explicit warnings", () => {
const candidate = scoreMemeCandidate(
buildMockCandidate({
metrics: {
priceUsd: 0.00001,
liquidityUsd: 2500,
volumeH24: 4000,
buysH24: 20,
sellsH24: 80,
priceChangeH1: 65,
priceChangeH24: 180,
pairCreatedAt: new Date().toISOString(),
},
}),
);
expect(candidate.riskLevel).toBe("Extreme");
expect(candidate.verdict).toBe("SKIP");
expect(candidate.warnings.length).toBeGreaterThan(2);
});
it("generates risk-first meme signal", () => {
const candidate = buildMockCandidate();
const signal = generateMemeSignalAnalysis({ query: "BONK", mode: "momentum" }, candidate);
expect(signal.candidate.token.symbol).toBe("BONK");
expect(signal.confidence).toBeLessThanOrEqual(88);
expect(signal.disclaimer).toContain("Meme coin");
});
it("filters candidates by scanner criteria", () => {
const candidates = [buildMockCandidate()];
const result = filterCandidates(candidates, { chainId: "solana", minScore: 50 });
expect(result).toHaveLength(1);
});
});