SPB Git

spb/vquant Public MIT

VibeQuant — AI-powered institutional-grade financial intelligence platform.

TypeScript 84.3% Python 11.7% JavaScript 1.6% CSS 1.5% HTML 0.7%
4.7 KB · 163 lines typescript
Raw Blame History
1/*2 * =============================================================================3 *  VibeQuant (vquant) — AI-Powered Financial Intelligence Platform4 * -----------------------------------------------------------------------------5 *  File:      server/routes/validation.test.ts6 *7 *  Author:    Simon-Pierre Boucher8 *  Contact:   contact@spboucher.ai9 *  Website:   https://www.spboucher.ai10 *  Demo:      https://www.vquant.ai11 *  License:   MIT (see LICENSE)12 *13 *  Copyright © 2026 Simon-Pierre Boucher. All rights reserved.14 * =============================================================================15 */1617import { describe, it, expect } from "vitest";18import {19  chatBodySchema,20  registerBodySchema,21  loginBodySchema,22  heartbeatBodySchema,23  shareBodySchema,24} from "./validation";2526describe("chatBodySchema", () => {27  it("accepts valid chat request", () => {28    const result = chatBodySchema.safeParse({29      query: "Analyze AAPL stock",30    });31    expect(result.success).toBe(true);32    if (result.success) {33      expect(result.data.query).toBe("Analyze AAPL stock");34      expect(result.data.history).toEqual([]);35    }36  });3738  it("accepts request with history", () => {39    const result = chatBodySchema.safeParse({40      query: "Follow up question",41      history: [{ question: "Previous Q", answer: "Previous A" }],42      sessionId: "abc-123",43    });44    expect(result.success).toBe(true);45    if (result.success) {46      expect(result.data.history).toHaveLength(1);47      expect(result.data.sessionId).toBe("abc-123");48    }49  });5051  it("rejects empty query", () => {52    const result = chatBodySchema.safeParse({ query: "" });53    expect(result.success).toBe(false);54  });5556  it("rejects missing query", () => {57    const result = chatBodySchema.safeParse({});58    expect(result.success).toBe(false);59  });6061  it("rejects query exceeding max length", () => {62    const result = chatBodySchema.safeParse({ query: "x".repeat(10001) });63    expect(result.success).toBe(false);64  });6566  it("accepts valid model selection", () => {67    const result = chatBodySchema.safeParse({68      query: "Test",69      model: "claude-opus-4-6",70    });71    expect(result.success).toBe(true);72    if (result.success) {73      expect(result.data.model).toBe("claude-opus-4-6");74    }75  });7677  it("defaults model to claude-opus-4-8", () => {78    const result = chatBodySchema.safeParse({ query: "Test" });79    expect(result.success).toBe(true);80    if (result.success) {81      expect(result.data.model).toBe("claude-opus-4-8");82    }83  });8485  it("rejects invalid model", () => {86    const result = chatBodySchema.safeParse({87      query: "Test",88      model: "gpt-4",89    });90    expect(result.success).toBe(false);91  });92});9394describe("registerBodySchema", () => {95  it("accepts valid name", () => {96    const result = registerBodySchema.safeParse({ name: "Alice" });97    expect(result.success).toBe(true);98  });99100  it("rejects name shorter than 2 chars", () => {101    const result = registerBodySchema.safeParse({ name: "A" });102    expect(result.success).toBe(false);103  });104105  it("rejects missing name", () => {106    const result = registerBodySchema.safeParse({});107    expect(result.success).toBe(false);108  });109});110111describe("loginBodySchema", () => {112  it("accepts valid token", () => {113    const result = loginBodySchema.safeParse({ token: "vquant-abc1234" });114    expect(result.success).toBe(true);115  });116117  it("rejects empty token", () => {118    const result = loginBodySchema.safeParse({ token: "" });119    expect(result.success).toBe(false);120  });121});122123describe("heartbeatBodySchema", () => {124  it("accepts valid heartbeat", () => {125    const result = heartbeatBodySchema.safeParse({126      sessionId: "sess-123",127      status: "generating",128      currentQuery: "Analyzing NVDA",129    });130    expect(result.success).toBe(true);131  });132133  it("accepts minimal heartbeat (sessionId only)", () => {134    const result = heartbeatBodySchema.safeParse({ sessionId: "sess-123" });135    expect(result.success).toBe(true);136  });137138  it("rejects missing sessionId", () => {139    const result = heartbeatBodySchema.safeParse({ status: "idle" });140    expect(result.success).toBe(false);141  });142});143144describe("shareBodySchema", () => {145  it("accepts valid share request", () => {146    const result = shareBodySchema.safeParse({147      question: "What is AAPL?",148      answer: "Apple Inc. is...",149    });150    expect(result.success).toBe(true);151  });152153  it("rejects missing question", () => {154    const result = shareBodySchema.safeParse({ answer: "Some answer" });155    expect(result.success).toBe(false);156  });157158  it("rejects missing answer", () => {159    const result = shareBodySchema.safeParse({ question: "Some question" });160    expect(result.success).toBe(false);161  });162});163