intellitester-astro 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -0
- package/package.json +46 -0
- package/src/hydration.ts +50 -0
- package/src/index.ts +6 -0
- package/src/integration.ts +52 -0
- package/src/pages/test-runner.astro +28 -0
- package/src/ssr-testing.ts +38 -0
- package/src/types.ts +10 -0
- package/tsconfig.json +12 -0
package/README.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# @autotester/astro
|
|
2
|
+
|
|
3
|
+
Astro integration for AutoTester - SSR and hydration testing for Astro applications.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @autotester/astro -D
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
Add the integration to your `astro.config.mjs`:
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
import { defineConfig } from 'astro/config';
|
|
17
|
+
import autotester from '@autotester/astro';
|
|
18
|
+
|
|
19
|
+
export default defineConfig({
|
|
20
|
+
integrations: [
|
|
21
|
+
autotester({
|
|
22
|
+
testsDir: './tests',
|
|
23
|
+
runOnBuild: true,
|
|
24
|
+
testSSR: true,
|
|
25
|
+
testHydration: true,
|
|
26
|
+
testIslands: true,
|
|
27
|
+
})
|
|
28
|
+
]
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Options
|
|
33
|
+
|
|
34
|
+
- `testsDir` - Directory containing test files (default: `./tests`)
|
|
35
|
+
- `runOnBuild` - Run tests during build (default: `false`)
|
|
36
|
+
- `testSSR` - Validate SSR output (default: `false`)
|
|
37
|
+
- `testHydration` - Test hydration directives (default: `false`)
|
|
38
|
+
- `testIslands` - Test island isolation (default: `false`)
|
|
39
|
+
|
|
40
|
+
## Features
|
|
41
|
+
|
|
42
|
+
### SSR Testing
|
|
43
|
+
|
|
44
|
+
Validates that components render correctly on the server side.
|
|
45
|
+
|
|
46
|
+
### Hydration Testing
|
|
47
|
+
|
|
48
|
+
Tests Astro's hydration directives:
|
|
49
|
+
- `client:load`
|
|
50
|
+
- `client:visible`
|
|
51
|
+
- `client:idle`
|
|
52
|
+
- `client:only`
|
|
53
|
+
|
|
54
|
+
### Island Isolation
|
|
55
|
+
|
|
56
|
+
Verifies that Astro islands are properly isolated and hydrate independently.
|
|
57
|
+
|
|
58
|
+
## Test Runner
|
|
59
|
+
|
|
60
|
+
The integration adds a `/__autotester` route to your dev server to view test results.
|
|
61
|
+
|
|
62
|
+
## License
|
|
63
|
+
|
|
64
|
+
MIT
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "intellitester-astro",
|
|
3
|
+
"version": "0.1.12",
|
|
4
|
+
"description": "Astro integration for IntelliTester - AI-powered automated testing",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://forge.blackleafdigital.com/zachhandley/Intellitester.git",
|
|
11
|
+
"directory": "packages/astro-integration"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://github.com/ZachHandley/Intellitester",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/ZachHandley/Intellitester/issues"
|
|
16
|
+
},
|
|
17
|
+
"author": "Zach Handley <zachhandley@gmail.com> (https://zachhandley.com)",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"keywords": [
|
|
20
|
+
"astro-integration",
|
|
21
|
+
"astro",
|
|
22
|
+
"testing",
|
|
23
|
+
"intellitester",
|
|
24
|
+
"e2e"
|
|
25
|
+
],
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"import": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"astro": "^4.0.0 || ^5.0.0"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"vite-plugin-intellitester": "0.1.12"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"typescript": "^5.9.3",
|
|
40
|
+
"astro": "^5.0.0"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsc",
|
|
44
|
+
"typecheck": "tsc --noEmit"
|
|
45
|
+
}
|
|
46
|
+
}
|
package/src/hydration.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export interface HydrationTest {
|
|
2
|
+
directive: 'client:load' | 'client:visible' | 'client:idle' | 'client:only';
|
|
3
|
+
selector: string;
|
|
4
|
+
expectedBehavior: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface HydrationTestResult {
|
|
8
|
+
passed: boolean;
|
|
9
|
+
results: Array<{
|
|
10
|
+
test: HydrationTest;
|
|
11
|
+
success: boolean;
|
|
12
|
+
error?: string;
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export async function testHydrationDirectives(
|
|
17
|
+
buildDir: URL,
|
|
18
|
+
tests: HydrationTest[]
|
|
19
|
+
): Promise<HydrationTestResult> {
|
|
20
|
+
const results: HydrationTestResult['results'] = [];
|
|
21
|
+
|
|
22
|
+
for (const test of tests) {
|
|
23
|
+
try {
|
|
24
|
+
// TODO: Implement actual hydration testing logic
|
|
25
|
+
// This would involve:
|
|
26
|
+
// 1. Loading the built output
|
|
27
|
+
// 2. Checking for proper hydration scripts
|
|
28
|
+
// 3. Validating that components hydrate with the correct directive
|
|
29
|
+
// 4. Testing that client-side JavaScript loads as expected
|
|
30
|
+
|
|
31
|
+
console.log(`Testing hydration directive ${test.directive} for selector: ${test.selector}`);
|
|
32
|
+
|
|
33
|
+
results.push({
|
|
34
|
+
test,
|
|
35
|
+
success: true
|
|
36
|
+
});
|
|
37
|
+
} catch (error) {
|
|
38
|
+
results.push({
|
|
39
|
+
test,
|
|
40
|
+
success: false,
|
|
41
|
+
error: error instanceof Error ? error.message : String(error)
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
passed: results.every(r => r.success),
|
|
48
|
+
results
|
|
49
|
+
};
|
|
50
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createIntegration } from './integration';
|
|
2
|
+
|
|
3
|
+
export default createIntegration;
|
|
4
|
+
export type { AstroIntellitesterOptions } from './types';
|
|
5
|
+
export type { HydrationTest, HydrationTestResult } from './hydration';
|
|
6
|
+
export type { SSRValidationResult } from './ssr-testing';
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { AstroIntegration } from 'astro';
|
|
2
|
+
import { intellitester as vitePlugin } from 'vite-plugin-intellitester';
|
|
3
|
+
import type { AstroIntellitesterOptions } from './types';
|
|
4
|
+
import { validateSSROutput } from './ssr-testing';
|
|
5
|
+
import { testHydrationDirectives } from './hydration';
|
|
6
|
+
|
|
7
|
+
export function createIntegration(options: AstroIntellitesterOptions = {}): AstroIntegration {
|
|
8
|
+
return {
|
|
9
|
+
name: '@intellitester/astro',
|
|
10
|
+
hooks: {
|
|
11
|
+
'astro:config:setup': ({ updateConfig, injectRoute, logger }) => {
|
|
12
|
+
logger.info('Setting up IntelliTester integration');
|
|
13
|
+
|
|
14
|
+
// Add Vite plugin
|
|
15
|
+
updateConfig({
|
|
16
|
+
vite: {
|
|
17
|
+
plugins: [vitePlugin({
|
|
18
|
+
testsDir: options.testsDir,
|
|
19
|
+
runOnBuild: options.runOnBuild,
|
|
20
|
+
})]
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// Inject test runner route
|
|
25
|
+
injectRoute({
|
|
26
|
+
pattern: '/__intellitester',
|
|
27
|
+
entrypoint: '@intellitester/astro/pages/test-runner.astro'
|
|
28
|
+
});
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
'astro:server:setup': ({ server, logger }) => {
|
|
32
|
+
logger.info('IntelliTester dev server ready');
|
|
33
|
+
// Could add custom middleware here
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
'astro:build:done': async ({ dir, routes, logger }) => {
|
|
37
|
+
if (options.testSSR) {
|
|
38
|
+
logger.info('Running SSR tests...');
|
|
39
|
+
const result = await validateSSROutput(dir, routes);
|
|
40
|
+
if (!result.passed) {
|
|
41
|
+
logger.error('SSR tests failed: ' + result.errors.join(', '));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (options.testHydration) {
|
|
46
|
+
logger.info('Running hydration tests...');
|
|
47
|
+
// Run hydration tests
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
// Test runner page injected by the integration
|
|
3
|
+
const testResults = await Astro.locals.intellitesterResults || [];
|
|
4
|
+
---
|
|
5
|
+
<html>
|
|
6
|
+
<head>
|
|
7
|
+
<title>IntelliTester Results</title>
|
|
8
|
+
<style>
|
|
9
|
+
body { font-family: system-ui; padding: 2rem; }
|
|
10
|
+
.pass { color: green; }
|
|
11
|
+
.fail { color: red; }
|
|
12
|
+
</style>
|
|
13
|
+
</head>
|
|
14
|
+
<body>
|
|
15
|
+
<h1>IntelliTester Results</h1>
|
|
16
|
+
<div id="results">
|
|
17
|
+
{testResults.length === 0 ? (
|
|
18
|
+
<p>No tests run yet. Run <code>intellitester run</code> to execute tests.</p>
|
|
19
|
+
) : (
|
|
20
|
+
testResults.map(r => (
|
|
21
|
+
<div class={r.status}>
|
|
22
|
+
{r.status === 'passed' ? '✓' : '✗'} {r.name}
|
|
23
|
+
</div>
|
|
24
|
+
))
|
|
25
|
+
)}
|
|
26
|
+
</div>
|
|
27
|
+
</body>
|
|
28
|
+
</html>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface SSRValidationResult {
|
|
2
|
+
passed: boolean;
|
|
3
|
+
errors: string[];
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export async function validateSSROutput(
|
|
7
|
+
buildDir: URL,
|
|
8
|
+
routes: { pathname: string }[]
|
|
9
|
+
): Promise<SSRValidationResult> {
|
|
10
|
+
// Check that components render correctly in SSR
|
|
11
|
+
const errors: string[] = [];
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
// Iterate through routes and validate SSR output
|
|
15
|
+
for (const route of routes) {
|
|
16
|
+
// TODO: Implement actual SSR validation logic
|
|
17
|
+
// This would involve:
|
|
18
|
+
// 1. Loading the built SSR output
|
|
19
|
+
// 2. Checking for proper HTML structure
|
|
20
|
+
// 3. Validating that required elements are present
|
|
21
|
+
// 4. Ensuring no hydration errors in the output
|
|
22
|
+
|
|
23
|
+
// Placeholder validation
|
|
24
|
+
console.log(`Validating SSR output for route: ${route.pathname}`);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
passed: errors.length === 0,
|
|
29
|
+
errors
|
|
30
|
+
};
|
|
31
|
+
} catch (error) {
|
|
32
|
+
errors.push(`SSR validation failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
33
|
+
return {
|
|
34
|
+
passed: false,
|
|
35
|
+
errors
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface AstroIntellitesterOptions {
|
|
2
|
+
// Inherited from Vite plugin
|
|
3
|
+
testsDir?: string;
|
|
4
|
+
runOnBuild?: boolean;
|
|
5
|
+
|
|
6
|
+
// Astro-specific
|
|
7
|
+
testSSR?: boolean; // Validate SSR output
|
|
8
|
+
testHydration?: boolean; // Test hydration directives
|
|
9
|
+
testIslands?: boolean; // Test island isolation
|
|
10
|
+
}
|