repterm 0.1.0
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/dist/api/describe.d.ts +18 -0
- package/dist/api/describe.d.ts.map +1 -0
- package/dist/api/describe.js +33 -0
- package/dist/api/describe.js.map +1 -0
- package/dist/api/expect.d.ts +43 -0
- package/dist/api/expect.d.ts.map +1 -0
- package/dist/api/expect.js +167 -0
- package/dist/api/expect.js.map +1 -0
- package/dist/api/hooks.d.ts +178 -0
- package/dist/api/hooks.d.ts.map +1 -0
- package/dist/api/hooks.js +231 -0
- package/dist/api/hooks.js.map +1 -0
- package/dist/api/steps.d.ts +45 -0
- package/dist/api/steps.d.ts.map +1 -0
- package/dist/api/steps.js +106 -0
- package/dist/api/steps.js.map +1 -0
- package/dist/api/test.d.ts +101 -0
- package/dist/api/test.d.ts.map +1 -0
- package/dist/api/test.js +207 -0
- package/dist/api/test.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +203 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/reporter.d.ts +108 -0
- package/dist/cli/reporter.d.ts.map +1 -0
- package/dist/cli/reporter.js +368 -0
- package/dist/cli/reporter.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin/index.d.ts +47 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +86 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/withPlugins.d.ts +71 -0
- package/dist/plugin/withPlugins.d.ts.map +1 -0
- package/dist/plugin/withPlugins.js +101 -0
- package/dist/plugin/withPlugins.js.map +1 -0
- package/dist/recording/recorder.d.ts +45 -0
- package/dist/recording/recorder.d.ts.map +1 -0
- package/dist/recording/recorder.js +97 -0
- package/dist/recording/recorder.js.map +1 -0
- package/dist/runner/artifacts.d.ts +39 -0
- package/dist/runner/artifacts.d.ts.map +1 -0
- package/dist/runner/artifacts.js +59 -0
- package/dist/runner/artifacts.js.map +1 -0
- package/dist/runner/config.d.ts +46 -0
- package/dist/runner/config.d.ts.map +1 -0
- package/dist/runner/config.js +65 -0
- package/dist/runner/config.js.map +1 -0
- package/dist/runner/filter.d.ts +26 -0
- package/dist/runner/filter.d.ts.map +1 -0
- package/dist/runner/filter.js +88 -0
- package/dist/runner/filter.js.map +1 -0
- package/dist/runner/loader.d.ts +32 -0
- package/dist/runner/loader.d.ts.map +1 -0
- package/dist/runner/loader.js +252 -0
- package/dist/runner/loader.js.map +1 -0
- package/dist/runner/models.d.ts +261 -0
- package/dist/runner/models.d.ts.map +1 -0
- package/dist/runner/models.js +5 -0
- package/dist/runner/models.js.map +1 -0
- package/dist/runner/runner.d.ts +36 -0
- package/dist/runner/runner.d.ts.map +1 -0
- package/dist/runner/runner.js +216 -0
- package/dist/runner/runner.js.map +1 -0
- package/dist/runner/scheduler.d.ts +59 -0
- package/dist/runner/scheduler.d.ts.map +1 -0
- package/dist/runner/scheduler.js +157 -0
- package/dist/runner/scheduler.js.map +1 -0
- package/dist/runner/worker-runner.d.ts +6 -0
- package/dist/runner/worker-runner.d.ts.map +1 -0
- package/dist/runner/worker-runner.js +51 -0
- package/dist/runner/worker-runner.js.map +1 -0
- package/dist/runner/worker.d.ts +54 -0
- package/dist/runner/worker.d.ts.map +1 -0
- package/dist/runner/worker.js +112 -0
- package/dist/runner/worker.js.map +1 -0
- package/dist/terminal/session.d.ts +56 -0
- package/dist/terminal/session.d.ts.map +1 -0
- package/dist/terminal/session.js +126 -0
- package/dist/terminal/session.js.map +1 -0
- package/dist/terminal/terminal.d.ts +284 -0
- package/dist/terminal/terminal.d.ts.map +1 -0
- package/dist/terminal/terminal.js +1167 -0
- package/dist/terminal/terminal.js.map +1 -0
- package/dist/utils/dependencies.d.ts +19 -0
- package/dist/utils/dependencies.d.ts.map +1 -0
- package/dist/utils/dependencies.js +58 -0
- package/dist/utils/dependencies.js.map +1 -0
- package/dist/utils/timing.d.ts +55 -0
- package/dist/utils/timing.d.ts.map +1 -0
- package/dist/utils/timing.js +87 -0
- package/dist/utils/timing.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test file discovery and loading
|
|
3
|
+
* Handles finding and importing test files with directory-level setup support
|
|
4
|
+
*/
|
|
5
|
+
import { readdir, stat } from 'fs/promises';
|
|
6
|
+
import { join, resolve, extname, basename } from 'path';
|
|
7
|
+
import { pathToFileURL } from 'url';
|
|
8
|
+
// Match all .ts and .js files (not just .test files)
|
|
9
|
+
const DEFAULT_PATTERN = /\.(ts|js)$/;
|
|
10
|
+
// Setup file name (without extension)
|
|
11
|
+
const SETUP_FILE_NAME = 'setup';
|
|
12
|
+
/**
|
|
13
|
+
* Check if a file is a setup file
|
|
14
|
+
*/
|
|
15
|
+
function isSetupFile(fileName) {
|
|
16
|
+
const name = basename(fileName, extname(fileName));
|
|
17
|
+
return name === SETUP_FILE_NAME;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Discover test files in a directory or direct file paths
|
|
21
|
+
*/
|
|
22
|
+
export async function discoverTests(paths, options = {}) {
|
|
23
|
+
const pattern = options.pattern ?? DEFAULT_PATTERN;
|
|
24
|
+
const recursive = options.recursive ?? true;
|
|
25
|
+
const testFiles = [];
|
|
26
|
+
for (const path of paths) {
|
|
27
|
+
try {
|
|
28
|
+
const stats = await stat(path);
|
|
29
|
+
if (stats.isFile()) {
|
|
30
|
+
// Direct file path - add it if it matches pattern or has test extension
|
|
31
|
+
if (pattern.test(path) || isTestFile(path)) {
|
|
32
|
+
testFiles.push(path);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else if (stats.isDirectory()) {
|
|
36
|
+
// Directory - discover files recursively
|
|
37
|
+
const files = await findTestFiles(path, pattern, recursive);
|
|
38
|
+
testFiles.push(...files);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
// If path doesn't exist, skip it
|
|
43
|
+
if (error.code !== 'ENOENT') {
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return testFiles;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Recursively find test files matching pattern
|
|
52
|
+
*/
|
|
53
|
+
async function findTestFiles(dirPath, pattern, recursive) {
|
|
54
|
+
const files = [];
|
|
55
|
+
try {
|
|
56
|
+
const entries = await readdir(dirPath);
|
|
57
|
+
for (const entry of entries) {
|
|
58
|
+
const fullPath = join(dirPath, entry);
|
|
59
|
+
const stats = await stat(fullPath);
|
|
60
|
+
if (stats.isDirectory() && recursive) {
|
|
61
|
+
const nestedFiles = await findTestFiles(fullPath, pattern, recursive);
|
|
62
|
+
files.push(...nestedFiles);
|
|
63
|
+
}
|
|
64
|
+
else if (stats.isFile() && pattern.test(entry)) {
|
|
65
|
+
files.push(fullPath);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
// If path doesn't exist or can't be read, skip it
|
|
71
|
+
if (error.code !== 'ENOENT') {
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return files;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Load a test file and execute it to register tests
|
|
79
|
+
*/
|
|
80
|
+
export async function loadTestFile(filePath) {
|
|
81
|
+
// Convert file path to URL for ESM import. Add cache-busting query so
|
|
82
|
+
// the same file path can be loaded multiple times (e.g. in tests) and
|
|
83
|
+
// the module runs again to register tests.
|
|
84
|
+
const baseUrl = pathToFileURL(filePath).href;
|
|
85
|
+
const fileUrl = `${baseUrl}?run=${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
86
|
+
// Set the current file in registry to create file-level suite (use resolved path for stable key)
|
|
87
|
+
const { registry } = await import('../api/test.js');
|
|
88
|
+
const g = globalThis;
|
|
89
|
+
const REGISTRY_KEY = '__repterm_registry';
|
|
90
|
+
const prevRegistry = g[REGISTRY_KEY];
|
|
91
|
+
g[REGISTRY_KEY] = registry;
|
|
92
|
+
const fileSuite = registry.setCurrentFile(resolve(filePath));
|
|
93
|
+
registry.__pendingFileSuite = fileSuite;
|
|
94
|
+
try {
|
|
95
|
+
await import(fileUrl);
|
|
96
|
+
// Reassign any tests that landed on the default suite (e.g. due to async module evaluation)
|
|
97
|
+
// to this file's suite so multi-file loading registers all tests under the correct roots.
|
|
98
|
+
const orphanTests = registry.takeTestsFromDefaultSuite();
|
|
99
|
+
if (orphanTests.length > 0) {
|
|
100
|
+
fileSuite.tests.push(...orphanTests);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
throw new Error(`Failed to load test file ${filePath}: ${error.message}`);
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
if (prevRegistry !== undefined)
|
|
108
|
+
g[REGISTRY_KEY] = prevRegistry;
|
|
109
|
+
else
|
|
110
|
+
delete g[REGISTRY_KEY];
|
|
111
|
+
delete registry.__pendingFileSuite;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Load multiple test files
|
|
116
|
+
*/
|
|
117
|
+
export async function loadTestFiles(filePaths) {
|
|
118
|
+
for (const filePath of filePaths) {
|
|
119
|
+
await loadTestFile(filePath);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Analyze a directory and return its structure
|
|
124
|
+
*/
|
|
125
|
+
async function analyzeDirectory(dirPath, pattern) {
|
|
126
|
+
const entries = await readdir(dirPath);
|
|
127
|
+
let setupFile;
|
|
128
|
+
const testFiles = [];
|
|
129
|
+
const subdirs = [];
|
|
130
|
+
for (const entry of entries) {
|
|
131
|
+
const fullPath = join(dirPath, entry);
|
|
132
|
+
const stats = await stat(fullPath);
|
|
133
|
+
if (stats.isDirectory()) {
|
|
134
|
+
subdirs.push(fullPath);
|
|
135
|
+
}
|
|
136
|
+
else if (stats.isFile() && pattern.test(entry)) {
|
|
137
|
+
if (isSetupFile(entry)) {
|
|
138
|
+
setupFile = fullPath;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
testFiles.push(fullPath);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Create a directory suite
|
|
146
|
+
const dirName = basename(dirPath);
|
|
147
|
+
const suite = {
|
|
148
|
+
id: `dir-${dirPath.replace(/[^a-zA-Z0-9]/g, '-')}`,
|
|
149
|
+
name: dirName,
|
|
150
|
+
tests: [],
|
|
151
|
+
suites: [],
|
|
152
|
+
config: {},
|
|
153
|
+
};
|
|
154
|
+
return {
|
|
155
|
+
dirPath,
|
|
156
|
+
suite,
|
|
157
|
+
setupFile,
|
|
158
|
+
testFiles,
|
|
159
|
+
subdirs,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Load a directory with setup.ts support
|
|
164
|
+
* Creates directory-level suites and executes setup files
|
|
165
|
+
*/
|
|
166
|
+
export async function loadDirectory(dirPath, parentSuite = null, pattern = DEFAULT_PATTERN) {
|
|
167
|
+
const { registry } = await import('../api/test.js');
|
|
168
|
+
const info = await analyzeDirectory(dirPath, pattern);
|
|
169
|
+
// Link to parent if provided
|
|
170
|
+
if (parentSuite) {
|
|
171
|
+
info.suite.parent = parentSuite;
|
|
172
|
+
if (!parentSuite.suites) {
|
|
173
|
+
parentSuite.suites = [];
|
|
174
|
+
}
|
|
175
|
+
parentSuite.suites.push(info.suite);
|
|
176
|
+
}
|
|
177
|
+
// Push the directory suite onto the stack
|
|
178
|
+
registry.pushSuite(info.suite);
|
|
179
|
+
try {
|
|
180
|
+
// Load setup.ts first if it exists
|
|
181
|
+
if (info.setupFile) {
|
|
182
|
+
const fileUrl = pathToFileURL(info.setupFile).href;
|
|
183
|
+
try {
|
|
184
|
+
await import(fileUrl);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
throw new Error(`Failed to load setup file ${info.setupFile}: ${error.message}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Load test files in this directory
|
|
191
|
+
for (const testFile of info.testFiles) {
|
|
192
|
+
const fileUrl = pathToFileURL(testFile).href;
|
|
193
|
+
try {
|
|
194
|
+
await import(fileUrl);
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
throw new Error(`Failed to load test file ${testFile}: ${error.message}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Recursively load subdirectories
|
|
201
|
+
for (const subdir of info.subdirs) {
|
|
202
|
+
await loadDirectory(subdir, info.suite, pattern);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
// Pop the directory suite from the stack
|
|
207
|
+
registry.popSuite();
|
|
208
|
+
}
|
|
209
|
+
return info.suite;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Load test files with directory-level setup support
|
|
213
|
+
* This is the enhanced version that supports setup.ts files
|
|
214
|
+
*/
|
|
215
|
+
export async function loadTestsWithSetup(paths, options = {}) {
|
|
216
|
+
const pattern = options.pattern ?? DEFAULT_PATTERN;
|
|
217
|
+
const suites = [];
|
|
218
|
+
for (const path of paths) {
|
|
219
|
+
try {
|
|
220
|
+
const stats = await stat(path);
|
|
221
|
+
if (stats.isDirectory()) {
|
|
222
|
+
// Load directory with setup support
|
|
223
|
+
const suite = await loadDirectory(path, null, pattern);
|
|
224
|
+
suites.push(suite);
|
|
225
|
+
}
|
|
226
|
+
else if (stats.isFile()) {
|
|
227
|
+
// Single file - use traditional loading
|
|
228
|
+
await loadTestFile(path);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
if (error.code !== 'ENOENT') {
|
|
233
|
+
throw error;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// If we loaded directories, return those suites
|
|
238
|
+
// Otherwise, return suites from traditional loading
|
|
239
|
+
if (suites.length > 0) {
|
|
240
|
+
return suites;
|
|
241
|
+
}
|
|
242
|
+
const { registry } = await import('../api/test.js');
|
|
243
|
+
return registry.getSuites();
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Check if a path is a test file based on extension
|
|
247
|
+
*/
|
|
248
|
+
function isTestFile(filePath) {
|
|
249
|
+
const ext = extname(filePath);
|
|
250
|
+
return ext === '.ts' || ext === '.js';
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/runner/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core entities for the test framework
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* test() 函数的配置选项
|
|
6
|
+
*/
|
|
7
|
+
export interface TestOptions {
|
|
8
|
+
/** 标记为录制测试,仅在 --record 模式下运行 */
|
|
9
|
+
record?: boolean;
|
|
10
|
+
/** 测试超时时间(毫秒) */
|
|
11
|
+
timeout?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* describe() 函数的配置选项
|
|
15
|
+
*/
|
|
16
|
+
export interface DescribeOptions {
|
|
17
|
+
/** 标记为录制测试套件,内部所有测试默认继承此配置 */
|
|
18
|
+
record?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Named hook entry for beforeAll/afterAll
|
|
22
|
+
*/
|
|
23
|
+
export interface NamedHookEntry {
|
|
24
|
+
name?: string;
|
|
25
|
+
fn: (context: TestContext) => Promise<Record<string, unknown> | void> | Record<string, unknown> | void;
|
|
26
|
+
}
|
|
27
|
+
export interface TestSuite {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
tests: TestCase[];
|
|
31
|
+
suites?: TestSuite[];
|
|
32
|
+
parent?: TestSuite;
|
|
33
|
+
config: SuiteConfig;
|
|
34
|
+
options?: DescribeOptions;
|
|
35
|
+
beforeAll?: NamedHookEntry[];
|
|
36
|
+
afterAll?: NamedHookEntry[];
|
|
37
|
+
}
|
|
38
|
+
export interface SuiteConfig {
|
|
39
|
+
timeouts?: {
|
|
40
|
+
suiteMs?: number;
|
|
41
|
+
testMs?: number;
|
|
42
|
+
};
|
|
43
|
+
parallel?: {
|
|
44
|
+
workers?: number;
|
|
45
|
+
};
|
|
46
|
+
record?: {
|
|
47
|
+
enabled?: boolean;
|
|
48
|
+
castFile?: string;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export interface TestCase {
|
|
52
|
+
id: string;
|
|
53
|
+
name: string;
|
|
54
|
+
steps: Step[];
|
|
55
|
+
timeout?: number;
|
|
56
|
+
fixtures?: Record<string, unknown>;
|
|
57
|
+
fn: TestFunction;
|
|
58
|
+
options?: TestOptions;
|
|
59
|
+
}
|
|
60
|
+
export type TestFunction = (context: TestContext) => Promise<void>;
|
|
61
|
+
export interface TestContext {
|
|
62
|
+
terminal: TerminalAPI;
|
|
63
|
+
[key: string]: unknown;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 命令执行结果
|
|
67
|
+
*/
|
|
68
|
+
export interface CommandResult {
|
|
69
|
+
/** 命令退出码(0 表示成功) */
|
|
70
|
+
code: number;
|
|
71
|
+
/** 标准输出 */
|
|
72
|
+
stdout: string;
|
|
73
|
+
/** 标准错误 */
|
|
74
|
+
stderr: string;
|
|
75
|
+
/** 混合输出(stdout + stderr 合并) */
|
|
76
|
+
output: string;
|
|
77
|
+
/** 命令执行时长(毫秒) */
|
|
78
|
+
duration: number;
|
|
79
|
+
/** 原始命令字符串 */
|
|
80
|
+
command: string;
|
|
81
|
+
/** 是否成功(code === 0) */
|
|
82
|
+
readonly successful: boolean;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* PTY 进程控制器
|
|
86
|
+
* 实现 PromiseLike,既可以作为 Promise 使用(await 自动调用 wait()),也可以作为控制器使用
|
|
87
|
+
*/
|
|
88
|
+
export interface PTYProcess extends PromiseLike<CommandResult> {
|
|
89
|
+
/** 等待指定文本出现 */
|
|
90
|
+
expect(text: string, options?: {
|
|
91
|
+
timeout?: number;
|
|
92
|
+
}): Promise<void>;
|
|
93
|
+
/** 发送输入到进程(自动追加换行符) */
|
|
94
|
+
send(input: string): Promise<void>;
|
|
95
|
+
/** 发送原始输入(不追加换行符) */
|
|
96
|
+
sendRaw(input: string): Promise<void>;
|
|
97
|
+
/** 等待命令完成并返回结果 */
|
|
98
|
+
wait(options?: {
|
|
99
|
+
timeout?: number;
|
|
100
|
+
}): Promise<CommandResult>;
|
|
101
|
+
/** 启动命令执行,等待输入完成(不等待命令执行完成) */
|
|
102
|
+
start(): Promise<void>;
|
|
103
|
+
/** 发送 Ctrl+C */
|
|
104
|
+
interrupt(): Promise<void>;
|
|
105
|
+
/** Promise catch 方法 */
|
|
106
|
+
catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null): Promise<CommandResult | TResult>;
|
|
107
|
+
/** Promise finally 方法 */
|
|
108
|
+
finally(onfinally?: (() => void) | null): Promise<CommandResult>;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* run() 方法选项
|
|
112
|
+
*/
|
|
113
|
+
export interface RunOptions {
|
|
114
|
+
/** 命令超时时间(毫秒),默认:30000 */
|
|
115
|
+
timeout?: number;
|
|
116
|
+
/** 环境变量(可选) */
|
|
117
|
+
env?: Record<string, string>;
|
|
118
|
+
/** 工作目录(可选) */
|
|
119
|
+
cwd?: string;
|
|
120
|
+
/**
|
|
121
|
+
* 标记为交互式命令,使用 PTY 执行
|
|
122
|
+
* 交互式模式支持 expect/send 方法,但 exitCode 不可靠
|
|
123
|
+
*/
|
|
124
|
+
interactive?: boolean;
|
|
125
|
+
/**
|
|
126
|
+
* 静默模式:即使在录制模式下也使用 Bun.spawn 执行
|
|
127
|
+
* 用于需要精确解析输出的场景(如 JSON 解析)
|
|
128
|
+
* 注意:此模式下命令不会在录制中显示
|
|
129
|
+
*/
|
|
130
|
+
silent?: boolean;
|
|
131
|
+
/**
|
|
132
|
+
* 录制模式:打字速度 (ms/字符)
|
|
133
|
+
* 默认值:80ms,设为 0 则直接写入不打字
|
|
134
|
+
*/
|
|
135
|
+
typingSpeed?: number;
|
|
136
|
+
/**
|
|
137
|
+
* 录制模式:命令执行后暂停时间 (ms)
|
|
138
|
+
* 用于让观众有时间阅读输出
|
|
139
|
+
*/
|
|
140
|
+
pauseAfter?: number;
|
|
141
|
+
/**
|
|
142
|
+
* 录制模式:命令执行前暂停时间 (ms)
|
|
143
|
+
*/
|
|
144
|
+
pauseBefore?: number;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* 插件工厂类型 - 用于为新终端创建插件实例
|
|
148
|
+
*/
|
|
149
|
+
export type PluginFactory<TPlugins = Record<string, unknown>> = (terminal: TerminalAPI) => TPlugins;
|
|
150
|
+
/**
|
|
151
|
+
* 带插件的终端接口
|
|
152
|
+
*/
|
|
153
|
+
export interface TerminalWithPlugins<TPlugins = Record<string, unknown>> extends TerminalAPI {
|
|
154
|
+
/** 插件实例(与主终端相同配置) */
|
|
155
|
+
plugins: TPlugins;
|
|
156
|
+
}
|
|
157
|
+
export interface TerminalAPI {
|
|
158
|
+
/**
|
|
159
|
+
* 执行命令,返回 PTYProcess(可 await 或使用控制器方法)
|
|
160
|
+
*
|
|
161
|
+
* 用法:
|
|
162
|
+
* - 非交互式:直接 await,获取 CommandResult
|
|
163
|
+
* `const result = await terminal.run('echo hello');`
|
|
164
|
+
*
|
|
165
|
+
* - 交互式:不 await,使用控制器方法
|
|
166
|
+
* `const proc = terminal.run('vim file.txt');`
|
|
167
|
+
* `await proc.expect('~');`
|
|
168
|
+
* `await proc.send(':q');`
|
|
169
|
+
* `const result = await proc;`
|
|
170
|
+
*
|
|
171
|
+
* @param command - 要执行的命令
|
|
172
|
+
* @param options - 可选配置
|
|
173
|
+
*/
|
|
174
|
+
run(command: string, options?: RunOptions): PTYProcess;
|
|
175
|
+
/** 发送输入到终端 */
|
|
176
|
+
send(text: string): Promise<void>;
|
|
177
|
+
/** 等待指定文本出现 */
|
|
178
|
+
waitForText(text: string, options?: WaitOptions): Promise<void>;
|
|
179
|
+
/** 获取当前终端输出快照 */
|
|
180
|
+
snapshot(): Promise<string>;
|
|
181
|
+
/** 关闭终端 */
|
|
182
|
+
close(): Promise<void>;
|
|
183
|
+
/**
|
|
184
|
+
* 创建新的终端实例(多终端测试)
|
|
185
|
+
* 如果设置了插件工厂,返回的终端会自动携带 plugins 属性
|
|
186
|
+
*/
|
|
187
|
+
create<TPlugins = Record<string, unknown>>(): Promise<TerminalWithPlugins<TPlugins>>;
|
|
188
|
+
/** 检查是否处于录制模式 */
|
|
189
|
+
isRecording?(): boolean;
|
|
190
|
+
/** 检查是否处于 PTY 模式(包括录制模式和 ptyOnly 模式) */
|
|
191
|
+
isPtyMode?(): boolean;
|
|
192
|
+
/**
|
|
193
|
+
* 设置插件工厂(用于 create() 自动注入插件)
|
|
194
|
+
* @internal 由插件系统调用
|
|
195
|
+
*/
|
|
196
|
+
setPluginFactory?<TPlugins>(factory: PluginFactory<TPlugins>): void;
|
|
197
|
+
}
|
|
198
|
+
export interface WaitOptions {
|
|
199
|
+
timeout?: number;
|
|
200
|
+
/**
|
|
201
|
+
* 是否移除 ANSI 转义序列后再匹配文本(录制模式下默认 true)
|
|
202
|
+
* 设为 false 可保留原始输出,用于测试 ANSI 相关功能
|
|
203
|
+
*/
|
|
204
|
+
stripAnsi?: boolean;
|
|
205
|
+
}
|
|
206
|
+
export interface Step {
|
|
207
|
+
id: string;
|
|
208
|
+
type: 'input' | 'wait' | 'assert' | 'step';
|
|
209
|
+
payload: unknown;
|
|
210
|
+
timeout?: number;
|
|
211
|
+
name?: string;
|
|
212
|
+
}
|
|
213
|
+
export interface RunResult {
|
|
214
|
+
id: string;
|
|
215
|
+
suiteId: string;
|
|
216
|
+
caseId: string;
|
|
217
|
+
suiteName: string;
|
|
218
|
+
suitePath: string[];
|
|
219
|
+
caseName: string;
|
|
220
|
+
status: 'pass' | 'fail' | 'skip';
|
|
221
|
+
durationMs: number;
|
|
222
|
+
error?: TestError;
|
|
223
|
+
artifacts: Artifact[];
|
|
224
|
+
recordingPath?: string;
|
|
225
|
+
}
|
|
226
|
+
export interface CommandLog {
|
|
227
|
+
command: string;
|
|
228
|
+
code: number;
|
|
229
|
+
stdout: string;
|
|
230
|
+
stderr: string;
|
|
231
|
+
output: string;
|
|
232
|
+
duration: number;
|
|
233
|
+
}
|
|
234
|
+
export interface TestError {
|
|
235
|
+
message: string;
|
|
236
|
+
stack?: string;
|
|
237
|
+
expected?: unknown;
|
|
238
|
+
actual?: unknown;
|
|
239
|
+
commandLogs?: CommandLog[];
|
|
240
|
+
}
|
|
241
|
+
export interface Artifact {
|
|
242
|
+
id: string;
|
|
243
|
+
runResultId: string;
|
|
244
|
+
type: 'cast' | 'log' | 'snapshot';
|
|
245
|
+
path: string;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Run status for API endpoint
|
|
249
|
+
*/
|
|
250
|
+
export interface RunStatus {
|
|
251
|
+
runId: string;
|
|
252
|
+
status: 'queued' | 'running' | 'passed' | 'failed';
|
|
253
|
+
totals: {
|
|
254
|
+
passed: number;
|
|
255
|
+
failed: number;
|
|
256
|
+
skipped: number;
|
|
257
|
+
};
|
|
258
|
+
durationMs?: number;
|
|
259
|
+
results?: RunResult[];
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/runner/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/runner/models.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single-runner execution pipeline
|
|
3
|
+
* Executes test suites and cases, manages lifecycle with onion execution model
|
|
4
|
+
*/
|
|
5
|
+
import type { TestSuite, TestCase, RunResult } from './models.js';
|
|
6
|
+
import { ArtifactManager } from './artifacts.js';
|
|
7
|
+
import type { RunConfig } from './config.js';
|
|
8
|
+
export interface RunnerOptions {
|
|
9
|
+
config: RunConfig;
|
|
10
|
+
artifactManager: ArtifactManager;
|
|
11
|
+
onResult?: (result: RunResult) => void;
|
|
12
|
+
onTestStart?: (testInfo: {
|
|
13
|
+
suitePath: string[];
|
|
14
|
+
testName: string;
|
|
15
|
+
}) => void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Execute a single test suite with lifecycle hooks (onion model)
|
|
19
|
+
*
|
|
20
|
+
* Execution order:
|
|
21
|
+
* 1. Run beforeAll hooks for this suite
|
|
22
|
+
* 2. Merge beforeAll context with inherited context
|
|
23
|
+
* 3. Run tests in this suite
|
|
24
|
+
* 4. Recursively run child suites
|
|
25
|
+
* 5. Run afterAll hooks for this suite
|
|
26
|
+
*/
|
|
27
|
+
export declare function runSuite(suite: TestSuite, options: RunnerOptions, inheritedContext?: Record<string, unknown>): Promise<RunResult[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Execute a single test case
|
|
30
|
+
*/
|
|
31
|
+
export declare function runTest(testCase: TestCase, suite: TestSuite, options: RunnerOptions, inheritedContext?: Record<string, unknown>): Promise<RunResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Execute all test suites with lifecycle hooks
|
|
34
|
+
*/
|
|
35
|
+
export declare function runAllSuites(suites: TestSuite[], options: RunnerOptions): Promise<RunResult[]>;
|
|
36
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/runner/runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AAE/E,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,SAAS,CAAC;IAClB,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC7E;AA0CD;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAC7C,OAAO,CAAC,SAAS,EAAE,CAAC,CA6BtB;AAeD;;GAEG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAC7C,OAAO,CAAC,SAAS,CAAC,CA+HpB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EAAE,EACnB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,SAAS,EAAE,CAAC,CAStB"}
|