From b14220cff085cb2e3c80d66a5dd0f1ad7710d122 Mon Sep 17 00:00:00 2001 From: neverland Date: Sat, 8 Aug 2026 18:00:08 +0800 Subject: [PATCH] feat(create-rstack): add app template tests --- .../create-rstack/template-app-react-js/AGENTS.md | 3 +++ .../create-rstack/template-app-react-js/package.json | 7 ++++++- .../template-app-react-js/rstack.config.js | 2 +- .../template-app-react-js/tests/index.test.jsx | 8 ++++++++ .../template-app-react-js/tests/rstest.setup.js | 4 ++++ .../create-rstack/template-app-react-ts/AGENTS.md | 3 +++ .../create-rstack/template-app-react-ts/package.json | 7 ++++++- .../template-app-react-ts/rstack.config.ts | 2 +- .../template-app-react-ts/tests/index.test.tsx | 8 ++++++++ .../template-app-react-ts/tests/rstest.setup.ts | 4 ++++ .../template-app-react-ts/tests/tsconfig.json | 7 +++++++ .../create-rstack/template-app-solid-js/AGENTS.md | 3 +++ .../create-rstack/template-app-solid-js/package.json | 6 +++++- .../template-app-solid-js/rstack.config.js | 2 +- .../template-app-solid-js/tests/index.test.jsx | 8 ++++++++ .../template-app-solid-js/tests/rstest.setup.js | 4 ++++ .../create-rstack/template-app-solid-ts/AGENTS.md | 3 +++ .../create-rstack/template-app-solid-ts/package.json | 6 +++++- .../template-app-solid-ts/rstack.config.ts | 2 +- .../template-app-solid-ts/tests/index.test.tsx | 8 ++++++++ .../template-app-solid-ts/tests/rstest.setup.ts | 4 ++++ .../template-app-solid-ts/tests/tsconfig.json | 7 +++++++ .../create-rstack/template-app-vanilla-js/AGENTS.md | 3 +++ .../template-app-vanilla-js/package.json | 6 +++++- .../template-app-vanilla-js/rstack.config.js | 2 +- .../template-app-vanilla-js/tests/dom.test.js | 12 ++++++++++++ .../template-app-vanilla-js/tests/rstest.setup.js | 4 ++++ .../create-rstack/template-app-vanilla-ts/AGENTS.md | 3 +++ .../template-app-vanilla-ts/package.json | 6 +++++- .../template-app-vanilla-ts/rstack.config.ts | 2 +- .../template-app-vanilla-ts/tests/dom.test.ts | 12 ++++++++++++ .../template-app-vanilla-ts/tests/rstest.setup.ts | 4 ++++ .../template-app-vanilla-ts/tests/tsconfig.json | 7 +++++++ packages/create-rstack/template-app-vue-js/AGENTS.md | 3 +++ .../create-rstack/template-app-vue-js/package.json | 7 ++++++- .../template-app-vue-js/rstack.config.js | 2 +- .../template-app-vue-js/tests/index.test.js | 8 ++++++++ .../template-app-vue-js/tests/rstest.setup.js | 4 ++++ packages/create-rstack/template-app-vue-ts/AGENTS.md | 3 +++ .../create-rstack/template-app-vue-ts/package.json | 7 ++++++- .../template-app-vue-ts/rstack.config.ts | 2 +- .../template-app-vue-ts/tests/index.test.ts | 8 ++++++++ .../template-app-vue-ts/tests/rstest.setup.ts | 4 ++++ .../template-app-vue-ts/tests/tsconfig.json | 7 +++++++ .../create-rstack/template-lib-solid-js/package.json | 1 - .../create-rstack/template-lib-solid-ts/package.json | 1 - packages/create-rstack/tests/create.test.ts | 11 ++++++++++- 47 files changed, 218 insertions(+), 19 deletions(-) create mode 100644 packages/create-rstack/template-app-react-js/tests/index.test.jsx create mode 100644 packages/create-rstack/template-app-react-js/tests/rstest.setup.js create mode 100644 packages/create-rstack/template-app-react-ts/tests/index.test.tsx create mode 100644 packages/create-rstack/template-app-react-ts/tests/rstest.setup.ts create mode 100644 packages/create-rstack/template-app-react-ts/tests/tsconfig.json create mode 100644 packages/create-rstack/template-app-solid-js/tests/index.test.jsx create mode 100644 packages/create-rstack/template-app-solid-js/tests/rstest.setup.js create mode 100644 packages/create-rstack/template-app-solid-ts/tests/index.test.tsx create mode 100644 packages/create-rstack/template-app-solid-ts/tests/rstest.setup.ts create mode 100644 packages/create-rstack/template-app-solid-ts/tests/tsconfig.json create mode 100644 packages/create-rstack/template-app-vanilla-js/tests/dom.test.js create mode 100644 packages/create-rstack/template-app-vanilla-js/tests/rstest.setup.js create mode 100644 packages/create-rstack/template-app-vanilla-ts/tests/dom.test.ts create mode 100644 packages/create-rstack/template-app-vanilla-ts/tests/rstest.setup.ts create mode 100644 packages/create-rstack/template-app-vanilla-ts/tests/tsconfig.json create mode 100644 packages/create-rstack/template-app-vue-js/tests/index.test.js create mode 100644 packages/create-rstack/template-app-vue-js/tests/rstest.setup.js create mode 100644 packages/create-rstack/template-app-vue-ts/tests/index.test.ts create mode 100644 packages/create-rstack/template-app-vue-ts/tests/rstest.setup.ts create mode 100644 packages/create-rstack/template-app-vue-ts/tests/tsconfig.json diff --git a/packages/create-rstack/template-app-react-js/AGENTS.md b/packages/create-rstack/template-app-react-js/AGENTS.md index fb378511..1de123b2 100644 --- a/packages/create-rstack/template-app-react-js/AGENTS.md +++ b/packages/create-rstack/template-app-react-js/AGENTS.md @@ -5,8 +5,11 @@ - `{{ packageManager }} run dev` - Start the development server - `{{ packageManager }} run build` - Build the app for production - `{{ packageManager }} run preview` - Preview the production build locally +- `{{ packageManager }} run test` - Run tests +- `{{ packageManager }} run test:watch` - Run tests in watch mode ## Docs - Rsbuild: https://rsbuild.rs/llms.txt - Rspack: https://rspack.rs/llms.txt +- Rstest: https://rstest.rs/llms.txt diff --git a/packages/create-rstack/template-app-react-js/package.json b/packages/create-rstack/template-app-react-js/package.json index 09dde494..4c18be3f 100644 --- a/packages/create-rstack/template-app-react-js/package.json +++ b/packages/create-rstack/template-app-react-js/package.json @@ -9,7 +9,8 @@ "format": "rs fmt", "lint": "rs lint", "preview": "rs preview", - "test": "rs test" + "test": "rs test", + "test:watch": "rs test --watch" }, "dependencies": { "react": "^19.2.8", @@ -17,6 +18,10 @@ }, "devDependencies": { "@rsbuild/plugin-react": "^2.1.0", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^7.0.0", + "@testing-library/react": "^16.3.2", + "happy-dom": "^20.11.1", "rstack": "^0.3.5" } } diff --git a/packages/create-rstack/template-app-react-js/rstack.config.js b/packages/create-rstack/template-app-react-js/rstack.config.js index a89f2994..44a86a4c 100644 --- a/packages/create-rstack/template-app-react-js/rstack.config.js +++ b/packages/create-rstack/template-app-react-js/rstack.config.js @@ -11,7 +11,7 @@ define.app(async () => { }); define.test({ - // Configure Rstest + setupFiles: ['./tests/rstest.setup.js'], }); define.lint(async () => { diff --git a/packages/create-rstack/template-app-react-js/tests/index.test.jsx b/packages/create-rstack/template-app-react-js/tests/index.test.jsx new file mode 100644 index 00000000..2fe4174b --- /dev/null +++ b/packages/create-rstack/template-app-react-js/tests/index.test.jsx @@ -0,0 +1,8 @@ +import { expect, test } from 'rstack/test'; +import { render, screen } from '@testing-library/react'; +import App from '../src/App'; + +test('renders the main page', () => { + render(); + expect(screen.getByText('Rstack with React')).toBeInTheDocument(); +}); diff --git a/packages/create-rstack/template-app-react-js/tests/rstest.setup.js b/packages/create-rstack/template-app-react-js/tests/rstest.setup.js new file mode 100644 index 00000000..93951b15 --- /dev/null +++ b/packages/create-rstack/template-app-react-js/tests/rstest.setup.js @@ -0,0 +1,4 @@ +import { expect } from 'rstack/test'; +import * as jestDomMatchers from '@testing-library/jest-dom/matchers'; + +expect.extend(jestDomMatchers); diff --git a/packages/create-rstack/template-app-react-ts/AGENTS.md b/packages/create-rstack/template-app-react-ts/AGENTS.md index fb378511..1de123b2 100644 --- a/packages/create-rstack/template-app-react-ts/AGENTS.md +++ b/packages/create-rstack/template-app-react-ts/AGENTS.md @@ -5,8 +5,11 @@ - `{{ packageManager }} run dev` - Start the development server - `{{ packageManager }} run build` - Build the app for production - `{{ packageManager }} run preview` - Preview the production build locally +- `{{ packageManager }} run test` - Run tests +- `{{ packageManager }} run test:watch` - Run tests in watch mode ## Docs - Rsbuild: https://rsbuild.rs/llms.txt - Rspack: https://rspack.rs/llms.txt +- Rstest: https://rstest.rs/llms.txt diff --git a/packages/create-rstack/template-app-react-ts/package.json b/packages/create-rstack/template-app-react-ts/package.json index a8b73f0a..5986ecdd 100644 --- a/packages/create-rstack/template-app-react-ts/package.json +++ b/packages/create-rstack/template-app-react-ts/package.json @@ -9,7 +9,8 @@ "format": "rs fmt", "lint": "rs lint", "preview": "rs preview", - "test": "rs test" + "test": "rs test", + "test:watch": "rs test --watch" }, "dependencies": { "react": "^19.2.8", @@ -17,9 +18,13 @@ }, "devDependencies": { "@rsbuild/plugin-react": "^2.1.0", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^7.0.0", + "@testing-library/react": "^16.3.2", "@types/node": "^24.13.3", "@types/react": "^19.2.18", "@types/react-dom": "^19.2.4", + "happy-dom": "^20.11.1", "rstack": "^0.3.5", "typescript": "^7.0.2" } diff --git a/packages/create-rstack/template-app-react-ts/rstack.config.ts b/packages/create-rstack/template-app-react-ts/rstack.config.ts index 29ab420e..1e932f82 100644 --- a/packages/create-rstack/template-app-react-ts/rstack.config.ts +++ b/packages/create-rstack/template-app-react-ts/rstack.config.ts @@ -10,7 +10,7 @@ define.app(async () => { }); define.test({ - // Configure Rstest + setupFiles: ['./tests/rstest.setup.ts'], }); define.lint(async () => { diff --git a/packages/create-rstack/template-app-react-ts/tests/index.test.tsx b/packages/create-rstack/template-app-react-ts/tests/index.test.tsx new file mode 100644 index 00000000..2fe4174b --- /dev/null +++ b/packages/create-rstack/template-app-react-ts/tests/index.test.tsx @@ -0,0 +1,8 @@ +import { expect, test } from 'rstack/test'; +import { render, screen } from '@testing-library/react'; +import App from '../src/App'; + +test('renders the main page', () => { + render(); + expect(screen.getByText('Rstack with React')).toBeInTheDocument(); +}); diff --git a/packages/create-rstack/template-app-react-ts/tests/rstest.setup.ts b/packages/create-rstack/template-app-react-ts/tests/rstest.setup.ts new file mode 100644 index 00000000..93951b15 --- /dev/null +++ b/packages/create-rstack/template-app-react-ts/tests/rstest.setup.ts @@ -0,0 +1,4 @@ +import { expect } from 'rstack/test'; +import * as jestDomMatchers from '@testing-library/jest-dom/matchers'; + +expect.extend(jestDomMatchers); diff --git a/packages/create-rstack/template-app-react-ts/tests/tsconfig.json b/packages/create-rstack/template-app-react-ts/tests/tsconfig.json new file mode 100644 index 00000000..3eb5dc12 --- /dev/null +++ b/packages/create-rstack/template-app-react-ts/tests/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "types": ["rstack/types", "node", "@testing-library/jest-dom"] + }, + "include": ["./"] +} diff --git a/packages/create-rstack/template-app-solid-js/AGENTS.md b/packages/create-rstack/template-app-solid-js/AGENTS.md index fb378511..1de123b2 100644 --- a/packages/create-rstack/template-app-solid-js/AGENTS.md +++ b/packages/create-rstack/template-app-solid-js/AGENTS.md @@ -5,8 +5,11 @@ - `{{ packageManager }} run dev` - Start the development server - `{{ packageManager }} run build` - Build the app for production - `{{ packageManager }} run preview` - Preview the production build locally +- `{{ packageManager }} run test` - Run tests +- `{{ packageManager }} run test:watch` - Run tests in watch mode ## Docs - Rsbuild: https://rsbuild.rs/llms.txt - Rspack: https://rspack.rs/llms.txt +- Rstest: https://rstest.rs/llms.txt diff --git a/packages/create-rstack/template-app-solid-js/package.json b/packages/create-rstack/template-app-solid-js/package.json index 887de41a..cd2dea89 100644 --- a/packages/create-rstack/template-app-solid-js/package.json +++ b/packages/create-rstack/template-app-solid-js/package.json @@ -9,7 +9,8 @@ "format": "rs fmt", "lint": "rs lint", "preview": "rs preview", - "test": "rs test" + "test": "rs test", + "test:watch": "rs test --watch" }, "dependencies": { "solid-js": "^1.9.14" @@ -17,6 +18,9 @@ "devDependencies": { "@rsbuild/plugin-babel": "^2.0.1", "@rsbuild/plugin-solid": "^1.2.2", + "@solidjs/testing-library": "^0.8.10", + "@testing-library/jest-dom": "^7.0.0", + "happy-dom": "^20.11.1", "rstack": "^0.3.5" } } diff --git a/packages/create-rstack/template-app-solid-js/rstack.config.js b/packages/create-rstack/template-app-solid-js/rstack.config.js index aab9ecfd..13c7ae98 100644 --- a/packages/create-rstack/template-app-solid-js/rstack.config.js +++ b/packages/create-rstack/template-app-solid-js/rstack.config.js @@ -17,7 +17,7 @@ define.app(async () => { }); define.test({ - // Configure Rstest + setupFiles: ['./tests/rstest.setup.js'], }); define.lint(async () => { diff --git a/packages/create-rstack/template-app-solid-js/tests/index.test.jsx b/packages/create-rstack/template-app-solid-js/tests/index.test.jsx new file mode 100644 index 00000000..629411ff --- /dev/null +++ b/packages/create-rstack/template-app-solid-js/tests/index.test.jsx @@ -0,0 +1,8 @@ +import { render, screen } from '@solidjs/testing-library'; +import { expect, test } from 'rstack/test'; +import App from '../src/App'; + +test('renders the main page', () => { + render(() => ); + expect(screen.getByText('Rstack with Solid')).toBeInTheDocument(); +}); diff --git a/packages/create-rstack/template-app-solid-js/tests/rstest.setup.js b/packages/create-rstack/template-app-solid-js/tests/rstest.setup.js new file mode 100644 index 00000000..93951b15 --- /dev/null +++ b/packages/create-rstack/template-app-solid-js/tests/rstest.setup.js @@ -0,0 +1,4 @@ +import { expect } from 'rstack/test'; +import * as jestDomMatchers from '@testing-library/jest-dom/matchers'; + +expect.extend(jestDomMatchers); diff --git a/packages/create-rstack/template-app-solid-ts/AGENTS.md b/packages/create-rstack/template-app-solid-ts/AGENTS.md index fb378511..1de123b2 100644 --- a/packages/create-rstack/template-app-solid-ts/AGENTS.md +++ b/packages/create-rstack/template-app-solid-ts/AGENTS.md @@ -5,8 +5,11 @@ - `{{ packageManager }} run dev` - Start the development server - `{{ packageManager }} run build` - Build the app for production - `{{ packageManager }} run preview` - Preview the production build locally +- `{{ packageManager }} run test` - Run tests +- `{{ packageManager }} run test:watch` - Run tests in watch mode ## Docs - Rsbuild: https://rsbuild.rs/llms.txt - Rspack: https://rspack.rs/llms.txt +- Rstest: https://rstest.rs/llms.txt diff --git a/packages/create-rstack/template-app-solid-ts/package.json b/packages/create-rstack/template-app-solid-ts/package.json index 3cdc10c5..e437464e 100644 --- a/packages/create-rstack/template-app-solid-ts/package.json +++ b/packages/create-rstack/template-app-solid-ts/package.json @@ -9,7 +9,8 @@ "format": "rs fmt", "lint": "rs lint", "preview": "rs preview", - "test": "rs test" + "test": "rs test", + "test:watch": "rs test --watch" }, "dependencies": { "solid-js": "^1.9.14" @@ -17,7 +18,10 @@ "devDependencies": { "@rsbuild/plugin-babel": "^2.0.1", "@rsbuild/plugin-solid": "^1.2.2", + "@solidjs/testing-library": "^0.8.10", + "@testing-library/jest-dom": "^7.0.0", "@types/node": "^24.13.3", + "happy-dom": "^20.11.1", "rstack": "^0.3.5", "typescript": "^7.0.2" } diff --git a/packages/create-rstack/template-app-solid-ts/rstack.config.ts b/packages/create-rstack/template-app-solid-ts/rstack.config.ts index 05629b14..37e2a1c8 100644 --- a/packages/create-rstack/template-app-solid-ts/rstack.config.ts +++ b/packages/create-rstack/template-app-solid-ts/rstack.config.ts @@ -16,7 +16,7 @@ define.app(async () => { }); define.test({ - // Configure Rstest + setupFiles: ['./tests/rstest.setup.ts'], }); define.lint(async () => { diff --git a/packages/create-rstack/template-app-solid-ts/tests/index.test.tsx b/packages/create-rstack/template-app-solid-ts/tests/index.test.tsx new file mode 100644 index 00000000..629411ff --- /dev/null +++ b/packages/create-rstack/template-app-solid-ts/tests/index.test.tsx @@ -0,0 +1,8 @@ +import { render, screen } from '@solidjs/testing-library'; +import { expect, test } from 'rstack/test'; +import App from '../src/App'; + +test('renders the main page', () => { + render(() => ); + expect(screen.getByText('Rstack with Solid')).toBeInTheDocument(); +}); diff --git a/packages/create-rstack/template-app-solid-ts/tests/rstest.setup.ts b/packages/create-rstack/template-app-solid-ts/tests/rstest.setup.ts new file mode 100644 index 00000000..93951b15 --- /dev/null +++ b/packages/create-rstack/template-app-solid-ts/tests/rstest.setup.ts @@ -0,0 +1,4 @@ +import { expect } from 'rstack/test'; +import * as jestDomMatchers from '@testing-library/jest-dom/matchers'; + +expect.extend(jestDomMatchers); diff --git a/packages/create-rstack/template-app-solid-ts/tests/tsconfig.json b/packages/create-rstack/template-app-solid-ts/tests/tsconfig.json new file mode 100644 index 00000000..3eb5dc12 --- /dev/null +++ b/packages/create-rstack/template-app-solid-ts/tests/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "types": ["rstack/types", "node", "@testing-library/jest-dom"] + }, + "include": ["./"] +} diff --git a/packages/create-rstack/template-app-vanilla-js/AGENTS.md b/packages/create-rstack/template-app-vanilla-js/AGENTS.md index fb378511..1de123b2 100644 --- a/packages/create-rstack/template-app-vanilla-js/AGENTS.md +++ b/packages/create-rstack/template-app-vanilla-js/AGENTS.md @@ -5,8 +5,11 @@ - `{{ packageManager }} run dev` - Start the development server - `{{ packageManager }} run build` - Build the app for production - `{{ packageManager }} run preview` - Preview the production build locally +- `{{ packageManager }} run test` - Run tests +- `{{ packageManager }} run test:watch` - Run tests in watch mode ## Docs - Rsbuild: https://rsbuild.rs/llms.txt - Rspack: https://rspack.rs/llms.txt +- Rstest: https://rstest.rs/llms.txt diff --git a/packages/create-rstack/template-app-vanilla-js/package.json b/packages/create-rstack/template-app-vanilla-js/package.json index 7dd220ef..e74baa5e 100644 --- a/packages/create-rstack/template-app-vanilla-js/package.json +++ b/packages/create-rstack/template-app-vanilla-js/package.json @@ -9,9 +9,13 @@ "format": "rs fmt", "lint": "rs lint", "preview": "rs preview", - "test": "rs test" + "test": "rs test", + "test:watch": "rs test --watch" }, "devDependencies": { + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^7.0.0", + "happy-dom": "^20.11.1", "rstack": "^0.3.5" } } diff --git a/packages/create-rstack/template-app-vanilla-js/rstack.config.js b/packages/create-rstack/template-app-vanilla-js/rstack.config.js index fd6c52e0..6b6c5f7d 100644 --- a/packages/create-rstack/template-app-vanilla-js/rstack.config.js +++ b/packages/create-rstack/template-app-vanilla-js/rstack.config.js @@ -7,7 +7,7 @@ define.app({ }); define.test({ - // Configure Rstest + setupFiles: ['./tests/rstest.setup.js'], }); define.lint(async () => { diff --git a/packages/create-rstack/template-app-vanilla-js/tests/dom.test.js b/packages/create-rstack/template-app-vanilla-js/tests/dom.test.js new file mode 100644 index 00000000..45c267a8 --- /dev/null +++ b/packages/create-rstack/template-app-vanilla-js/tests/dom.test.js @@ -0,0 +1,12 @@ +import { expect, test } from 'rstack/test'; +import { screen } from '@testing-library/dom'; + +test('test dom', () => { + document.body.innerHTML = ` + +
Visible Example
+ `; + + expect(screen.queryByTestId('not-empty')).toBeInTheDocument(); + expect(screen.getByText('Visible Example')).toBeVisible(); +}); diff --git a/packages/create-rstack/template-app-vanilla-js/tests/rstest.setup.js b/packages/create-rstack/template-app-vanilla-js/tests/rstest.setup.js new file mode 100644 index 00000000..93951b15 --- /dev/null +++ b/packages/create-rstack/template-app-vanilla-js/tests/rstest.setup.js @@ -0,0 +1,4 @@ +import { expect } from 'rstack/test'; +import * as jestDomMatchers from '@testing-library/jest-dom/matchers'; + +expect.extend(jestDomMatchers); diff --git a/packages/create-rstack/template-app-vanilla-ts/AGENTS.md b/packages/create-rstack/template-app-vanilla-ts/AGENTS.md index fb378511..1de123b2 100644 --- a/packages/create-rstack/template-app-vanilla-ts/AGENTS.md +++ b/packages/create-rstack/template-app-vanilla-ts/AGENTS.md @@ -5,8 +5,11 @@ - `{{ packageManager }} run dev` - Start the development server - `{{ packageManager }} run build` - Build the app for production - `{{ packageManager }} run preview` - Preview the production build locally +- `{{ packageManager }} run test` - Run tests +- `{{ packageManager }} run test:watch` - Run tests in watch mode ## Docs - Rsbuild: https://rsbuild.rs/llms.txt - Rspack: https://rspack.rs/llms.txt +- Rstest: https://rstest.rs/llms.txt diff --git a/packages/create-rstack/template-app-vanilla-ts/package.json b/packages/create-rstack/template-app-vanilla-ts/package.json index 65121cbf..ad5c1c12 100644 --- a/packages/create-rstack/template-app-vanilla-ts/package.json +++ b/packages/create-rstack/template-app-vanilla-ts/package.json @@ -9,10 +9,14 @@ "format": "rs fmt", "lint": "rs lint", "preview": "rs preview", - "test": "rs test" + "test": "rs test", + "test:watch": "rs test --watch" }, "devDependencies": { + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^7.0.0", "@types/node": "^24.13.3", + "happy-dom": "^20.11.1", "rstack": "^0.3.5", "typescript": "^7.0.2" } diff --git a/packages/create-rstack/template-app-vanilla-ts/rstack.config.ts b/packages/create-rstack/template-app-vanilla-ts/rstack.config.ts index 3563b865..1add94e8 100644 --- a/packages/create-rstack/template-app-vanilla-ts/rstack.config.ts +++ b/packages/create-rstack/template-app-vanilla-ts/rstack.config.ts @@ -6,7 +6,7 @@ define.app({ }); define.test({ - // Configure Rstest + setupFiles: ['./tests/rstest.setup.ts'], }); define.lint(async () => { diff --git a/packages/create-rstack/template-app-vanilla-ts/tests/dom.test.ts b/packages/create-rstack/template-app-vanilla-ts/tests/dom.test.ts new file mode 100644 index 00000000..45c267a8 --- /dev/null +++ b/packages/create-rstack/template-app-vanilla-ts/tests/dom.test.ts @@ -0,0 +1,12 @@ +import { expect, test } from 'rstack/test'; +import { screen } from '@testing-library/dom'; + +test('test dom', () => { + document.body.innerHTML = ` + +
Visible Example
+ `; + + expect(screen.queryByTestId('not-empty')).toBeInTheDocument(); + expect(screen.getByText('Visible Example')).toBeVisible(); +}); diff --git a/packages/create-rstack/template-app-vanilla-ts/tests/rstest.setup.ts b/packages/create-rstack/template-app-vanilla-ts/tests/rstest.setup.ts new file mode 100644 index 00000000..93951b15 --- /dev/null +++ b/packages/create-rstack/template-app-vanilla-ts/tests/rstest.setup.ts @@ -0,0 +1,4 @@ +import { expect } from 'rstack/test'; +import * as jestDomMatchers from '@testing-library/jest-dom/matchers'; + +expect.extend(jestDomMatchers); diff --git a/packages/create-rstack/template-app-vanilla-ts/tests/tsconfig.json b/packages/create-rstack/template-app-vanilla-ts/tests/tsconfig.json new file mode 100644 index 00000000..3eb5dc12 --- /dev/null +++ b/packages/create-rstack/template-app-vanilla-ts/tests/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "types": ["rstack/types", "node", "@testing-library/jest-dom"] + }, + "include": ["./"] +} diff --git a/packages/create-rstack/template-app-vue-js/AGENTS.md b/packages/create-rstack/template-app-vue-js/AGENTS.md index fb378511..1de123b2 100644 --- a/packages/create-rstack/template-app-vue-js/AGENTS.md +++ b/packages/create-rstack/template-app-vue-js/AGENTS.md @@ -5,8 +5,11 @@ - `{{ packageManager }} run dev` - Start the development server - `{{ packageManager }} run build` - Build the app for production - `{{ packageManager }} run preview` - Preview the production build locally +- `{{ packageManager }} run test` - Run tests +- `{{ packageManager }} run test:watch` - Run tests in watch mode ## Docs - Rsbuild: https://rsbuild.rs/llms.txt - Rspack: https://rspack.rs/llms.txt +- Rstest: https://rstest.rs/llms.txt diff --git a/packages/create-rstack/template-app-vue-js/package.json b/packages/create-rstack/template-app-vue-js/package.json index c3466a77..d5060e03 100644 --- a/packages/create-rstack/template-app-vue-js/package.json +++ b/packages/create-rstack/template-app-vue-js/package.json @@ -9,13 +9,18 @@ "format": "rs fmt", "lint": "rs lint", "preview": "rs preview", - "test": "rs test" + "test": "rs test", + "test:watch": "rs test --watch" }, "dependencies": { "vue": "^3.5.40" }, "devDependencies": { "@rsbuild/plugin-vue": "^2.0.1", + "@testing-library/jest-dom": "^7.0.0", + "@testing-library/vue": "^8.1.0", + "@vue/test-utils": "^2.4.11", + "happy-dom": "^20.11.1", "rstack": "^0.3.5" } } diff --git a/packages/create-rstack/template-app-vue-js/rstack.config.js b/packages/create-rstack/template-app-vue-js/rstack.config.js index 376d57d9..7e691606 100644 --- a/packages/create-rstack/template-app-vue-js/rstack.config.js +++ b/packages/create-rstack/template-app-vue-js/rstack.config.js @@ -11,7 +11,7 @@ define.app(async () => { }); define.test({ - // Configure Rstest + setupFiles: ['./tests/rstest.setup.js'], }); define.lint(async () => { diff --git a/packages/create-rstack/template-app-vue-js/tests/index.test.js b/packages/create-rstack/template-app-vue-js/tests/index.test.js new file mode 100644 index 00000000..18b63c69 --- /dev/null +++ b/packages/create-rstack/template-app-vue-js/tests/index.test.js @@ -0,0 +1,8 @@ +import { expect, test } from 'rstack/test'; +import { render, screen } from '@testing-library/vue'; +import App from '../src/App.vue'; + +test('renders the main page', () => { + render(App); + expect(screen.getByText('Rstack with Vue')).toBeInTheDocument(); +}); diff --git a/packages/create-rstack/template-app-vue-js/tests/rstest.setup.js b/packages/create-rstack/template-app-vue-js/tests/rstest.setup.js new file mode 100644 index 00000000..93951b15 --- /dev/null +++ b/packages/create-rstack/template-app-vue-js/tests/rstest.setup.js @@ -0,0 +1,4 @@ +import { expect } from 'rstack/test'; +import * as jestDomMatchers from '@testing-library/jest-dom/matchers'; + +expect.extend(jestDomMatchers); diff --git a/packages/create-rstack/template-app-vue-ts/AGENTS.md b/packages/create-rstack/template-app-vue-ts/AGENTS.md index fb378511..1de123b2 100644 --- a/packages/create-rstack/template-app-vue-ts/AGENTS.md +++ b/packages/create-rstack/template-app-vue-ts/AGENTS.md @@ -5,8 +5,11 @@ - `{{ packageManager }} run dev` - Start the development server - `{{ packageManager }} run build` - Build the app for production - `{{ packageManager }} run preview` - Preview the production build locally +- `{{ packageManager }} run test` - Run tests +- `{{ packageManager }} run test:watch` - Run tests in watch mode ## Docs - Rsbuild: https://rsbuild.rs/llms.txt - Rspack: https://rspack.rs/llms.txt +- Rstest: https://rstest.rs/llms.txt diff --git a/packages/create-rstack/template-app-vue-ts/package.json b/packages/create-rstack/template-app-vue-ts/package.json index 77e0ab0b..a408bb83 100644 --- a/packages/create-rstack/template-app-vue-ts/package.json +++ b/packages/create-rstack/template-app-vue-ts/package.json @@ -9,14 +9,19 @@ "format": "rs fmt", "lint": "rs lint", "preview": "rs preview", - "test": "rs test" + "test": "rs test", + "test:watch": "rs test --watch" }, "dependencies": { "vue": "^3.5.40" }, "devDependencies": { "@rsbuild/plugin-vue": "^2.0.1", + "@testing-library/jest-dom": "^7.0.0", + "@testing-library/vue": "^8.1.0", "@types/node": "^24.13.3", + "@vue/test-utils": "^2.4.11", + "happy-dom": "^20.11.1", "rstack": "^0.3.5", "typescript": "^6.0.3", "vue-tsc": "^3.3.9" diff --git a/packages/create-rstack/template-app-vue-ts/rstack.config.ts b/packages/create-rstack/template-app-vue-ts/rstack.config.ts index 0399271d..1184c387 100644 --- a/packages/create-rstack/template-app-vue-ts/rstack.config.ts +++ b/packages/create-rstack/template-app-vue-ts/rstack.config.ts @@ -10,7 +10,7 @@ define.app(async () => { }); define.test({ - // Configure Rstest + setupFiles: ['./tests/rstest.setup.ts'], }); define.lint(async () => { diff --git a/packages/create-rstack/template-app-vue-ts/tests/index.test.ts b/packages/create-rstack/template-app-vue-ts/tests/index.test.ts new file mode 100644 index 00000000..18b63c69 --- /dev/null +++ b/packages/create-rstack/template-app-vue-ts/tests/index.test.ts @@ -0,0 +1,8 @@ +import { expect, test } from 'rstack/test'; +import { render, screen } from '@testing-library/vue'; +import App from '../src/App.vue'; + +test('renders the main page', () => { + render(App); + expect(screen.getByText('Rstack with Vue')).toBeInTheDocument(); +}); diff --git a/packages/create-rstack/template-app-vue-ts/tests/rstest.setup.ts b/packages/create-rstack/template-app-vue-ts/tests/rstest.setup.ts new file mode 100644 index 00000000..93951b15 --- /dev/null +++ b/packages/create-rstack/template-app-vue-ts/tests/rstest.setup.ts @@ -0,0 +1,4 @@ +import { expect } from 'rstack/test'; +import * as jestDomMatchers from '@testing-library/jest-dom/matchers'; + +expect.extend(jestDomMatchers); diff --git a/packages/create-rstack/template-app-vue-ts/tests/tsconfig.json b/packages/create-rstack/template-app-vue-ts/tests/tsconfig.json new file mode 100644 index 00000000..3eb5dc12 --- /dev/null +++ b/packages/create-rstack/template-app-vue-ts/tests/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "types": ["rstack/types", "node", "@testing-library/jest-dom"] + }, + "include": ["./"] +} diff --git a/packages/create-rstack/template-lib-solid-js/package.json b/packages/create-rstack/template-lib-solid-js/package.json index 85721ae5..4f600e5d 100644 --- a/packages/create-rstack/template-lib-solid-js/package.json +++ b/packages/create-rstack/template-lib-solid-js/package.json @@ -24,7 +24,6 @@ "@rsbuild/plugin-babel": "^2.0.1", "@rsbuild/plugin-solid": "^1.2.2", "@solidjs/testing-library": "^0.8.10", - "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^7.0.0", "happy-dom": "^20.11.1", "rstack": "^0.3.5", diff --git a/packages/create-rstack/template-lib-solid-ts/package.json b/packages/create-rstack/template-lib-solid-ts/package.json index 9b8f86c4..18c6386a 100644 --- a/packages/create-rstack/template-lib-solid-ts/package.json +++ b/packages/create-rstack/template-lib-solid-ts/package.json @@ -26,7 +26,6 @@ "@rsbuild/plugin-babel": "^2.0.1", "@rsbuild/plugin-solid": "^1.2.2", "@solidjs/testing-library": "^0.8.10", - "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^7.0.0", "@types/node": "^24.13.3", "happy-dom": "^20.11.1", diff --git a/packages/create-rstack/tests/create.test.ts b/packages/create-rstack/tests/create.test.ts index 69b1b630..70936bf7 100644 --- a/packages/create-rstack/tests/create.test.ts +++ b/packages/create-rstack/tests/create.test.ts @@ -37,53 +37,61 @@ test.each([ template: 'app-vanilla-js', configExtension: 'js', sourceExtension: 'js', + testFile: 'dom.test.js', hasTypeScript: false, }, { template: 'app-vanilla-ts', configExtension: 'ts', sourceExtension: 'ts', + testFile: 'dom.test.ts', hasTypeScript: true, }, { template: 'app-react-js', configExtension: 'js', sourceExtension: 'jsx', + testFile: 'index.test.jsx', hasTypeScript: false, }, { template: 'app-react-ts', configExtension: 'ts', sourceExtension: 'tsx', + testFile: 'index.test.tsx', hasTypeScript: true, }, { template: 'app-vue-js', configExtension: 'js', sourceExtension: 'js', + testFile: 'index.test.js', hasTypeScript: false, }, { template: 'app-vue-ts', configExtension: 'ts', sourceExtension: 'ts', + testFile: 'index.test.ts', hasTypeScript: true, }, { template: 'app-solid-js', configExtension: 'js', sourceExtension: 'jsx', + testFile: 'index.test.jsx', hasTypeScript: false, }, { template: 'app-solid-ts', configExtension: 'ts', sourceExtension: 'tsx', + testFile: 'index.test.tsx', hasTypeScript: true, }, ])( 'creates the $template template', - async ({ template, configExtension, sourceExtension, hasTypeScript }) => { + async ({ template, configExtension, sourceExtension, testFile, hasTypeScript }) => { const projectDirectory = await createProject(template); const packageJson = JSON.parse( await readFile(path.join(projectDirectory, 'package.json'), 'utf8'), @@ -99,6 +107,7 @@ test.each([ await expect( access(path.join(projectDirectory, `src/index.${sourceExtension}`)), ).resolves.toBeUndefined(); + await expect(access(path.join(projectDirectory, 'tests', testFile))).resolves.toBeUndefined(); const tsconfigPath = path.join(projectDirectory, 'tsconfig.json'); if (hasTypeScript) {