shadcn-vue/packages/cli/test/commands/init.test.ts
2024-11-22 15:03:41 +08:00

186 lines
4.9 KiB
TypeScript

import fs from 'node:fs'
import { addDependency } from 'nypm'
import path from 'pathe'
import { afterEach, expect, it, vi } from 'vitest'
import { runInit } from '../../src/commands/init'
import { getConfig } from '../../src/utils/get-config'
import * as registry from '../../src/utils/registry'
vi.mock('nypm')
vi.mock('fs/promises', () => ({
writeFile: vi.fn(),
mkdir: vi.fn(),
}))
vi.mock('ora')
it.skip('init config-full', async () => {
vi.spyOn(registry, 'getRegistryBaseColor').mockResolvedValue({
inlineColors: {},
cssVars: {},
inlineColorsTemplate:
'@tailwind base;\n@tailwind components;\n@tailwind utilities;\n',
cssVarsTemplate:
'@tailwind base;\n@tailwind components;\n@tailwind utilities;\n',
})
vi.spyOn(registry, 'getRegistryItem').mockResolvedValue({
name: 'new-york',
dependencies: [
'tailwindcss-animate',
'class-variance-authority',
'clsx',
'tailwind-merge',
'lucide-vue-next',
'@radix-icons/vue',
],
registryDependencies: [],
tailwind: {
config: {
theme: {
extend: {
borderRadius: {
lg: 'var(--radius)',
md: 'calc(var(--radius) - 2px)',
sm: 'calc(var(--radius) - 4px)',
},
},
},
plugins: ['require("tailwindcss-animate")'],
},
},
files: [],
cssVariables: {
light: {
'--radius': '0.5rem',
},
},
})
const mockMkdir = vi.spyOn(fs.promises, 'mkdir').mockResolvedValue(undefined)
const mockWriteFile = vi.spyOn(fs.promises, 'writeFile').mockResolvedValue()
const targetDir = path.resolve(__dirname, '../fixtures/config-full')
const config = await getConfig(targetDir)
await runInit(config!)
expect(mockMkdir).toHaveBeenNthCalledWith(
1,
expect.stringMatching(/src\/lib$/),
expect.anything(),
)
expect(mockMkdir).toHaveBeenNthCalledWith(
2,
expect.stringMatching(/src\/components$/),
expect.anything(),
)
expect(mockWriteFile).toHaveBeenNthCalledWith(
1,
expect.stringMatching(/tailwind.config.ts$/),
expect.stringContaining('/** @type {import(\'tailwindcss\').Config} */'),
'utf8',
)
expect(mockWriteFile).toHaveBeenNthCalledWith(
2,
expect.stringMatching(/src\/app\/globals.css$/),
expect.stringContaining('@tailwind base'),
'utf8',
)
expect(mockWriteFile).toHaveBeenNthCalledWith(
3,
expect.stringMatching(/src\/lib\/utils.ts$/),
expect.stringContaining('import { type ClassValue, clsx } from \'clsx\''),
'utf8',
)
expect(addDependency).toHaveBeenCalledWith(
[
'tailwindcss-animate',
'class-variance-authority',
'clsx',
'tailwind-merge',
'reka-ui',
'@radix-icons/vue',
],
{
cwd: targetDir,
silent: true,
},
)
mockMkdir.mockRestore()
mockWriteFile.mockRestore()
})
// it('init config-partial', async () => {
// vi.spyOn(registry, 'getRegistryBaseColor').mockResolvedValue({
// inlineColors: {},
// cssVars: {},
// inlineColorsTemplate:
// '@tailwind base;\n@tailwind components;\n@tailwind utilities;\n',
// cssVarsTemplate:
// '@tailwind base;\n@tailwind components;\n@tailwind utilities;\n',
// })
// const mockMkdir = vi.spyOn(fs.promises, 'mkdir').mockResolvedValue(undefined)
// const mockWriteFile = vi.spyOn(fs.promises, 'writeFile').mockResolvedValue()
// const targetDir = path.resolve(__dirname, '../fixtures/config-partial')
// const config = await getConfig(targetDir)
// await runInit(config!)
// expect(mockMkdir).toHaveBeenNthCalledWith(
// 1,
// expect.stringMatching(/src\/assets\/css$/),
// expect.anything(),
// )
// expect(mockMkdir).toHaveBeenNthCalledWith(
// 2,
// expect.stringMatching(/lib$/),
// expect.anything(),
// )
// expect(mockMkdir).toHaveBeenNthCalledWith(
// 3,
// expect.stringMatching(/components$/),
// expect.anything(),
// )
// expect(mockWriteFile).toHaveBeenNthCalledWith(
// 1,
// expect.stringMatching(/tailwind.config.ts$/),
// expect.stringContaining('/** @type {import(\'tailwindcss\').Config} */'),
// 'utf8',
// )
// expect(mockWriteFile).toHaveBeenNthCalledWith(
// 2,
// expect.stringMatching(/src\/assets\/css\/tailwind.css$/),
// expect.stringContaining('@tailwind base'),
// 'utf8',
// )
// expect(mockWriteFile).toHaveBeenNthCalledWith(
// 3,
// expect.stringMatching(/utils.ts$/),
// expect.stringContaining('import { type ClassValue, clsx } from \'clsx\''),
// 'utf8',
// )
// expect(addDependency).toHaveBeenCalledWith(
// [
// 'tailwindcss-animate',
// 'class-variance-authority',
// 'clsx',
// 'tailwind-merge',
// 'reka-ui',
// 'lucide-vue-next',
// ],
// {
// cwd: targetDir,
// silent: true,
// },
// )
// mockMkdir.mockRestore()
// mockWriteFile.mockRestore()
// })
afterEach(() => {
vi.resetAllMocks()
})