-
-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: simple testing library #275
Merged
Merged
Changes from all commits
Commits
Show all changes
73 commits
Select commit
Hold shift + click to select a range
5e22384
skip writing empty files
AdrianGonz97 95ff386
rename dir because vitest hates us
AdrianGonz97 71e47f2
dont expose `options`
AdrianGonz97 7e0f152
simplify
AdrianGonz97 974e5ad
pm
AdrianGonz97 8570940
remove old tests
AdrianGonz97 809a72f
initial install helper impl
AdrianGonz97 3e6f6bd
ignores
AdrianGonz97 0c86f37
add initial tests
AdrianGonz97 665ead0
..pin storybook
AdrianGonz97 6446e59
fix scripts
AdrianGonz97 53934db
add storybook test
AdrianGonz97 d3ef737
simplify
AdrianGonz97 e398dc2
deps
AdrianGonz97 8068dfc
add retries
AdrianGonz97 4b2f036
not needed
AdrianGonz97 0a0ba1a
tweak community template
AdrianGonz97 cd1a56d
add fixtures
AdrianGonz97 ed32699
community template tests
AdrianGonz97 d40929a
naming
AdrianGonz97 36939bb
tweaks
AdrianGonz97 c1b61be
unneeded
AdrianGonz97 7ae9ad9
clean
AdrianGonz97 1379621
Merge branch 'main' into feat/simple-testing-lib
AdrianGonz97 6adea4d
lockfile trickery
AdrianGonz97 266fea4
fix eslint test
AdrianGonz97 6a139e2
fix paraglide
AdrianGonz97 0fa007f
tweak workflow
AdrianGonz97 d417939
...
AdrianGonz97 19e80da
fix lint
AdrianGonz97 b2af1bb
fix check
AdrianGonz97 6d96a56
Merge branch 'main' into feat/simple-testing-lib
AdrianGonz97 fa0a992
simplify
AdrianGonz97 a9bbe4f
simplify
AdrianGonz97 a76f89b
upgrade vitest
AdrianGonz97 55afcbe
fix nit
AdrianGonz97 e6386a7
fix lint
AdrianGonz97 6a1d29f
simplify
AdrianGonz97 1e5be34
cleanup
AdrianGonz97 1e676fe
rename `vi` to `vitest`
AdrianGonz97 0a56d26
windows fixes
AdrianGonz97 f6523d4
more windows annoyances
AdrianGonz97 5870036
tweaks
AdrianGonz97 677fbb0
add `test:ui` script
manuel3108 6e9360c
`tinyexec` `throwOnError: true`
manuel3108 7181351
revert
AdrianGonz97 d98c630
properly terminate child processes
AdrianGonz97 9aa59cf
dont skip storybook
AdrianGonz97 dd141e7
cleanup on failure to load the page
AdrianGonz97 d4794f0
unused
AdrianGonz97 50fde5c
newline
AdrianGonz97 2b98217
use vitest workspaces
AdrianGonz97 8e00672
add `try-catch` while killing processes
manuel3108 9526fee
increase navigation timeout
manuel3108 ebe7812
fix timeout
AdrianGonz97 ed81a57
add retries
AdrianGonz97 a3baf83
remove storybook log
AdrianGonz97 987b1e8
cleanup cli package
AdrianGonz97 650ede7
fixes
AdrianGonz97 047c549
format before evaluating test
AdrianGonz97 fe810a5
fix dir path
AdrianGonz97 25cadb6
setup matrix
AdrianGonz97 88f9473
skip running docker containers outside of linux runners
AdrianGonz97 9d5b6b2
print console output?
manuel3108 ef2df6e
force `npm` for storybook?
manuel3108 c3aa2fc
Revert "force `npm` for storybook?"
manuel3108 1c095d6
try latest
manuel3108 57ab58e
Revert "try latest"
manuel3108 88bf2ec
Revert "print console output?"
manuel3108 fc72e9a
skip runnung storybook tests in ci on windows
manuel3108 77fd78e
last bits
AdrianGonz97 c01e72e
Merge branch 'main' into feat/simple-testing-lib
AdrianGonz97 b6d91be
format
AdrianGonz97 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
node_modules | ||
temp | ||
.outputs | ||
.test-output |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
import path from 'node:path'; | ||
import { expect } from '@playwright/test'; | ||
import { fixture, setupTest } from './setup/suite.js'; | ||
import addon from '../src/index.js'; | ||
|
||
const id = addon.id; | ||
const { test, variants, prepareServer } = setupTest({ [id]: addon }); | ||
|
||
test.concurrent.for(variants)('demo - %s', async (variant, { page, ...ctx }) => { | ||
const cwd = await ctx.run(variant, { [id]: { demo: true } }); | ||
|
||
// ...add files | ||
if (variant.startsWith('kit')) { | ||
const target = path.resolve(cwd, 'src', 'routes', '+page.svelte'); | ||
fixture({ name: '+page.svelte', target }); | ||
} else { | ||
const target = path.resolve(cwd, 'src', 'App.svelte'); | ||
fixture({ name: 'App.svelte', target }); | ||
} | ||
|
||
const { close } = await prepareServer({ cwd, page }); | ||
// kill server process when we're done | ||
ctx.onTestFinished(async () => await close()); | ||
|
||
// expectations | ||
const textContent = await page.getByTestId('demo').textContent(); | ||
expect(textContent).toContain('This is a text file made by the Community Adder Template demo!'); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
<script> | ||
import demo from '../../adder-template-demo.txt?raw'; | ||
</script> | ||
|
||
<span data-testid="demo">{demo}</span> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
<script> | ||
import demo from '../adder-template-demo.txt?raw'; | ||
</script> | ||
|
||
<span data-testid="demo">{demo}</span> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
import { fileURLToPath } from 'node:url'; | ||
import { setup, type ProjectVariant } from 'sv/testing'; | ||
import type { GlobalSetupContext } from 'vitest/node'; | ||
|
||
const variants: ProjectVariant[] = ['kit-js', 'kit-ts', 'vite-js', 'vite-ts']; | ||
manuel3108 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
const TEST_DIR = fileURLToPath(new URL('../../.test-output/', import.meta.url)); | ||
|
||
export default async function ({ provide }: GlobalSetupContext) { | ||
// global setup (e.g. spin up docker containers) | ||
|
||
// downloads different project configurations (sveltekit, js/ts, vite-only, etc) | ||
const { templatesDir } = await setup({ cwd: TEST_DIR, variants, clean: true }); | ||
|
||
provide('testDir', TEST_DIR); | ||
provide('templatesDir', templatesDir); | ||
provide('variants', variants); | ||
|
||
return async () => { | ||
// tear down... (e.g. cleanup docker containers) | ||
}; | ||
} | ||
|
||
declare module 'vitest' { | ||
export interface ProvidedContext { | ||
testDir: string; | ||
templatesDir: string; | ||
variants: ProjectVariant[]; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
import fs from 'node:fs'; | ||
import path from 'node:path'; | ||
import { execSync } from 'node:child_process'; | ||
import * as vitest from 'vitest'; | ||
import { installAddon, type AddonMap, type OptionMap } from 'sv'; | ||
import { createProject, startPreview, type CreateProject, type ProjectVariant } from 'sv/testing'; | ||
import { chromium, type Browser, type Page } from '@playwright/test'; | ||
import { fileURLToPath } from 'node:url'; | ||
|
||
const cwd = vitest.inject('testDir'); | ||
const templatesDir = vitest.inject('templatesDir'); | ||
const variants = vitest.inject('variants'); | ||
|
||
const SETUP_DIR = fileURLToPath(new URL('.', import.meta.url)); | ||
|
||
type Fixtures<Addons extends AddonMap> = { | ||
page: Page; | ||
run(variant: ProjectVariant, options: OptionMap<Addons>): Promise<string>; | ||
}; | ||
|
||
export function setupTest<Addons extends AddonMap>(addons: Addons) { | ||
let create: CreateProject; | ||
let browser: Browser; | ||
|
||
const test = vitest.test.extend<Fixtures<Addons>>({} as any); | ||
|
||
vitest.beforeAll(async () => { | ||
browser = await chromium.launch(); | ||
return async () => { | ||
await browser.close(); | ||
}; | ||
}); | ||
|
||
vitest.beforeAll(({ name }) => { | ||
const testName = path.parse(name).name.replace('.test', ''); | ||
|
||
// constructs a builder for create test projects | ||
create = createProject({ cwd, templatesDir, testName }); | ||
|
||
// creates a pnpm workspace in each addon dir | ||
fs.writeFileSync( | ||
path.resolve(cwd, testName, 'pnpm-workspace.yaml'), | ||
`packages:\n - '**/*'`, | ||
'utf8' | ||
); | ||
}); | ||
|
||
// runs before each test case | ||
vitest.beforeEach<Fixtures<Addons>>(async (ctx) => { | ||
const browserCtx = await browser.newContext(); | ||
ctx.page = await browserCtx.newPage(); | ||
ctx.run = async (variant, options) => { | ||
const cwd = create({ testId: ctx.task.id, variant }); | ||
|
||
// test metadata | ||
const metaPath = path.resolve(cwd, 'meta.json'); | ||
fs.writeFileSync(metaPath, JSON.stringify({ variant, options }, null, '\t'), 'utf8'); | ||
|
||
// run addon | ||
await installAddon({ cwd, addons, options, packageManager: 'pnpm' }); | ||
|
||
return cwd; | ||
}; | ||
|
||
return async () => { | ||
await browserCtx.close(); | ||
// ...other tear downs | ||
}; | ||
}); | ||
|
||
return { | ||
test, | ||
variants, | ||
prepareServer | ||
}; | ||
} | ||
|
||
/** | ||
* Installs dependencies, builds the project, and spins up the preview server | ||
*/ | ||
async function prepareServer({ cwd, page }: { cwd: string; page: Page }) { | ||
// install deps | ||
execSync('pnpm install --no-frozen-lockfile', { cwd, stdio: 'pipe' }); | ||
|
||
// ...do commands and any other extra stuff | ||
|
||
// build project | ||
execSync('npm run build', { cwd, stdio: 'pipe' }); | ||
|
||
// start preview server `vite preview` | ||
const { url, close } = await startPreview({ cwd }); | ||
|
||
// navigate to the page | ||
await page.goto(url); | ||
|
||
return { url, close }; | ||
} | ||
|
||
/** | ||
* Applies a fixture to the target path | ||
*/ | ||
export function fixture({ name, target }: { name: string; target: string }) { | ||
const fixturePath = path.resolve(SETUP_DIR, '..', 'fixtures', name); | ||
if (!fs.existsSync(fixturePath)) { | ||
throw new Error(`Fixture does not exist at: ${fixturePath}`); | ||
} | ||
fs.copyFileSync(fixturePath, target); | ||
} |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
import { defineConfig } from 'vitest/config'; | ||
|
||
const ONE_MINUTE = 1000 * 60; | ||
|
||
export default defineConfig({ | ||
test: { | ||
include: ['tests/**/*.test.{js,ts}'], | ||
exclude: ['tests/setup/*'], | ||
testTimeout: ONE_MINUTE * 3, | ||
hookTimeout: ONE_MINUTE * 3, | ||
maxConcurrency: 10, | ||
globalSetup: ['tests/setup/global.ts'] | ||
} | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,20 +1,25 @@ | ||
{ | ||
"name": "sv-monorepo", | ||
"version": "0.0.1", | ||
"description": "monorepo for sv and friends", | ||
"private": true, | ||
"version": "0.0.1", | ||
"type": "module", | ||
"description": "monorepo for sv and friends", | ||
"engines": { | ||
"pnpm": "^9.0.0" | ||
}, | ||
"scripts": { | ||
"build": "rollup -c", | ||
"changeset:publish": "changeset publish", | ||
"check": "pnpm --parallel check", | ||
"lint": "pnpm --parallel lint && eslint --cache --cache-location node_modules/.eslintcache", | ||
"format": "pnpm --parallel format", | ||
"dev": "rollup --config --watch", | ||
"build": "rollup -c", | ||
"test": "pnpm --parallel test", | ||
"changeset:publish": "changeset publish" | ||
"format": "pnpm --parallel format", | ||
"lint": "pnpm --parallel lint && eslint --cache --cache-location node_modules/.eslintcache", | ||
"test": "vitest run --silent", | ||
"test:ui": "vitest --ui" | ||
}, | ||
"devDependencies": { | ||
"@changesets/cli": "^2.27.9", | ||
"@playwright/test": "^1.48.2", | ||
"@rollup/plugin-commonjs": "^26.0.1", | ||
"@rollup/plugin-dynamic-import-vars": "^2.1.2", | ||
"@rollup/plugin-json": "^6.1.0", | ||
|
@@ -23,7 +28,7 @@ | |
"@sveltejs/eslint-config": "^8.1.0", | ||
"@svitejs/changesets-changelog-github-compact": "^1.1.0", | ||
"@types/node": "^22.3.0", | ||
"@vitest/ui": "^2.0.5", | ||
"@vitest/ui": "^2.1.4", | ||
"eslint": "^9.10.0", | ||
"magic-string": "^0.30.11", | ||
"prettier": "^3.3.3", | ||
|
@@ -37,10 +42,7 @@ | |
"typescript": "^5.6.2", | ||
"typescript-eslint": "^8.5.0", | ||
"unplugin-isolated-decl": "^0.6.5", | ||
"vitest": "^2.0.5" | ||
"vitest": "^2.1.4" | ||
}, | ||
"packageManager": "[email protected]", | ||
"engines": { | ||
"pnpm": "^9.0.0" | ||
} | ||
"packageManager": "[email protected]" | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The contents of those files look identical to me, why duplicate them?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The import specifiers for the demo are different. Though, we could simplify it to just modify the contents of the file like we do in the mdsvex test