返回 slidev
options.test.ts
根目录 / packages / slidev / node / options.test.ts
1 import { beforeEach, describe, expect, it, vi } from 'vitest'
2 import { resolveOptions } from './options'
3
4 const mocks = vi.hoisted(() => ({
5 getRoots: vi.fn(),
6 getThemeMeta: vi.fn(),
7 load: vi.fn(),
8 resolveAddons: vi.fn(),
9 resolveConfig: vi.fn(),
10 resolveEntry: vi.fn(),
11 resolveTheme: vi.fn(),
12 }))
13
14 vi.mock('./integrations/addons', () => ({
15 resolveAddons: mocks.resolveAddons,
16 }))
17
18 vi.mock('./integrations/themes', () => ({
19 getThemeMeta: mocks.getThemeMeta,
20 resolveTheme: mocks.resolveTheme,
21 }))
22
23 vi.mock('./parser', () => ({
24 parser: {
25 load: mocks.load,
26 resolveConfig: mocks.resolveConfig,
27 },
28 }))
29
30 vi.mock('./resolver', () => ({
31 getRoots: mocks.getRoots,
32 resolveEntry: mocks.resolveEntry,
33 toAtFS: (value: string) => value,
34 }))
35
36 vi.mock('./setups/indexHtml', () => ({ default: vi.fn().mockResolvedValue('') }))
37 vi.mock('./setups/katex', () => ({ default: vi.fn().mockResolvedValue({}) }))
38 vi.mock('./setups/shiki', () => ({ default: vi.fn().mockResolvedValue({}) }))
39
40 describe('resolveOptions', () => {
41 beforeEach(() => {
42 vi.clearAllMocks()
43 mocks.resolveEntry.mockResolvedValue('/project/slides.md')
44 mocks.getRoots.mockResolvedValue({
45 clientRoot: '/client',
46 userPkgJson: {},
47 userRoot: '/project',
48 userWorkspaceRoot: '/workspace',
49 })
50 mocks.resolveTheme.mockResolvedValue(['slidev-theme-test', '/theme'])
51 mocks.getThemeMeta.mockResolvedValue({})
52 mocks.resolveAddons.mockResolvedValue(['/addon'])
53 mocks.resolveConfig.mockReturnValue({
54 addons: ['slidev-addon-test'],
55 browserExporter: false,
56 drawings: { enabled: false, persist: false },
57 monacoTypesIgnorePackages: [],
58 presenter: false,
59 pwa: false,
60 record: false,
61 routerMode: 'history',
62 })
63 })
64
65 it('reloads with bootstrap roots while resolving final non-discovery config', async () => {
66 const initialData = {
67 headmatter: {
68 addons: ['slidev-addon-bootstrap'],
69 routerMode: 'hash',
70 theme: 'bootstrap',
71 title: 'before',
72 },
73 slides: [{ content: 'before addon preparser' }],
74 }
75 const reloadedData = {
76 headmatter: {
77 addons: ['slidev-addon-final'],
78 routerMode: 'memory',
79 theme: 'final',
80 title: 'after',
81 },
82 slides: [{ content: 'after addon preparser' }],
83 }
84 const initialConfig = {
85 addons: ['slidev-addon-bootstrap'],
86 routerMode: 'hash',
87 theme: 'bootstrap',
88 }
89 const finalConfig = {
90 addons: ['slidev-addon-final'],
91 browserExporter: false,
92 download: false,
93 drawings: { enabled: false, persist: false },
94 monacoTypesIgnorePackages: [],
95 presenter: false,
96 pwa: false,
97 record: false,
98 routerMode: 'memory',
99 theme: 'final',
100 title: 'after',
101 }
102 mocks.load
103 .mockResolvedValueOnce(initialData)
104 .mockResolvedValueOnce(reloadedData)
105 mocks.resolveConfig
106 .mockReturnValueOnce(initialConfig)
107 .mockReturnValueOnce(finalConfig)
108
109 const options = await resolveOptions({
110 download: true,
111 entry: '/project/slides.md',
112 }, 'dev')
113
114 expect(mocks.load).toHaveBeenNthCalledWith(1, {
115 allowedRoots: ['/workspace', '/project'],
116 roots: ['/project'],
117 userRoot: '/project',
118 }, '/project/slides.md', undefined, 'dev')
119 expect(mocks.resolveTheme).toHaveBeenCalledWith('bootstrap', '/project/slides.md')
120 expect(mocks.resolveConfig).toHaveBeenNthCalledWith(
121 1,
122 initialData.headmatter,
123 {},
124 '/project/slides.md',
125 )
126 expect(mocks.resolveAddons).toHaveBeenCalledWith(initialConfig.addons)
127 expect(mocks.load).toHaveBeenNthCalledWith(2, {
128 allowedRoots: ['/workspace', '/theme', '/addon', '/project'],
129 roots: ['/theme', '/addon', '/project'],
130 userRoot: '/project',
131 }, '/project/slides.md', undefined, 'dev')
132 expect(mocks.resolveConfig).toHaveBeenNthCalledWith(
133 2,
134 reloadedData.headmatter,
135 {},
136 '/project/slides.md',
137 )
138 expect(mocks.load).toHaveBeenCalledTimes(2)
139 expect(mocks.resolveTheme).toHaveBeenCalledTimes(1)
140 expect(mocks.resolveAddons).toHaveBeenCalledTimes(1)
141 expect(mocks.resolveConfig).toHaveBeenCalledTimes(2)
142 expect(options.roots).toEqual(['/theme', '/addon', '/project'])
143 expect(options.data.config).toBe(finalConfig)
144 expect(options.data.config).toMatchObject({
145 addons: ['slidev-addon-bootstrap'],
146 download: true,
147 routerMode: 'memory',
148 theme: 'bootstrap',
149 title: 'after',
150 })
151 expect(options.data.config.theme).toBe(options.themeRaw)
152 expect(options.data.headmatter).toEqual(reloadedData.headmatter)
153 expect(options.data.slides).toEqual(reloadedData.slides)
154 })
155 })
156
156 lines TYPESCRIPT