From 26bafe79b8cd15ac4f2dfedeb6261a0da794662c Mon Sep 17 00:00:00 2001 From: ProfTrader <3li8@proton.me> Date: Fri, 19 Jun 2026 17:07:19 +0530 Subject: [PATCH] test: cover openui cli helpers --- packages/openui-cli/package.json | 4 +- .../src/lib/detect-package-manager.test.ts | 31 +++++++++++++ .../openui-cli/src/lib/resolve-args.test.ts | 46 +++++++++++++++++++ packages/openui-cli/tsconfig.json | 2 +- packages/openui-cli/tsconfig.test.json | 9 ++++ pnpm-lock.yaml | 3 ++ 6 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 packages/openui-cli/src/lib/detect-package-manager.test.ts create mode 100644 packages/openui-cli/src/lib/resolve-args.test.ts create mode 100644 packages/openui-cli/tsconfig.test.json diff --git a/packages/openui-cli/package.json b/packages/openui-cli/package.json index eb35fd1a3..6242ebea0 100644 --- a/packages/openui-cli/package.json +++ b/packages/openui-cli/package.json @@ -14,6 +14,7 @@ "build:templates": "node scripts/build-templates.js", "build": "pnpm run build:cli && pnpm run build:templates", "build:exec": "node dist/index.js", + "test": "vitest run src", "lint:check": "eslint ./src --ignore-pattern 'src/templates/**'", "lint:fix": "eslint ./src --fix --ignore-pattern 'src/templates/**'", "format:fix": "prettier --write './src/**' '!./src/templates/**'", @@ -23,7 +24,8 @@ }, "devDependencies": { "@types/node": "catalog:", - "rimraf": "^5.0.7" + "rimraf": "^5.0.7", + "vitest": "^4.1.0" }, "keywords": [ "openui", diff --git a/packages/openui-cli/src/lib/detect-package-manager.test.ts b/packages/openui-cli/src/lib/detect-package-manager.test.ts new file mode 100644 index 000000000..9183862c8 --- /dev/null +++ b/packages/openui-cli/src/lib/detect-package-manager.test.ts @@ -0,0 +1,31 @@ +import { afterEach, describe, expect, it } from "vitest"; + +import { detectPackageManager } from "./detect-package-manager"; + +const originalUserAgent = process.env["npm_config_user_agent"]; + +afterEach(() => { + if (originalUserAgent === undefined) { + delete process.env["npm_config_user_agent"]; + } else { + process.env["npm_config_user_agent"] = originalUserAgent; + } +}); + +describe("detectPackageManager", () => { + it.each([ + ["pnpm dlx", "pnpm/10.0.0 npm/? node/v22.0.0"], + ["yarn dlx", "yarn/4.0.0 npm/? node/v22.0.0"], + ["bunx", "bun/1.2.0 npm/? node/v22.0.0"], + ["npx", "npm/11.0.0 node/v22.0.0"], + ["npx", undefined], + ])("returns %s for user agent %s", (expected, userAgent) => { + if (userAgent === undefined) { + delete process.env["npm_config_user_agent"]; + } else { + process.env["npm_config_user_agent"] = userAgent; + } + + expect(detectPackageManager()).toBe(expected); + }); +}); diff --git a/packages/openui-cli/src/lib/resolve-args.test.ts b/packages/openui-cli/src/lib/resolve-args.test.ts new file mode 100644 index 000000000..315485ad2 --- /dev/null +++ b/packages/openui-cli/src/lib/resolve-args.test.ts @@ -0,0 +1,46 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; + +import { resolveArgs } from "./resolve-args"; + +afterEach(() => { + vi.restoreAllMocks(); +}); + +describe("resolveArgs", () => { + it("returns provided values without prompting", async () => { + await expect( + resolveArgs( + { + name: { value: "demo-app" }, + template: { value: "nextjs" }, + }, + false, + ), + ).resolves.toEqual({ + name: "demo-app", + template: "nextjs", + }); + }); + + it("exits predictably for missing required args in non-interactive mode", async () => { + const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {}); + const exitSpy = vi.spyOn(process, "exit").mockImplementation((code) => { + throw new Error(`process.exit:${code}`); + }); + + await expect( + resolveArgs( + { + name: { + prompt: { type: "input", message: "Project name" }, + required: true, + }, + }, + false, + ), + ).rejects.toThrow("process.exit:1"); + + expect(errorSpy).toHaveBeenCalledWith("Error: Missing required argument --name"); + expect(exitSpy).toHaveBeenCalledWith(1); + }); +}); diff --git a/packages/openui-cli/tsconfig.json b/packages/openui-cli/tsconfig.json index a998f5c59..e5a9d3906 100644 --- a/packages/openui-cli/tsconfig.json +++ b/packages/openui-cli/tsconfig.json @@ -2,7 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "../../tsconfig.json", "include": ["src/**/*.ts"], - "exclude": ["src/playground", "src/templates"], + "exclude": ["src/playground", "src/templates", "src/**/*.test.ts", "src/**/*.spec.ts"], "compilerOptions": { "target": "es2022", "lib": ["es2022"], diff --git a/packages/openui-cli/tsconfig.test.json b/packages/openui-cli/tsconfig.test.json new file mode 100644 index 000000000..9f98e8db6 --- /dev/null +++ b/packages/openui-cli/tsconfig.test.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": true + }, + "include": ["src/**/*"], + "exclude": ["dist", "node_modules", "src/templates"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e98e6ecd5..ff9b606b7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1432,6 +1432,9 @@ importers: rimraf: specifier: ^5.0.7 version: 5.0.10 + vitest: + specifier: ^4.1.0 + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.3.2)(jsdom@29.1.1)(vite@7.3.3(@types/node@25.3.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.89.2)(terser@5.48.0)(tsx@4.20.3)(yaml@2.9.0)) packages/react-email: dependencies: