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);
  });
});