ui-thing
Version:
CLI used to add Nuxt components to a project
137 lines (111 loc) • 5.46 kB
text/typescript
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { runAddCommand } from "../../src/commands/add";
import { Component } from "../../src/types";
vi.mock("../../src/utils/fetchComponents");
vi.mock("../../src/utils/config");
vi.mock("../../src/utils/compareUIConfig");
vi.mock("../../src/utils/detectNuxtVersion");
vi.mock("../../src/utils/writeFile");
vi.mock("../../src/utils/installPackages");
vi.mock("../../src/utils/fileExists");
vi.mock("../../src/utils/logger");
vi.mock("../../src/utils/printFancyBoxMessage");
vi.mock("../../src/utils/promptForComponents");
vi.mock("../../src/utils/installValidator");
vi.mock("prompts");
vi.mock("c12/update");
const mockComponent: Component = {
name: "Popover",
value: "popover",
files: [{ fileName: "Popover.vue", dirPath: "app/components/Ui", fileContent: "<div />" }],
utils: [],
composables: [],
plugins: [],
deps: [],
devDeps: [],
nuxtModules: [],
};
describe("commands/add --skip-config", () => {
beforeEach(() => {
vi.clearAllMocks();
});
afterEach(() => {
vi.restoreAllMocks();
});
it("uses Nuxt 4 defaults when skipConfig is set and nuxt 4 is detected", async () => {
const { fetchComponents } = await import("../../src/utils/fetchComponents");
const { detectNuxtVersion } = await import("../../src/utils/detectNuxtVersion");
const { writeFile } = await import("../../src/utils/writeFile");
const { fileExists } = await import("../../src/utils/fileExists");
const prompts = await import("prompts");
vi.mocked(fetchComponents).mockResolvedValue([mockComponent]);
vi.mocked(detectNuxtVersion).mockReturnValue(4);
vi.mocked(fileExists).mockResolvedValue(false);
vi.mocked(prompts.default).mockResolvedValue({});
await runAddCommand(["popover"], { skipConfig: true, packageManager: "npm" });
expect(vi.mocked(writeFile)).toHaveBeenCalledWith(
expect.stringContaining("app/components/Ui/Popover.vue"),
"<div />"
);
});
it("uses Nuxt 3 defaults when skipConfig is set and nuxt 3 is detected", async () => {
const { fetchComponents } = await import("../../src/utils/fetchComponents");
const { detectNuxtVersion } = await import("../../src/utils/detectNuxtVersion");
const { writeFile } = await import("../../src/utils/writeFile");
const { fileExists } = await import("../../src/utils/fileExists");
const prompts = await import("prompts");
vi.mocked(fetchComponents).mockResolvedValue([mockComponent]);
vi.mocked(detectNuxtVersion).mockReturnValue(3);
vi.mocked(fileExists).mockResolvedValue(false);
vi.mocked(prompts.default).mockResolvedValue({});
await runAddCommand(["popover"], { skipConfig: true, packageManager: "npm" });
expect(vi.mocked(writeFile)).toHaveBeenCalledWith(
expect.stringContaining("components/Ui/Popover.vue"),
"<div />"
);
expect(vi.mocked(writeFile)).not.toHaveBeenCalledWith(
expect.stringContaining("app/components/Ui/Popover.vue"),
expect.any(String)
);
});
it("uses the provided --package-manager without prompting", async () => {
const { fetchComponents } = await import("../../src/utils/fetchComponents");
const { detectNuxtVersion } = await import("../../src/utils/detectNuxtVersion");
const { fileExists } = await import("../../src/utils/fileExists");
const prompts = await import("prompts");
vi.mocked(fetchComponents).mockResolvedValue([mockComponent]);
vi.mocked(detectNuxtVersion).mockReturnValue(4);
vi.mocked(fileExists).mockResolvedValue(false);
await runAddCommand(["popover"], { skipConfig: true, packageManager: "bun" });
expect(vi.mocked(prompts.default)).not.toHaveBeenCalledWith(
expect.objectContaining({ name: "packageManager" })
);
});
it("prompts for package manager when skipConfig is set but no --package-manager given", async () => {
const { fetchComponents } = await import("../../src/utils/fetchComponents");
const { detectNuxtVersion } = await import("../../src/utils/detectNuxtVersion");
const { fileExists } = await import("../../src/utils/fileExists");
const prompts = await import("prompts");
vi.mocked(fetchComponents).mockResolvedValue([mockComponent]);
vi.mocked(detectNuxtVersion).mockReturnValue(4);
vi.mocked(fileExists).mockResolvedValue(false);
vi.mocked(prompts.default).mockResolvedValue({ packageManager: "pnpm" });
await runAddCommand(["popover"], { skipConfig: true });
expect(vi.mocked(prompts.default)).toHaveBeenCalledWith(
expect.objectContaining({ name: "packageManager", type: "select" })
);
});
it("does not call getUIConfig when skipConfig is set", async () => {
const { fetchComponents } = await import("../../src/utils/fetchComponents");
const { detectNuxtVersion } = await import("../../src/utils/detectNuxtVersion");
const { getUIConfig } = await import("../../src/utils/config");
const { fileExists } = await import("../../src/utils/fileExists");
const prompts = await import("prompts");
vi.mocked(fetchComponents).mockResolvedValue([mockComponent]);
vi.mocked(detectNuxtVersion).mockReturnValue(4);
vi.mocked(fileExists).mockResolvedValue(false);
vi.mocked(prompts.default).mockResolvedValue({});
await runAddCommand(["popover"], { skipConfig: true, packageManager: "npm" });
expect(vi.mocked(getUIConfig)).not.toHaveBeenCalled();
});
});