/**
* init-app.test.tsx — Tests for the init app wrapper (InitApp).
*
* Verifies:
* - InitApp renders the InitForm component with auto-detected values
* - The app mounts and renders project information
* - The component tree renders without crashing
* - Auto-detected project name is derived from projectRoot
* - InitApp starts in "form" phase and shows editable fields
* - renderInitApp export is a function
*/
import { describe, test, expect } from "bun:test";
import React from "react";
import { renderToString } from "ink";
import { InitApp, renderInitApp, type InitAppProps } from "./init-app";
describe("InitApp", () => {
test("renders with auto-detected values", () => {
const props: InitAppProps = {
projectRoot: "/home/user/my-project",
force: false,
};
const output = renderToString();
expect(output).toContain("my-project");
expect(output).toContain("wombo-combo");
});
test("renders without crashing", () => {
const props: InitAppProps = {
projectRoot: "/tmp/test-project",
force: false,
};
expect(() => renderToString()).not.toThrow();
});
test("shows editable fields", () => {
const props: InitAppProps = {
projectRoot: "/tmp/test-project",
force: false,
};
const output = renderToString();
expect(output).toContain("Base Branch");
expect(output).toContain("Build Command");
expect(output).toContain("Install Command");
});
test("auto-detects project name from path", () => {
const props: InitAppProps = {
projectRoot: "/home/user/workspace/awesome-app",
force: false,
};
const output = renderToString();
expect(output).toContain("awesome-app");
});
test("shows auto-detected label for project name", () => {
const props: InitAppProps = {
projectRoot: "/tmp/test-project",
force: false,
};
const output = renderToString();
expect(output).toContain("auto-detected");
});
test("renders in form phase on initial mount", () => {
const props: InitAppProps = {
projectRoot: "/tmp/test-project",
force: false,
};
const output = renderToString();
// In form phase, we should see the navigation key hints
expect(output).toContain("Ctrl+S");
});
test("accepts force flag", () => {
const propsNoForce: InitAppProps = {
projectRoot: "/tmp/test-project",
force: false,
};
const propsForce: InitAppProps = {
projectRoot: "/tmp/test-project",
force: true,
};
// Both should render without crashing
expect(() => renderToString()).not.toThrow();
expect(() => renderToString()).not.toThrow();
});
});
describe("renderInitApp", () => {
test("is an async function", () => {
expect(typeof renderInitApp).toBe("function");
});
});