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) {