Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 43 additions & 41 deletions packages/cli/test/commands/init.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import path from 'pathe'
import { afterEach, describe, expect, it, vi } from 'vitest'

import { initOptionsSchema, resolvePreset, runInit } from '../../src/commands/init'
import { initOptionsSchema, runInit } from '../../src/commands/init'
import { DEFAULT_PRESETS } from '../../src/preset/presets'

Check failure on line 7 in packages/cli/test/commands/init.test.ts

View workflow job for this annotation

GitHub Actions / test

test/commands/init.test.ts

Error: Cannot find module '../../src/preset/presets' imported from '/home/runner/work/shadcn-vue/shadcn-vue/packages/cli/test/commands/init.test.ts' ❯ test/commands/init.test.ts:7:1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { code: 'ERR_MODULE_NOT_FOUND' } Caused by: Caused by: Error: Failed to load url ../../src/preset/presets (resolved id: ../../src/preset/presets) in /home/runner/work/shadcn-vue/shadcn-vue/packages/cli/test/utils/preset-presets.test.ts. Does the file exist? ❯ loadAndTransform ../../node_modules/.pnpm/vite@7.1.12_@types+node@24.10.0_jiti@2.6.1_lightningcss@1.32.0_stylus@0.57.0_terser@5.44.0_tsx@4.21.0_yaml@2.8.2/node_modules/vite/dist/node/chunks/config.js:26036:33
import * as registry from '../../src/registry'
import { PRESETS } from '../../src/registry/constants'
import { getConfig } from '../../src/utils/get-config'

vi.mock('nypm')
Expand All @@ -14,9 +14,6 @@
mkdir: vi.fn(),
}))
vi.mock('ora')
vi.mock('ofetch', () => ({
ofetch: vi.fn(),
}))

it.skip('init config-full', async () => {
vi.spyOn(registry, 'getRegistryBaseColor').mockResolvedValue({
Expand Down Expand Up @@ -153,6 +150,26 @@
expect(result.preset).toBeUndefined()
})

it('accepts preset as boolean true (interactive mode)', () => {
const result = initOptionsSchema.parse({ ...base, preset: true })
expect(result.preset).toBe(true)
})

it('accepts preset as boolean false', () => {
const result = initOptionsSchema.parse({ ...base, preset: false })
expect(result.preset).toBe(false)
})

it('accepts a preset code string', () => {
const result = initOptionsSchema.parse({ ...base, preset: 'nova' })
expect(result.preset).toBe('nova')
})

it('accepts installStyleIndex boolean flag', () => {
const result = initOptionsSchema.parse({ ...base, installStyleIndex: false })
expect(result.installStyleIndex).toBe(false)
})

it('accepts valid style', () => {
const result = initOptionsSchema.parse({ ...base, style: 'vega' })
expect(result.style).toBe('vega')
Expand All @@ -172,47 +189,32 @@
})
})

describe('resolvePreset', () => {
it('resolves a built-in preset by name', async () => {
const preset = await resolvePreset('reka-vega')
expect(preset).toBeDefined()
expect(preset?.name).toBe('reka-vega')
expect(preset?.base).toBe('reka')
expect(preset?.style).toBe('vega')
describe('default presets', () => {
it('exposes all built-in presets', () => {
const names = Object.keys(DEFAULT_PRESETS)
expect(names).toContain('vega')
expect(names).toContain('nova')
expect(names).toContain('maia')
expect(names).toContain('lyra')
expect(names).toContain('mira')
expect(names).toContain('luma')
})

it('returns null for an unknown preset name', async () => {
const preset = await resolvePreset('not-a-preset')
expect(preset).toBeNull()
})

it('resolves all built-in presets by name', async () => {
for (const p of PRESETS) {
const resolved = await resolvePreset(p.name)
expect(resolved).toBeDefined()
expect(resolved?.name).toBe(p.name)
it('each preset has a complete design system config', () => {
for (const preset of Object.values(DEFAULT_PRESETS)) {
expect(preset.base).toBeDefined()
expect(preset.style).toBeDefined()
expect(preset.baseColor).toBeDefined()
expect(preset.theme).toBeDefined()
expect(preset.iconLibrary).toBeDefined()
expect(preset.font).toBeDefined()
expect(preset.menuAccent).toBeDefined()
expect(preset.menuColor).toBeDefined()
expect(preset.radius).toBeDefined()
}
})

it('fetches preset from a URL', async () => {
const mockPreset = PRESETS[0]
const { ofetch } = await import('ofetch')
vi.mocked(ofetch).mockResolvedValue(mockPreset)

const preset = await resolvePreset('https://example.com/preset.json')
expect(preset).toBeDefined()
expect(preset?.name).toBe(mockPreset.name)
})

it('returns null when URL fetch fails', async () => {
const { ofetch } = await import('ofetch')
vi.mocked(ofetch).mockRejectedValue(new Error('Network error'))

const preset = await resolvePreset('https://example.com/bad-preset.json')
expect(preset).toBeNull()
})
})

afterEach(() => {
vi.resetAllMocks()
})
})
Loading
Loading