mirror of
https://github.com/FranP-code/create-better-t-stack.git
synced 2025-10-12 23:52:15 +00:00
chore(cli): add tests (#576)
This commit is contained in:
338
apps/cli/test/addons.test.ts
Normal file
338
apps/cli/test/addons.test.ts
Normal file
@@ -0,0 +1,338 @@
|
||||
import { describe, it } from "vitest";
|
||||
import type { Addons, Frontend } from "../src";
|
||||
import {
|
||||
expectError,
|
||||
expectSuccess,
|
||||
runTRPCTest,
|
||||
type TestConfig,
|
||||
} from "./test-utils";
|
||||
|
||||
describe("Addon Configurations", () => {
|
||||
describe("Universal Addons (no frontend restrictions)", () => {
|
||||
const universalAddons = ["biome", "husky", "turborepo", "oxlint"];
|
||||
|
||||
for (const addon of universalAddons) {
|
||||
it(`should work with ${addon} addon on any frontend`, async () => {
|
||||
const result = await runTRPCTest({
|
||||
projectName: `${addon}-universal`,
|
||||
addons: [addon as Addons],
|
||||
frontend: ["tanstack-router"],
|
||||
backend: "hono",
|
||||
runtime: "bun",
|
||||
database: "sqlite",
|
||||
orm: "drizzle",
|
||||
auth: "none",
|
||||
api: "trpc",
|
||||
examples: ["none"],
|
||||
dbSetup: "none",
|
||||
webDeploy: "none",
|
||||
serverDeploy: "none",
|
||||
install: false,
|
||||
});
|
||||
|
||||
expectSuccess(result);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("Frontend-Specific Addons", () => {
|
||||
describe("PWA Addon", () => {
|
||||
const pwaCompatibleFrontends = [
|
||||
"tanstack-router",
|
||||
"react-router",
|
||||
"solid",
|
||||
"next",
|
||||
];
|
||||
|
||||
for (const frontend of pwaCompatibleFrontends) {
|
||||
it(`should work with PWA + ${frontend}`, async () => {
|
||||
const config: TestConfig = {
|
||||
projectName: `pwa-${frontend}`,
|
||||
addons: ["pwa"],
|
||||
frontend: [frontend as Frontend],
|
||||
backend: "hono",
|
||||
runtime: "bun",
|
||||
database: "sqlite",
|
||||
orm: "drizzle",
|
||||
auth: "none",
|
||||
examples: ["none"],
|
||||
dbSetup: "none",
|
||||
webDeploy: "none",
|
||||
serverDeploy: "none",
|
||||
install: false,
|
||||
};
|
||||
|
||||
// Handle special frontend requirements
|
||||
if (frontend === "solid") {
|
||||
config.api = "orpc"; // tRPC not supported with solid
|
||||
} else {
|
||||
config.api = "trpc";
|
||||
}
|
||||
|
||||
const result = await runTRPCTest(config);
|
||||
expectSuccess(result);
|
||||
});
|
||||
}
|
||||
|
||||
const pwaIncompatibleFrontends = [
|
||||
"nuxt",
|
||||
"svelte",
|
||||
"native-nativewind",
|
||||
"native-unistyles",
|
||||
];
|
||||
|
||||
for (const frontend of pwaIncompatibleFrontends) {
|
||||
it(`should fail with PWA + ${frontend}`, async () => {
|
||||
const config: TestConfig = {
|
||||
projectName: `pwa-${frontend}-fail`,
|
||||
addons: ["pwa"],
|
||||
frontend: [frontend as Frontend],
|
||||
backend: "hono",
|
||||
runtime: "bun",
|
||||
database: "sqlite",
|
||||
orm: "drizzle",
|
||||
auth: "none",
|
||||
examples: ["none"],
|
||||
dbSetup: "none",
|
||||
webDeploy: "none",
|
||||
serverDeploy: "none",
|
||||
expectError: true,
|
||||
};
|
||||
|
||||
if (["nuxt", "svelte"].includes(frontend)) {
|
||||
config.api = "orpc";
|
||||
} else {
|
||||
config.api = "trpc";
|
||||
}
|
||||
|
||||
const result = await runTRPCTest(config);
|
||||
expectError(
|
||||
result,
|
||||
"pwa addon requires one of these frontends: tanstack-router, react-router, solid, next",
|
||||
);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("Tauri Addon", () => {
|
||||
const tauriCompatibleFrontends = [
|
||||
"tanstack-router",
|
||||
"react-router",
|
||||
"nuxt",
|
||||
"svelte",
|
||||
"solid",
|
||||
"next",
|
||||
];
|
||||
|
||||
for (const frontend of tauriCompatibleFrontends) {
|
||||
it(`should work with Tauri + ${frontend}`, async () => {
|
||||
const config: TestConfig = {
|
||||
projectName: `tauri-${frontend}`,
|
||||
addons: ["tauri"],
|
||||
frontend: [frontend as Frontend],
|
||||
backend: "hono",
|
||||
runtime: "bun",
|
||||
database: "sqlite",
|
||||
orm: "drizzle",
|
||||
auth: "none",
|
||||
examples: ["none"],
|
||||
dbSetup: "none",
|
||||
webDeploy: "none",
|
||||
serverDeploy: "none",
|
||||
install: false,
|
||||
};
|
||||
|
||||
if (["nuxt", "svelte", "solid"].includes(frontend)) {
|
||||
config.api = "orpc";
|
||||
} else {
|
||||
config.api = "trpc";
|
||||
}
|
||||
|
||||
const result = await runTRPCTest(config);
|
||||
expectSuccess(result);
|
||||
});
|
||||
}
|
||||
|
||||
const tauriIncompatibleFrontends = [
|
||||
"native-nativewind",
|
||||
"native-unistyles",
|
||||
];
|
||||
|
||||
for (const frontend of tauriIncompatibleFrontends) {
|
||||
it(`should fail with Tauri + ${frontend}`, async () => {
|
||||
const result = await runTRPCTest({
|
||||
projectName: `tauri-${frontend}-fail`,
|
||||
addons: ["tauri"],
|
||||
frontend: [frontend as Frontend],
|
||||
backend: "hono",
|
||||
runtime: "bun",
|
||||
database: "sqlite",
|
||||
orm: "drizzle",
|
||||
auth: "none",
|
||||
api: "trpc",
|
||||
examples: ["none"],
|
||||
dbSetup: "none",
|
||||
webDeploy: "none",
|
||||
serverDeploy: "none",
|
||||
expectError: true,
|
||||
});
|
||||
|
||||
expectError(result, "tauri addon requires one of these frontends");
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe("Multiple Addons", () => {
|
||||
it("should work with multiple compatible addons", async () => {
|
||||
const result = await runTRPCTest({
|
||||
projectName: "multiple-addons",
|
||||
addons: ["biome", "husky", "turborepo", "pwa"],
|
||||
frontend: ["tanstack-router"],
|
||||
backend: "hono",
|
||||
runtime: "bun",
|
||||
database: "sqlite",
|
||||
orm: "drizzle",
|
||||
auth: "none",
|
||||
api: "trpc",
|
||||
examples: ["none"],
|
||||
dbSetup: "none",
|
||||
webDeploy: "none",
|
||||
serverDeploy: "none",
|
||||
install: false,
|
||||
});
|
||||
|
||||
expectSuccess(result);
|
||||
});
|
||||
|
||||
it("should fail with incompatible addon combination", async () => {
|
||||
const result = await runTRPCTest({
|
||||
projectName: "incompatible-addons-fail",
|
||||
addons: ["pwa"], // PWA not compatible with nuxt
|
||||
frontend: ["nuxt"],
|
||||
backend: "hono",
|
||||
runtime: "bun",
|
||||
database: "sqlite",
|
||||
orm: "drizzle",
|
||||
auth: "none",
|
||||
api: "orpc",
|
||||
examples: ["none"],
|
||||
dbSetup: "none",
|
||||
webDeploy: "none",
|
||||
serverDeploy: "none",
|
||||
expectError: true,
|
||||
});
|
||||
|
||||
expectError(result, "pwa addon requires one of these frontends");
|
||||
});
|
||||
|
||||
it("should deduplicate addons", async () => {
|
||||
const result = await runTRPCTest({
|
||||
projectName: "duplicate-addons",
|
||||
addons: ["biome", "biome", "turborepo"], // Duplicate biome
|
||||
frontend: ["tanstack-router"],
|
||||
backend: "hono",
|
||||
runtime: "bun",
|
||||
database: "sqlite",
|
||||
orm: "drizzle",
|
||||
auth: "none",
|
||||
api: "trpc",
|
||||
examples: ["none"],
|
||||
dbSetup: "none",
|
||||
webDeploy: "none",
|
||||
serverDeploy: "none",
|
||||
install: false,
|
||||
});
|
||||
|
||||
expectSuccess(result);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Addons with None Option", () => {
|
||||
it("should work with addons none", async () => {
|
||||
const result = await runTRPCTest({
|
||||
projectName: "no-addons",
|
||||
addons: ["none"],
|
||||
frontend: ["tanstack-router"],
|
||||
backend: "hono",
|
||||
runtime: "bun",
|
||||
database: "sqlite",
|
||||
orm: "drizzle",
|
||||
auth: "none",
|
||||
api: "trpc",
|
||||
examples: ["none"],
|
||||
dbSetup: "none",
|
||||
webDeploy: "none",
|
||||
serverDeploy: "none",
|
||||
install: false,
|
||||
});
|
||||
|
||||
expectSuccess(result);
|
||||
});
|
||||
|
||||
it("should fail with none + other addons", async () => {
|
||||
const result = await runTRPCTest({
|
||||
projectName: "none-with-other-addons-fail",
|
||||
addons: ["none", "biome"],
|
||||
frontend: ["tanstack-router"],
|
||||
backend: "hono",
|
||||
runtime: "bun",
|
||||
database: "sqlite",
|
||||
orm: "drizzle",
|
||||
auth: "none",
|
||||
api: "trpc",
|
||||
examples: ["none"],
|
||||
dbSetup: "none",
|
||||
webDeploy: "none",
|
||||
serverDeploy: "none",
|
||||
expectError: true,
|
||||
});
|
||||
|
||||
expectError(result, "Cannot combine 'none' with other addons");
|
||||
});
|
||||
});
|
||||
|
||||
describe("All Available Addons", () => {
|
||||
const testableAddons = [
|
||||
"pwa",
|
||||
"tauri",
|
||||
"biome",
|
||||
"husky",
|
||||
"turborepo",
|
||||
"oxlint",
|
||||
// Note: starlight, ultracite, ruler, fumadocs are prompt-controlled only
|
||||
];
|
||||
|
||||
for (const addon of testableAddons) {
|
||||
it(`should work with ${addon} addon in appropriate setup`, async () => {
|
||||
const config: TestConfig = {
|
||||
projectName: `test-${addon}`,
|
||||
addons: [addon as Addons],
|
||||
backend: "hono",
|
||||
runtime: "bun",
|
||||
database: "sqlite",
|
||||
orm: "drizzle",
|
||||
auth: "none",
|
||||
api: "trpc",
|
||||
examples: ["none"],
|
||||
dbSetup: "none",
|
||||
webDeploy: "none",
|
||||
serverDeploy: "none",
|
||||
install: false,
|
||||
};
|
||||
|
||||
// Choose compatible frontend for each addon
|
||||
if (["pwa"].includes(addon)) {
|
||||
config.frontend = ["tanstack-router"]; // PWA compatible
|
||||
} else if (["tauri"].includes(addon)) {
|
||||
config.frontend = ["tanstack-router"]; // Tauri compatible
|
||||
} else {
|
||||
config.frontend = ["tanstack-router"]; // Universal addons
|
||||
}
|
||||
|
||||
const result = await runTRPCTest(config);
|
||||
expectSuccess(result);
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user