import { generatePitchDeck, PitchDeckInput } from "./pitch-generator.js";
describe("generatePitchDeck", () => {
const validInput: PitchDeckInput = {
companyName: "TechFlow",
problem: "Small businesses waste 20+ hours per week on manual data entry and reconciliation",
solution: "AI-powered automation platform that eliminates manual data work with 99.9% accuracy",
targetMarket: "50M small businesses globally spending $200B on administrative tasks",
businessModel: "SaaS subscription: $99/month for startups, $299/month for SMBs, enterprise custom pricing",
industry: "Fintech",
};
test("generates a pitch deck with required fields", () => {
const result = generatePitchDeck(validInput);
expect(result.companyName).toBe("TechFlow");
expect(result.slides).toBeInstanceOf(Array);
expect(result.slides.length).toBeGreaterThanOrEqual(8); // At least 8 slides
expect(result.generatedAt).toBeDefined();
});
test("includes all required slide types", () => {
const result = generatePitchDeck(validInput);
const slideTypes = result.slides.map((s) => s.type);
expect(slideTypes).toContain("title");
expect(slideTypes).toContain("problem");
expect(slideTypes).toContain("solution");
expect(slideTypes).toContain("market");
expect(slideTypes).toContain("business-model");
expect(slideTypes).toContain("traction");
expect(slideTypes).toContain("team");
expect(slideTypes).toContain("financials");
expect(slideTypes).toContain("closing");
});
test("includes company name in slides", () => {
const result = generatePitchDeck(validInput);
const titleSlide = result.slides.find((s) => s.type === "title");
expect(titleSlide?.content).toContain("TechFlow");
const solutionSlide = result.slides.find((s) => s.type === "solution");
expect(solutionSlide?.content).toContain("TechFlow");
});
test("includes problem in problem slide", () => {
const result = generatePitchDeck(validInput);
const problemSlide = result.slides.find((s) => s.type === "problem");
expect(problemSlide?.content).toContain("manual data entry");
});
test("includes solution in solution slide", () => {
const result = generatePitchDeck(validInput);
const solutionSlide = result.slides.find((s) => s.type === "solution");
expect(solutionSlide?.content).toContain("AI-powered automation");
});
test("includes business model in business-model slide", () => {
const result = generatePitchDeck(validInput);
const bmSlide = result.slides.find((s) => s.type === "business-model");
expect(bmSlide?.content).toContain("SaaS subscription");
});
test("adds competition slide when provided", () => {
const inputWithCompetition: PitchDeckInput = {
...validInput,
competition: "Legacy players like SAP and Oracle dominate but are slow and expensive",
};
const result = generatePitchDeck(inputWithCompetition);
const competitionSlide = result.slides.find((s) => s.type === "competition");
expect(competitionSlide).toBeDefined();
expect(competitionSlide?.content).toContain("SAP and Oracle");
});
test("adds funding slide when funding amount provided", () => {
const inputWithFunding: PitchDeckInput = {
...validInput,
fundingAmount: "$3M Seed Round",
};
const result = generatePitchDeck(inputWithFunding);
const fundingSlide = result.slides.find((s) => s.type === "funding");
expect(fundingSlide).toBeDefined();
expect(fundingSlide?.content).toContain("$3M Seed Round");
});
test("adds funding slide with use of funds when provided", () => {
const inputWithUseOfFunds: PitchDeckInput = {
...validInput,
useOfFunds: "• 60% Engineering\n• 25% Sales\n• 15% Operations",
};
const result = generatePitchDeck(inputWithUseOfFunds);
const fundingSlide = result.slides.find((s) => s.type === "funding");
expect(fundingSlide).toBeDefined();
expect(fundingSlide?.content).toContain("60% Engineering");
});
test("generates valid contact email in closing slide", () => {
const result = generatePitchDeck(validInput);
const closingSlide = result.slides.find((s) => s.type === "closing");
expect(closingSlide?.content).toContain("hello@techflow.com");
});
test("handles company names with spaces", () => {
const inputWithSpaces: PitchDeckInput = {
...validInput,
companyName: "Tech Flow Solutions",
};
const result = generatePitchDeck(inputWithSpaces);
const closingSlide = result.slides.find((s) => s.type === "closing");
expect(closingSlide?.content).toContain("hello@techflowsolutions.com");
});
});