import fs from 'node:fs/promises' import path from 'node:path' import { vi, describe, it, expect, beforeEach } from 'vitest' import { generateBrowserRunnerTestFiles } from '../src/utils.js' vi.mock('node:fs/promises', async (orig) => ({ ...(await orig()) as any, default: { writeFile: vi.fn().mockReturnValue(Promise.resolve()), mkdir: vi.fn().mockReturnValue(Promise.resolve('/foo/bar')), access: vi.fn().mockRejectedValue(new Error('dont exist')), }, })) const destSpecRootPath = path.resolve(path.sep, 'foo', 'bar') describe('onboarding templates', () => { beforeEach(async () => { vi.mocked(fs.writeFile).mockClear() }) describe('react', () => { it('with testing-library', async () => { await generateBrowserRunnerTestFiles({ preset: 'react', destSpecRootPath, installTestingLibrary: true, isUsingTypeScript: true } as any) expect(fs.writeFile).toBeCalledTimes(3) const [cssFilePath] = vi.mocked(fs.writeFile).mock.calls[0] as string[] expect(cssFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.css')) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.tsx')) const [testFilePath, content] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.tsx')) expect(content).toMatchSnapshot() }) it('without testing-library', async () => { await generateBrowserRunnerTestFiles({ preset: 'react', destSpecRootPath, installTestingLibrary: false, isUsingTypeScript: true } as any) expect(fs.writeFile).toBeCalledTimes(3) const [cssFilePath] = vi.mocked(fs.writeFile).mock.calls[0] as string[] expect(cssFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.css')) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.tsx')) const [testFilePath, content] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.tsx')) expect(content).toMatchSnapshot() }) it('when using JS', async () => { await generateBrowserRunnerTestFiles({ preset: 'react', destSpecRootPath, installTestingLibrary: false, isUsingTypeScript: false } as any) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.jsx')) const [testFilePath] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.jsx')) }) }) describe('preact', () => { it('with testing-library', async () => { await generateBrowserRunnerTestFiles({ preset: 'preact', destSpecRootPath, installTestingLibrary: true, isUsingTypeScript: true } as any) expect(fs.writeFile).toBeCalledTimes(3) const [cssFilePath] = vi.mocked(fs.writeFile).mock.calls[0] as string[] expect(cssFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.css')) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.tsx')) const [testFilePath, content] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.tsx')) expect(content).toMatchSnapshot() }) it('without testing-library', async () => { await generateBrowserRunnerTestFiles({ preset: 'preact', destSpecRootPath, installTestingLibrary: false, isUsingTypeScript: true } as any) expect(fs.writeFile).toBeCalledTimes(3) const [cssFilePath] = vi.mocked(fs.writeFile).mock.calls[0] as string[] expect(cssFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.css')) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.tsx')) const [testFilePath, content] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.tsx')) expect(content).toMatchSnapshot() }) it('when using JS', async () => { await generateBrowserRunnerTestFiles({ preset: 'preact', destSpecRootPath, installTestingLibrary: false, isUsingTypeScript: false } as any) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.jsx')) const [testFilePath] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.jsx')) }) }) describe('solid', () => { it('with testing-library', async () => { await generateBrowserRunnerTestFiles({ preset: 'solid', destSpecRootPath, installTestingLibrary: true, isUsingTypeScript: true } as any) expect(fs.writeFile).toBeCalledTimes(3) const [cssFilePath] = vi.mocked(fs.writeFile).mock.calls[0] as string[] expect(cssFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.css')) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.tsx')) const [testFilePath, content] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.tsx')) expect(content).toMatchSnapshot() }) it('without testing-library', async () => { await generateBrowserRunnerTestFiles({ preset: 'solid', destSpecRootPath, installTestingLibrary: false, isUsingTypeScript: true } as any) expect(fs.writeFile).toBeCalledTimes(3) const [cssFilePath] = vi.mocked(fs.writeFile).mock.calls[0] as string[] expect(cssFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.css')) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.tsx')) const [testFilePath, content] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.tsx')) expect(content).toMatchSnapshot() }) it('when using JS', async () => { await generateBrowserRunnerTestFiles({ preset: 'solid', destSpecRootPath, installTestingLibrary: false, isUsingTypeScript: false } as any) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.jsx')) const [testFilePath] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.jsx')) }) }) describe('lit', () => { it('without testing-library', async () => { await generateBrowserRunnerTestFiles({ preset: '', destSpecRootPath, installTestingLibrary: true, isUsingTypeScript: true } as any) expect(fs.writeFile).toBeCalledTimes(3) const [cssFilePath] = vi.mocked(fs.writeFile).mock.calls[0] as string[] expect(cssFilePath.endsWith('Component.css')).toBe(true) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath.endsWith('Component.ts')).toBe(true) const [testFilePath, content] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath.endsWith('Component.test.ts')).toBe(true) expect(content).toMatchSnapshot() }) it('when using JS', async () => { await generateBrowserRunnerTestFiles({ preset: '', destSpecRootPath, installTestingLibrary: false, isUsingTypeScript: false } as any) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.js')) const [testFilePath] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.js')) }) }) describe('Vue', () => { it('with testing-library', async () => { await generateBrowserRunnerTestFiles({ preset: 'vue', destSpecRootPath, installTestingLibrary: true, isUsingTypeScript: true } as any) expect(fs.writeFile).toBeCalledTimes(3) const [cssFilePath] = vi.mocked(fs.writeFile).mock.calls[0] as string[] expect(cssFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.css')) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.vue')) const [testFilePath, content] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.ts')) expect(content).toMatchSnapshot() }) it('without testing-library', async () => { await generateBrowserRunnerTestFiles({ preset: 'vue', destSpecRootPath, installTestingLibrary: false, isUsingTypeScript: true } as any) expect(fs.writeFile).toBeCalledTimes(3) const [cssFilePath] = vi.mocked(fs.writeFile).mock.calls[0] as string[] expect(cssFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.css')) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.vue')) const [testFilePath, content] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.ts')) expect(content).toMatchSnapshot() }) it('when using JS', async () => { await generateBrowserRunnerTestFiles({ preset: 'vue', destSpecRootPath, installTestingLibrary: false, isUsingTypeScript: false } as any) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.vue')) const [testFilePath] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.js')) }) }) describe('Svelte', () => { it('with testing-library', async () => { await generateBrowserRunnerTestFiles({ preset: 'svelte', destSpecRootPath, installTestingLibrary: true, isUsingTypeScript: true } as any) expect(fs.writeFile).toBeCalledTimes(3) const [cssFilePath] = vi.mocked(fs.writeFile).mock.calls[0] as string[] expect(cssFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.css')) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.svelte')) const [testFilePath, content] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.ts')) expect(content).toMatchSnapshot() }) it('without testing-library', async () => { await generateBrowserRunnerTestFiles({ preset: 'svelte', destSpecRootPath, installTestingLibrary: false, isUsingTypeScript: true } as any) expect(fs.writeFile).toBeCalledTimes(3) const [cssFilePath] = vi.mocked(fs.writeFile).mock.calls[0] as string[] expect(cssFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.css')) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.svelte')) const [testFilePath, content] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.ts')) expect(content).toMatchSnapshot() }) it('when using JS', async () => { await generateBrowserRunnerTestFiles({ preset: 'svelte', destSpecRootPath, installTestingLibrary: false, isUsingTypeScript: false } as any) const [componentFilePath] = vi.mocked(fs.writeFile).mock.calls[1] as string[] expect(componentFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.svelte')) const [testFilePath] = vi.mocked(fs.writeFile).mock.calls[2] as string[] expect(testFilePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.js')) }) }) describe('other', () => { it('renders correctly with js', async () => { await generateBrowserRunnerTestFiles({ preset: false, destSpecRootPath, installTestingLibrary: false, isUsingTypeScript: false } as any) expect(fs.writeFile).toBeCalledTimes(1) const [filePath] = vi.mocked(fs.writeFile).mock.calls[0] as string[] expect(filePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.js')) }) it('renders correctly with ts', async () => { await generateBrowserRunnerTestFiles({ preset: false, destSpecRootPath, installTestingLibrary: false, isUsingTypeScript: true } as any) expect(fs.writeFile).toBeCalledTimes(1) const [filePath] = vi.mocked(fs.writeFile).mock.calls[0] as string[] expect(filePath).toBe(path.resolve(path.sep, 'foo', 'bar', 'Component.test.ts')) }) }) })