mirror of
https://github.com/FranP-code/create-better-t-stack.git
synced 2025-10-12 23:52:15 +00:00
445 lines
10 KiB
TypeScript
445 lines
10 KiB
TypeScript
import { describe, it } from "vitest";
|
|
import {
|
|
EXAMPLES,
|
|
expectError,
|
|
expectSuccess,
|
|
runTRPCTest,
|
|
type TestConfig,
|
|
} from "./test-utils";
|
|
|
|
describe("Example Configurations", () => {
|
|
describe("Todo Example", () => {
|
|
it("should work with todo example + database + backend", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "todo-with-db",
|
|
examples: ["todo"],
|
|
backend: "hono",
|
|
runtime: "bun",
|
|
database: "sqlite",
|
|
orm: "drizzle",
|
|
auth: "none",
|
|
api: "trpc",
|
|
frontend: ["tanstack-router"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
install: false,
|
|
});
|
|
|
|
expectSuccess(result);
|
|
});
|
|
|
|
it("should work with todo example + convex backend", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "todo-convex",
|
|
examples: ["todo"],
|
|
backend: "convex",
|
|
runtime: "none",
|
|
database: "none",
|
|
orm: "none",
|
|
auth: "clerk",
|
|
api: "none",
|
|
frontend: ["tanstack-router"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
install: false,
|
|
});
|
|
|
|
expectSuccess(result);
|
|
});
|
|
|
|
it("should work with todo example + no backend", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "todo-no-backend",
|
|
examples: ["todo"],
|
|
backend: "none",
|
|
runtime: "none",
|
|
database: "none",
|
|
orm: "none",
|
|
auth: "none",
|
|
api: "none",
|
|
frontend: ["tanstack-router"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
install: false,
|
|
});
|
|
|
|
expectSuccess(result);
|
|
});
|
|
|
|
it("should fail with todo example + backend + no database", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "todo-backend-no-db-fail",
|
|
examples: ["todo"],
|
|
backend: "hono",
|
|
runtime: "bun",
|
|
database: "none",
|
|
orm: "none",
|
|
auth: "none",
|
|
api: "trpc",
|
|
frontend: ["tanstack-router"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
expectError: true,
|
|
});
|
|
|
|
expectError(
|
|
result,
|
|
"The 'todo' example requires a database if a backend (other than Convex) is present",
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("AI Example", () => {
|
|
it("should work with AI example + React frontend", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "ai-react",
|
|
examples: ["ai"],
|
|
backend: "hono",
|
|
runtime: "bun",
|
|
database: "sqlite",
|
|
orm: "drizzle",
|
|
auth: "none",
|
|
api: "trpc",
|
|
frontend: ["tanstack-router"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
install: false,
|
|
});
|
|
|
|
expectSuccess(result);
|
|
});
|
|
|
|
it("should work with AI example + Next.js", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "ai-next",
|
|
examples: ["ai"],
|
|
backend: "next",
|
|
runtime: "bun",
|
|
database: "sqlite",
|
|
orm: "drizzle",
|
|
auth: "none",
|
|
api: "trpc",
|
|
frontend: ["next"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
install: false,
|
|
});
|
|
|
|
expectSuccess(result);
|
|
});
|
|
|
|
it("should work with AI example + Nuxt", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "ai-nuxt",
|
|
examples: ["ai"],
|
|
backend: "hono",
|
|
runtime: "bun",
|
|
database: "sqlite",
|
|
orm: "drizzle",
|
|
auth: "none",
|
|
api: "orpc", // tRPC not supported with Nuxt
|
|
frontend: ["nuxt"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
install: false,
|
|
});
|
|
|
|
expectSuccess(result);
|
|
});
|
|
|
|
it("should work with AI example + Svelte", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "ai-svelte",
|
|
examples: ["ai"],
|
|
backend: "hono",
|
|
runtime: "bun",
|
|
database: "sqlite",
|
|
orm: "drizzle",
|
|
auth: "none",
|
|
api: "orpc", // tRPC not supported with Svelte
|
|
frontend: ["svelte"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
install: false,
|
|
});
|
|
|
|
expectSuccess(result);
|
|
});
|
|
|
|
it("should fail with AI example + Solid frontend", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "ai-solid-fail",
|
|
examples: ["ai"],
|
|
backend: "hono",
|
|
runtime: "bun",
|
|
database: "sqlite",
|
|
orm: "drizzle",
|
|
auth: "none",
|
|
api: "orpc",
|
|
frontend: ["solid"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
expectError: true,
|
|
});
|
|
|
|
expectError(
|
|
result,
|
|
"The 'ai' example is not compatible with the Solid frontend",
|
|
);
|
|
});
|
|
|
|
it("should work with AI example + Convex", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "ai-convex",
|
|
examples: ["ai"],
|
|
backend: "convex",
|
|
runtime: "none",
|
|
database: "none",
|
|
orm: "none",
|
|
auth: "clerk",
|
|
api: "none",
|
|
frontend: ["tanstack-router"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
install: false,
|
|
});
|
|
|
|
expectSuccess(result);
|
|
});
|
|
});
|
|
|
|
describe("Multiple Examples", () => {
|
|
it("should work with both todo and AI examples", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "todo-ai-combo",
|
|
examples: ["todo", "ai"],
|
|
backend: "hono",
|
|
runtime: "bun",
|
|
database: "sqlite",
|
|
orm: "drizzle",
|
|
auth: "none",
|
|
api: "trpc",
|
|
frontend: ["tanstack-router"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
install: false,
|
|
});
|
|
|
|
expectSuccess(result);
|
|
});
|
|
|
|
it("should fail with both examples if one is incompatible", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "todo-ai-solid-fail",
|
|
examples: ["todo", "ai"],
|
|
backend: "hono",
|
|
runtime: "bun",
|
|
database: "sqlite",
|
|
orm: "drizzle",
|
|
auth: "none",
|
|
api: "orpc",
|
|
frontend: ["solid"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
expectError: true,
|
|
});
|
|
|
|
expectError(
|
|
result,
|
|
"The 'ai' example is not compatible with the Solid frontend",
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("Examples with None Option", () => {
|
|
it("should work with examples none", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "no-examples",
|
|
examples: ["none"],
|
|
backend: "hono",
|
|
runtime: "bun",
|
|
database: "sqlite",
|
|
orm: "drizzle",
|
|
auth: "none",
|
|
api: "trpc",
|
|
frontend: ["tanstack-router"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
install: false,
|
|
});
|
|
|
|
expectSuccess(result);
|
|
});
|
|
|
|
it("should fail with none + other examples", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "none-with-examples-fail",
|
|
examples: ["none", "todo"],
|
|
backend: "hono",
|
|
runtime: "bun",
|
|
database: "sqlite",
|
|
orm: "drizzle",
|
|
auth: "none",
|
|
api: "trpc",
|
|
frontend: ["tanstack-router"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
expectError: true,
|
|
});
|
|
|
|
expectError(result, "Cannot combine 'none' with other examples");
|
|
});
|
|
});
|
|
|
|
describe("Examples with API None", () => {
|
|
it("should fail with examples when API is none (non-convex backend)", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "examples-api-none-fail",
|
|
examples: ["todo"],
|
|
backend: "hono",
|
|
runtime: "bun",
|
|
database: "sqlite",
|
|
orm: "drizzle",
|
|
auth: "none",
|
|
api: "none",
|
|
frontend: ["tanstack-router"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
expectError: true,
|
|
});
|
|
|
|
expectError(
|
|
result,
|
|
"Cannot use '--examples' when '--api' is set to 'none'",
|
|
);
|
|
});
|
|
|
|
it("should work with examples when API is none (convex backend)", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "examples-api-none-convex",
|
|
examples: ["todo"],
|
|
backend: "convex",
|
|
runtime: "none",
|
|
database: "none",
|
|
orm: "none",
|
|
auth: "clerk",
|
|
api: "none",
|
|
frontend: ["tanstack-router"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
install: false,
|
|
});
|
|
|
|
expectSuccess(result);
|
|
});
|
|
});
|
|
|
|
describe("All Example Types", () => {
|
|
for (const example of EXAMPLES) {
|
|
if (example === "none") continue;
|
|
|
|
it(`should work with ${example} example in appropriate setup`, async () => {
|
|
const config: TestConfig = {
|
|
projectName: `test-${example}`,
|
|
examples: [example],
|
|
backend: "hono",
|
|
runtime: "bun",
|
|
database: "sqlite",
|
|
orm: "drizzle",
|
|
auth: "none",
|
|
api: "trpc",
|
|
frontend: ["tanstack-router"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
install: false,
|
|
};
|
|
|
|
const result = await runTRPCTest(config);
|
|
expectSuccess(result);
|
|
});
|
|
}
|
|
});
|
|
|
|
describe("Example Edge Cases", () => {
|
|
it("should work with empty examples array", async () => {
|
|
const result = await runTRPCTest({
|
|
projectName: "empty-examples",
|
|
examples: ["none"],
|
|
backend: "hono",
|
|
runtime: "bun",
|
|
database: "sqlite",
|
|
orm: "drizzle",
|
|
auth: "none",
|
|
api: "trpc",
|
|
frontend: ["tanstack-router"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
install: false,
|
|
});
|
|
|
|
expectSuccess(result);
|
|
});
|
|
|
|
it("should handle complex example constraints", async () => {
|
|
// Todo example with backend but no database should fail
|
|
const result = await runTRPCTest({
|
|
projectName: "complex-example-constraints",
|
|
examples: ["todo"],
|
|
backend: "express", // Non-convex backend
|
|
runtime: "bun",
|
|
database: "none", // No database
|
|
orm: "none",
|
|
auth: "none",
|
|
api: "trpc",
|
|
frontend: ["tanstack-router"],
|
|
addons: ["none"],
|
|
dbSetup: "none",
|
|
webDeploy: "none",
|
|
serverDeploy: "none",
|
|
expectError: true,
|
|
});
|
|
|
|
expectError(
|
|
result,
|
|
"The 'todo' example requires a database if a backend (other than Convex) is present",
|
|
);
|
|
});
|
|
});
|
|
});
|