Files
create-better-t-stack/apps/cli/test/deployment.test.ts
2025-09-16 17:53:44 +05:30

561 lines
13 KiB
TypeScript

import { describe, it } from "vitest";
import {
expectError,
expectSuccess,
runTRPCTest,
SERVER_DEPLOYS,
type TestConfig,
WEB_DEPLOYS,
} from "./test-utils";
describe("Deployment Configurations", () => {
describe("Web Deployment", () => {
describe("Valid Web Deploy Configurations", () => {
for (const webDeploy of WEB_DEPLOYS) {
if (webDeploy === "none") continue;
it(`should work with ${webDeploy} web deploy + web frontend`, async () => {
const result = await runTRPCTest({
projectName: `${webDeploy}-web-deploy`,
webDeploy: webDeploy,
serverDeploy: "none",
frontend: ["tanstack-router"],
backend: "hono",
runtime: "bun",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
addons: ["none"],
examples: ["none"],
dbSetup: "none",
install: false,
});
expectSuccess(result);
});
}
});
it("should work with web deploy none", async () => {
const result = await runTRPCTest({
projectName: "no-web-deploy",
webDeploy: "none",
serverDeploy: "none",
frontend: ["tanstack-router"],
backend: "hono",
runtime: "bun",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
addons: ["none"],
examples: ["none"],
dbSetup: "none",
install: false,
});
expectSuccess(result);
});
it("should fail with web deploy but no web frontend", async () => {
const result = await runTRPCTest({
projectName: "web-deploy-no-web-frontend-fail",
webDeploy: "wrangler",
serverDeploy: "none",
frontend: ["native-nativewind"], // Native frontend only
backend: "hono",
runtime: "bun",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
addons: ["none"],
examples: ["none"],
dbSetup: "none",
expectError: true,
});
expectError(result, "'--web-deploy' requires a web frontend");
});
it("should work with web deploy + mixed web and native frontends", async () => {
const result = await runTRPCTest({
projectName: "web-deploy-mixed-frontends",
webDeploy: "wrangler",
serverDeploy: "none",
frontend: ["tanstack-router", "native-nativewind"],
backend: "hono",
runtime: "bun",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
addons: ["none"],
examples: ["none"],
dbSetup: "none",
install: false,
});
expectSuccess(result);
});
it("should work with web deploy + all web frontends", async () => {
const webFrontends = [
"tanstack-router",
"react-router",
"tanstack-start",
"next",
"nuxt",
"svelte",
"solid",
] as const;
for (const frontend of webFrontends) {
const config: TestConfig = {
projectName: `web-deploy-${frontend}`,
webDeploy: "wrangler",
serverDeploy: "none",
frontend: [frontend],
backend: "hono",
runtime: "bun",
database: "sqlite",
orm: "drizzle",
auth: "none",
addons: ["none"],
examples: ["none"],
dbSetup: "none",
install: false,
};
// Handle API compatibility
if (["nuxt", "svelte", "solid"].includes(frontend)) {
config.api = "orpc";
} else {
config.api = "trpc";
}
const result = await runTRPCTest(config);
expectSuccess(result);
}
});
});
describe("Server Deployment", () => {
describe("Valid Server Deploy Configurations", () => {
for (const serverDeploy of SERVER_DEPLOYS) {
if (serverDeploy === "none") continue;
it(`should work with ${serverDeploy} server deploy + backend`, async () => {
const result = await runTRPCTest({
projectName: `${serverDeploy}-server-deploy`,
webDeploy: "none",
serverDeploy: serverDeploy,
backend: "hono",
runtime: "bun",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
frontend: ["tanstack-router"],
addons: ["none"],
examples: ["none"],
dbSetup: "none",
install: false,
});
expectSuccess(result);
});
}
});
it("should work with server deploy none", async () => {
const result = await runTRPCTest({
projectName: "no-server-deploy",
webDeploy: "none",
serverDeploy: "none",
backend: "hono",
runtime: "bun",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
frontend: ["tanstack-router"],
addons: ["none"],
examples: ["none"],
dbSetup: "none",
install: false,
});
expectSuccess(result);
});
it("should fail with server deploy but no backend", async () => {
const result = await runTRPCTest({
projectName: "server-deploy-no-backend-fail",
webDeploy: "none",
serverDeploy: "wrangler",
backend: "none",
runtime: "none",
database: "none",
orm: "none",
auth: "none",
api: "none",
frontend: ["tanstack-router"],
addons: ["none"],
examples: ["none"],
dbSetup: "none",
expectError: true,
});
expectError(
result,
"Backend 'none' requires '--server-deploy none'. Please remove the --server-deploy flag or set it to 'none'.",
);
});
it("should work with server deploy + all compatible backends", async () => {
const backends = [
"hono",
"express",
"fastify",
"next",
"elysia",
] as const;
for (const backend of backends) {
const config: TestConfig = {
projectName: `server-deploy-${backend}`,
webDeploy: "none",
serverDeploy: "wrangler",
backend,
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
frontend: ["tanstack-router"],
addons: ["none"],
examples: ["none"],
dbSetup: "none",
install: false,
};
// Set appropriate runtime
if (backend === "elysia") {
config.runtime = "bun";
} else {
config.runtime = "bun";
}
const result = await runTRPCTest(config);
expectSuccess(result);
}
});
it("should fail with server deploy + convex backend", async () => {
const result = await runTRPCTest({
projectName: "server-deploy-convex-fail",
webDeploy: "none",
serverDeploy: "wrangler",
backend: "convex",
runtime: "none",
database: "none",
orm: "none",
auth: "clerk",
api: "none",
frontend: ["tanstack-router"],
addons: ["none"],
examples: ["none"],
dbSetup: "none",
expectError: true,
});
expectError(result, "Convex backend requires '--server-deploy none'");
});
});
describe("Workers Runtime Deployment Constraints", () => {
it("should work with workers runtime + server deploy", async () => {
const result = await runTRPCTest({
projectName: "workers-server-deploy",
webDeploy: "none",
runtime: "workers",
serverDeploy: "wrangler",
backend: "hono",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
frontend: ["tanstack-router"],
addons: ["none"],
examples: ["none"],
dbSetup: "d1",
install: false,
});
expectSuccess(result);
});
it("should fail with workers runtime + no server deploy", async () => {
const result = await runTRPCTest({
projectName: "workers-no-server-deploy-fail",
runtime: "workers",
serverDeploy: "none",
backend: "hono",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
frontend: ["tanstack-router"],
addons: ["none"],
examples: ["none"],
dbSetup: "none",
webDeploy: "none",
expectError: true,
});
expectError(
result,
"Cloudflare Workers runtime requires a server deployment",
);
});
});
describe("Combined Web and Server Deployment", () => {
it("should work with both web and server deploy", async () => {
const result = await runTRPCTest({
projectName: "web-server-deploy-combo",
webDeploy: "wrangler",
serverDeploy: "wrangler",
backend: "hono",
runtime: "bun",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
frontend: ["tanstack-router"],
addons: ["none"],
examples: ["none"],
dbSetup: "none",
install: false,
});
expectSuccess(result);
});
it("should work with different deploy providers", async () => {
const result = await runTRPCTest({
projectName: "different-deploy-providers",
webDeploy: "wrangler",
serverDeploy: "alchemy",
backend: "hono",
runtime: "workers",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
frontend: ["tanstack-router"],
addons: ["none"],
examples: ["none"],
dbSetup: "none",
install: false,
});
expectSuccess(result);
});
it("should work with web deploy only", async () => {
const result = await runTRPCTest({
projectName: "web-deploy-only",
webDeploy: "wrangler",
serverDeploy: "none",
backend: "hono",
runtime: "bun",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
frontend: ["tanstack-router"],
addons: ["none"],
examples: ["none"],
dbSetup: "none",
install: false,
});
expectSuccess(result);
});
it("should work with server deploy only", async () => {
const result = await runTRPCTest({
projectName: "server-deploy-only",
webDeploy: "none",
serverDeploy: "wrangler",
backend: "hono",
runtime: "bun",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
frontend: ["tanstack-router"],
addons: ["none"],
examples: ["none"],
dbSetup: "none",
install: false,
});
expectSuccess(result);
});
});
describe("Deployment with Special Backend Constraints", () => {
it("should work with deployment + next backend", async () => {
const result = await runTRPCTest({
projectName: "deploy-next-backend",
webDeploy: "wrangler",
serverDeploy: "wrangler",
backend: "next",
runtime: "bun",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
frontend: ["next"],
addons: ["none"],
examples: ["none"],
dbSetup: "none",
install: false,
});
expectSuccess(result);
});
it("should work with deployment + fullstack setup", async () => {
const result = await runTRPCTest({
projectName: "deploy-fullstack",
webDeploy: "wrangler",
serverDeploy: "wrangler",
backend: "hono",
runtime: "workers",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
frontend: ["tanstack-router"],
addons: ["none"],
examples: ["none"],
dbSetup: "none",
install: false,
});
expectSuccess(result);
});
});
describe("All Deployment Options", () => {
const deployOptions: ReadonlyArray<{
webDeploy: TestConfig["webDeploy"];
serverDeploy: TestConfig["serverDeploy"];
}> = [
{ webDeploy: "wrangler", serverDeploy: "wrangler" },
{ webDeploy: "wrangler", serverDeploy: "alchemy" },
{ webDeploy: "alchemy", serverDeploy: "wrangler" },
{ webDeploy: "alchemy", serverDeploy: "alchemy" },
{ webDeploy: "wrangler", serverDeploy: "none" },
{ webDeploy: "alchemy", serverDeploy: "none" },
{ webDeploy: "none", serverDeploy: "wrangler" },
{ webDeploy: "none", serverDeploy: "alchemy" },
{ webDeploy: "none", serverDeploy: "none" },
];
for (const { webDeploy, serverDeploy } of deployOptions) {
it(`should work with webDeploy: ${webDeploy}, serverDeploy: ${serverDeploy}`, async () => {
const config: TestConfig = {
projectName: `deploy-${webDeploy}-${serverDeploy}`,
webDeploy,
serverDeploy,
backend: "hono",
runtime: "bun",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
frontend: ["tanstack-router"],
addons: ["none"],
examples: ["none"],
dbSetup: "none",
install: false,
};
// Handle special cases
if (
webDeploy !== "none" &&
!config.frontend?.some((f) =>
[
"tanstack-router",
"react-router",
"tanstack-start",
"next",
"nuxt",
"svelte",
"solid",
].includes(f),
)
) {
config.frontend = ["tanstack-router"]; // Ensure web frontend for web deploy
}
if (serverDeploy !== "none" && config.backend === "none") {
config.backend = "hono"; // Ensure backend for server deploy
}
const result = await runTRPCTest(config);
expectSuccess(result);
});
}
});
describe("Deployment Edge Cases", () => {
it("should handle deployment with complex configurations", async () => {
const result = await runTRPCTest({
projectName: "complex-deployment",
webDeploy: "wrangler",
serverDeploy: "wrangler",
backend: "hono",
runtime: "workers",
database: "sqlite",
orm: "drizzle",
auth: "none",
api: "trpc",
frontend: ["tanstack-router"], // Single web frontend (compatible with PWA)
addons: ["pwa", "turborepo"],
examples: ["todo"],
install: false,
});
expectSuccess(result);
});
it("should handle deployment constraints properly", async () => {
// This should fail because we have web deploy but only native frontend
const result = await runTRPCTest({
projectName: "deployment-constraints-fail",
webDeploy: "wrangler",
serverDeploy: "none",
backend: "none", // No backend but we have server deploy
runtime: "none",
database: "none",
orm: "none",
auth: "none",
api: "none",
frontend: ["native-nativewind"], // Only native frontend
addons: ["none"],
examples: ["none"],
dbSetup: "none",
expectError: true,
});
expectError(result, "'--web-deploy' requires a web frontend");
});
});
});