Skip to main content
Glama

Lighthouse MCP

schemas.test.ts5.33 kB
import { describe, it, expect } from "vitest"; import { baseSchemas, coreWebVitalsSchema, performanceBudgetSchema } from "./schemas"; describe("baseSchemas", () => { describe("url validator", () => { it("should accept valid HTTP URLs", () => { const result = baseSchemas.url.safeParse("http://example.com"); expect(result.success).toBe(true); }); it("should accept valid HTTPS URLs", () => { const result = baseSchemas.url.safeParse("https://example.com"); expect(result.success).toBe(true); }); it("should reject non-HTTP/HTTPS protocols", () => { const result = baseSchemas.url.safeParse("ftp://example.com"); expect(result.success).toBe(false); if (!result.success) { expect(result.error.errors[0].message).toBe("Must be a valid HTTP or HTTPS URL"); } }); it("should reject invalid URLs", () => { const result = baseSchemas.url.safeParse("not-a-url"); expect(result.success).toBe(false); }); it("should reject malicious URLs", () => { const result = baseSchemas.url.safeParse("javascript:alert(1)"); expect(result.success).toBe(false); }); }); describe("device validator", () => { it("should accept desktop", () => { const result = baseSchemas.device.safeParse("desktop"); expect(result.success).toBe(true); expect(result.data).toBe("desktop"); }); it("should accept mobile", () => { const result = baseSchemas.device.safeParse("mobile"); expect(result.success).toBe(true); expect(result.data).toBe("mobile"); }); it("should default to desktop", () => { const result = baseSchemas.device.safeParse(undefined); expect(result.success).toBe(true); expect(result.data).toBe("desktop"); }); it("should reject invalid device types", () => { const result = baseSchemas.device.safeParse("tablet"); expect(result.success).toBe(false); }); }); describe("throttling validator", () => { it("should accept boolean values", () => { expect(baseSchemas.throttling.safeParse(true).success).toBe(true); expect(baseSchemas.throttling.safeParse(false).success).toBe(true); }); it("should default to false", () => { const result = baseSchemas.throttling.safeParse(undefined); expect(result.success).toBe(true); expect(result.data).toBe(false); }); }); describe("categories validator", () => { it("should accept valid categories", () => { const validCategories = ["performance", "accessibility", "best-practices", "seo", "pwa"]; const result = baseSchemas.categories.safeParse(validCategories); expect(result.success).toBe(true); }); it("should reject invalid categories", () => { const result = baseSchemas.categories.safeParse(["invalid-category"]); expect(result.success).toBe(false); }); it("should be optional", () => { const result = baseSchemas.categories.safeParse(undefined); expect(result.success).toBe(true); }); }); }); describe("coreWebVitalsSchema", () => { it("should accept valid Core Web Vitals configuration", () => { const validConfig = { url: "https://example.com", device: "mobile" as const, includeDetails: true, threshold: { lcp: 2.5, fid: 100, cls: 0.1, }, }; const result = coreWebVitalsSchema.url.safeParse(validConfig.url); expect(result.success).toBe(true); }); it("should validate threshold object correctly", () => { const thresholdSchema = coreWebVitalsSchema.threshold; const validThreshold = { lcp: 2.5, fid: 100, cls: 0.1, }; const result = thresholdSchema.safeParse(validThreshold); expect(result.success).toBe(true); }); it("should reject negative threshold values", () => { const thresholdSchema = coreWebVitalsSchema.threshold; const invalidThreshold = { lcp: -1, }; const result = thresholdSchema.safeParse(invalidThreshold); expect(result.success).toBe(false); }); }); describe("performanceBudgetSchema", () => { it("should validate performance budget correctly", () => { const validBudget = { url: "https://example.com", device: "desktop" as const, budget: { performanceScore: 90, firstContentfulPaint: 1500, largestContentfulPaint: 2500, totalBlockingTime: 200, cumulativeLayoutShift: 0.1, speedIndex: 3000, }, }; const urlResult = performanceBudgetSchema.url.safeParse(validBudget.url); expect(urlResult.success).toBe(true); const budgetResult = performanceBudgetSchema.budget.safeParse(validBudget.budget); expect(budgetResult.success).toBe(true); }); it("should reject performance score outside 0-100 range", () => { const invalidBudget = { performanceScore: 150, }; const result = performanceBudgetSchema.budget.safeParse(invalidBudget); expect(result.success).toBe(false); }); it("should reject negative metric values", () => { const invalidBudget = { performanceScore: 90, firstContentfulPaint: -100, }; const result = performanceBudgetSchema.budget.safeParse(invalidBudget); expect(result.success).toBe(false); }); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/danielsogl/lighthouse-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server