@scenetest/scenes 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/LICENSE +21 -0
- package/dist/__tests__/devices.test.d.ts +2 -0
- package/dist/__tests__/devices.test.d.ts.map +1 -0
- package/dist/__tests__/devices.test.js +117 -0
- package/dist/__tests__/devices.test.js.map +1 -0
- package/dist/__tests__/dsl.test.d.ts +2 -0
- package/dist/__tests__/dsl.test.d.ts.map +1 -0
- package/dist/__tests__/dsl.test.js +385 -0
- package/dist/__tests__/dsl.test.js.map +1 -0
- package/dist/__tests__/markdown-scene.test.d.ts +2 -0
- package/dist/__tests__/markdown-scene.test.d.ts.map +1 -0
- package/dist/__tests__/markdown-scene.test.js +508 -0
- package/dist/__tests__/markdown-scene.test.js.map +1 -0
- package/dist/__tests__/reactive.test.d.ts +2 -0
- package/dist/__tests__/reactive.test.d.ts.map +1 -0
- package/dist/__tests__/reactive.test.js +383 -0
- package/dist/__tests__/reactive.test.js.map +1 -0
- package/dist/__tests__/swarm.test.d.ts +2 -0
- package/dist/__tests__/swarm.test.d.ts.map +1 -0
- package/dist/__tests__/swarm.test.js +214 -0
- package/dist/__tests__/swarm.test.js.map +1 -0
- package/dist/actor.d.ts +104 -0
- package/dist/actor.d.ts.map +1 -0
- package/dist/actor.js +527 -0
- package/dist/actor.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +273 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +21 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +120 -0
- package/dist/config.js.map +1 -0
- package/dist/devices.d.ts +55 -0
- package/dist/devices.d.ts.map +1 -0
- package/dist/devices.js +167 -0
- package/dist/devices.js.map +1 -0
- package/dist/dsl.d.ts +99 -0
- package/dist/dsl.d.ts.map +1 -0
- package/dist/dsl.js +247 -0
- package/dist/dsl.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +9 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +27 -0
- package/dist/init.js.map +1 -0
- package/dist/loader.d.ts +2 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +10 -0
- package/dist/loader.js.map +1 -0
- package/dist/markdown-scene.d.ts +120 -0
- package/dist/markdown-scene.d.ts.map +1 -0
- package/dist/markdown-scene.js +452 -0
- package/dist/markdown-scene.js.map +1 -0
- package/dist/message-bus.d.ts +31 -0
- package/dist/message-bus.d.ts.map +1 -0
- package/dist/message-bus.js +74 -0
- package/dist/message-bus.js.map +1 -0
- package/dist/reactive.d.ts +267 -0
- package/dist/reactive.d.ts.map +1 -0
- package/dist/reactive.js +779 -0
- package/dist/reactive.js.map +1 -0
- package/dist/runner.d.ts +51 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +306 -0
- package/dist/runner.js.map +1 -0
- package/dist/scene.d.ts +40 -0
- package/dist/scene.d.ts.map +1 -0
- package/dist/scene.js +110 -0
- package/dist/scene.js.map +1 -0
- package/dist/selectors.d.ts +57 -0
- package/dist/selectors.d.ts.map +1 -0
- package/dist/selectors.js +193 -0
- package/dist/selectors.js.map +1 -0
- package/dist/swarm.d.ts +64 -0
- package/dist/swarm.d.ts.map +1 -0
- package/dist/swarm.js +306 -0
- package/dist/swarm.js.map +1 -0
- package/dist/team-manager.d.ts +120 -0
- package/dist/team-manager.d.ts.map +1 -0
- package/dist/team-manager.js +267 -0
- package/dist/team-manager.js.map +1 -0
- package/dist/types.d.ts +653 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Michael Snook
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/devices.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { DeviceRotation, builtinDevices } from '../devices.js';
|
|
3
|
+
describe('builtinDevices', () => {
|
|
4
|
+
it('contains mobile, tablet, and desktop devices', () => {
|
|
5
|
+
const categories = new Set(builtinDevices.map((d) => d.category));
|
|
6
|
+
expect(categories).toContain('mobile');
|
|
7
|
+
expect(categories).toContain('tablet');
|
|
8
|
+
expect(categories).toContain('desktop');
|
|
9
|
+
});
|
|
10
|
+
it('has at least 2 devices per category', () => {
|
|
11
|
+
const mobile = builtinDevices.filter((d) => d.category === 'mobile');
|
|
12
|
+
const tablet = builtinDevices.filter((d) => d.category === 'tablet');
|
|
13
|
+
const desktop = builtinDevices.filter((d) => d.category === 'desktop');
|
|
14
|
+
expect(mobile.length).toBeGreaterThanOrEqual(2);
|
|
15
|
+
expect(tablet.length).toBeGreaterThanOrEqual(2);
|
|
16
|
+
expect(desktop.length).toBeGreaterThanOrEqual(2);
|
|
17
|
+
});
|
|
18
|
+
it('every device has valid contextOptions with viewport', () => {
|
|
19
|
+
for (const device of builtinDevices) {
|
|
20
|
+
expect(device.name).toBeTruthy();
|
|
21
|
+
expect(device.contextOptions).toBeDefined();
|
|
22
|
+
expect(device.contextOptions.viewport).toBeDefined();
|
|
23
|
+
expect(device.contextOptions.viewport.width).toBeGreaterThan(0);
|
|
24
|
+
expect(device.contextOptions.viewport.height).toBeGreaterThan(0);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
it('mobile devices have isMobile=true and hasTouch=true', () => {
|
|
28
|
+
const mobiles = builtinDevices.filter((d) => d.category === 'mobile');
|
|
29
|
+
for (const device of mobiles) {
|
|
30
|
+
expect(device.contextOptions.isMobile).toBe(true);
|
|
31
|
+
expect(device.contextOptions.hasTouch).toBe(true);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
it('desktop devices have isMobile=false', () => {
|
|
35
|
+
const desktops = builtinDevices.filter((d) => d.category === 'desktop');
|
|
36
|
+
for (const device of desktops) {
|
|
37
|
+
expect(device.contextOptions.isMobile).toBe(false);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe('DeviceRotation', () => {
|
|
42
|
+
it('rotates through devices in order', () => {
|
|
43
|
+
const pool = [
|
|
44
|
+
{ name: 'A', category: 'mobile', contextOptions: { viewport: { width: 100, height: 200 } } },
|
|
45
|
+
{ name: 'B', category: 'tablet', contextOptions: { viewport: { width: 300, height: 400 } } },
|
|
46
|
+
{ name: 'C', category: 'desktop', contextOptions: { viewport: { width: 500, height: 600 } } },
|
|
47
|
+
];
|
|
48
|
+
const rotation = new DeviceRotation(pool);
|
|
49
|
+
expect(rotation.next().name).toBe('A');
|
|
50
|
+
expect(rotation.next().name).toBe('B');
|
|
51
|
+
expect(rotation.next().name).toBe('C');
|
|
52
|
+
});
|
|
53
|
+
it('wraps around when pool is exhausted', () => {
|
|
54
|
+
const pool = [
|
|
55
|
+
{ name: 'A', category: 'mobile', contextOptions: { viewport: { width: 100, height: 200 } } },
|
|
56
|
+
{ name: 'B', category: 'tablet', contextOptions: { viewport: { width: 300, height: 400 } } },
|
|
57
|
+
];
|
|
58
|
+
const rotation = new DeviceRotation(pool);
|
|
59
|
+
expect(rotation.next().name).toBe('A');
|
|
60
|
+
expect(rotation.next().name).toBe('B');
|
|
61
|
+
expect(rotation.next().name).toBe('A'); // wraps
|
|
62
|
+
expect(rotation.next().name).toBe('B');
|
|
63
|
+
});
|
|
64
|
+
it('uses builtin devices when no custom pool provided', () => {
|
|
65
|
+
const rotation = new DeviceRotation();
|
|
66
|
+
const first = rotation.next();
|
|
67
|
+
expect(builtinDevices.some((d) => d.name === first.name)).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
it('uses builtin devices when empty array provided', () => {
|
|
70
|
+
const rotation = new DeviceRotation([]);
|
|
71
|
+
const first = rotation.next();
|
|
72
|
+
expect(builtinDevices.some((d) => d.name === first.name)).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
it('peek returns next without advancing', () => {
|
|
75
|
+
const pool = [
|
|
76
|
+
{ name: 'A', category: 'mobile', contextOptions: { viewport: { width: 100, height: 200 } } },
|
|
77
|
+
{ name: 'B', category: 'tablet', contextOptions: { viewport: { width: 300, height: 400 } } },
|
|
78
|
+
];
|
|
79
|
+
const rotation = new DeviceRotation(pool);
|
|
80
|
+
expect(rotation.peek().name).toBe('A');
|
|
81
|
+
expect(rotation.peek().name).toBe('A'); // still A
|
|
82
|
+
expect(rotation.next().name).toBe('A'); // now advances
|
|
83
|
+
expect(rotation.peek().name).toBe('B');
|
|
84
|
+
});
|
|
85
|
+
it('reset returns to the beginning', () => {
|
|
86
|
+
const pool = [
|
|
87
|
+
{ name: 'A', category: 'mobile', contextOptions: { viewport: { width: 100, height: 200 } } },
|
|
88
|
+
{ name: 'B', category: 'tablet', contextOptions: { viewport: { width: 300, height: 400 } } },
|
|
89
|
+
];
|
|
90
|
+
const rotation = new DeviceRotation(pool);
|
|
91
|
+
rotation.next();
|
|
92
|
+
rotation.next();
|
|
93
|
+
expect(rotation.currentIndex).toBe(2);
|
|
94
|
+
rotation.reset();
|
|
95
|
+
expect(rotation.currentIndex).toBe(0);
|
|
96
|
+
expect(rotation.next().name).toBe('A');
|
|
97
|
+
});
|
|
98
|
+
it('exposes the device pool as readonly', () => {
|
|
99
|
+
const pool = [
|
|
100
|
+
{ name: 'A', category: 'mobile', contextOptions: { viewport: { width: 100, height: 200 } } },
|
|
101
|
+
];
|
|
102
|
+
const rotation = new DeviceRotation(pool);
|
|
103
|
+
expect(rotation.devices).toHaveLength(1);
|
|
104
|
+
expect(rotation.devices[0].name).toBe('A');
|
|
105
|
+
});
|
|
106
|
+
it('different actors in the same run get different devices', () => {
|
|
107
|
+
const rotation = new DeviceRotation();
|
|
108
|
+
const assigned = new Set();
|
|
109
|
+
// Simulate 5 actors getting devices
|
|
110
|
+
for (let i = 0; i < 5; i++) {
|
|
111
|
+
assigned.add(rotation.next().name);
|
|
112
|
+
}
|
|
113
|
+
// With 10 builtin devices and 5 actors, all should be unique
|
|
114
|
+
expect(assigned.size).toBe(5);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=devices.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.test.js","sourceRoot":"","sources":["../../src/__tests__/devices.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsl.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dsl.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { parseAction, parseDslLines, applyDslAction, } from '../dsl.js';
|
|
3
|
+
import { ConcurrentActorHandleImpl } from '../reactive.js';
|
|
4
|
+
import { MessageBus } from '../message-bus.js';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Helpers
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
function mockLocator(visible = true) {
|
|
9
|
+
return {
|
|
10
|
+
waitFor: vi.fn().mockResolvedValue(undefined),
|
|
11
|
+
isVisible: vi.fn().mockResolvedValue(visible),
|
|
12
|
+
click: vi.fn().mockResolvedValue(undefined),
|
|
13
|
+
fill: vi.fn().mockResolvedValue(undefined),
|
|
14
|
+
check: vi.fn().mockResolvedValue(undefined),
|
|
15
|
+
selectOption: vi.fn().mockResolvedValue(undefined),
|
|
16
|
+
evaluate: vi.fn().mockResolvedValue(undefined),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function mockPage() {
|
|
20
|
+
const locator = mockLocator();
|
|
21
|
+
return {
|
|
22
|
+
goto: vi.fn().mockResolvedValue(undefined),
|
|
23
|
+
getByText: vi.fn().mockReturnValue({ first: () => locator }),
|
|
24
|
+
locator: vi.fn().mockReturnValue(locator),
|
|
25
|
+
evaluate: vi.fn().mockResolvedValue(undefined),
|
|
26
|
+
_locator: locator,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function createTestActor(role = 'user') {
|
|
30
|
+
const bus = new MessageBus();
|
|
31
|
+
const timeline = [];
|
|
32
|
+
const warnings = [];
|
|
33
|
+
const page = mockPage();
|
|
34
|
+
const actor = new ConcurrentActorHandleImpl(role, { id: `${role}-1`, username: role, email: `${role}@test.com`, password: 'pass' }, page, bus, timeline, warnings, 5000, 60000);
|
|
35
|
+
return { actor, bus, timeline, warnings, page };
|
|
36
|
+
}
|
|
37
|
+
/** Build a minimal DslTarget spy that records calls */
|
|
38
|
+
function createSpyTarget() {
|
|
39
|
+
const calls = [];
|
|
40
|
+
return {
|
|
41
|
+
calls,
|
|
42
|
+
openTo(url) { calls.push(`openTo:${url}`); return this; },
|
|
43
|
+
see(s) { calls.push(`see:${s}`); return this; },
|
|
44
|
+
seeInView(s) { calls.push(`seeInView:${s}`); return this; },
|
|
45
|
+
notSee(s) { calls.push(`notSee:${s}`); return this; },
|
|
46
|
+
seeText(t) { calls.push(`seeText:${t}`); return this; },
|
|
47
|
+
seeToast(s) { calls.push(`seeToast:${s}`); return this; },
|
|
48
|
+
click(s) { calls.push(`click:${s ?? '(scope)'}`); return this; },
|
|
49
|
+
typeInto(s, v) { calls.push(`typeInto:${s}=${v}`); return this; },
|
|
50
|
+
check(s) { calls.push(`check:${s}`); return this; },
|
|
51
|
+
select(s, v) { calls.push(`select:${s}=${v}`); return this; },
|
|
52
|
+
wait(ms) { calls.push(`wait:${ms}`); return this; },
|
|
53
|
+
emit(m) { calls.push(`emit:${m}`); return this; },
|
|
54
|
+
waitFor(m) { calls.push(`waitFor:${m}`); return this; },
|
|
55
|
+
warnIf(s, m) { calls.push(`warnIf:${s}=${m}`); },
|
|
56
|
+
up(s) { calls.push(`up:${s ?? '(root)'}`); return this; },
|
|
57
|
+
prev() { calls.push('prev'); return this; },
|
|
58
|
+
scrollToBottom() { calls.push('scrollToBottom'); return this; },
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Parser tests
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
describe('parseAction', () => {
|
|
65
|
+
it('parses value-only actions (openTo, seeText, wait, emit)', () => {
|
|
66
|
+
expect(parseAction('openTo /dashboard')).toEqual({ action: 'openTo', value: '/dashboard' });
|
|
67
|
+
expect(parseAction('seeText Hello World')).toEqual({ action: 'seeText', value: 'Hello World' });
|
|
68
|
+
expect(parseAction('wait 500')).toEqual({ action: 'wait', value: '500' });
|
|
69
|
+
expect(parseAction('emit user-ready')).toEqual({ action: 'emit', value: 'user-ready' });
|
|
70
|
+
});
|
|
71
|
+
it('parses selector-only actions (see, seeInView, notSee, click, check, seeToast, up)', () => {
|
|
72
|
+
expect(parseAction('see main-content')).toEqual({ action: 'see', selector: 'main-content' });
|
|
73
|
+
expect(parseAction('seeInView hero-section')).toEqual({ action: 'seeInView', selector: 'hero-section' });
|
|
74
|
+
expect(parseAction('notSee spinner')).toEqual({ action: 'notSee', selector: 'spinner' });
|
|
75
|
+
expect(parseAction('click submit-btn')).toEqual({ action: 'click', selector: 'submit-btn' });
|
|
76
|
+
expect(parseAction('check remember-me')).toEqual({ action: 'check', selector: 'remember-me' });
|
|
77
|
+
expect(parseAction('seeToast success')).toEqual({ action: 'seeToast', selector: 'success' });
|
|
78
|
+
expect(parseAction('up modal')).toEqual({ action: 'up', selector: 'modal' });
|
|
79
|
+
});
|
|
80
|
+
it('parses selector+value actions (typeInto, select, warnIf)', () => {
|
|
81
|
+
// Simple case: single-word selector, single-word value
|
|
82
|
+
expect(parseAction('typeInto email alice@test.com')).toEqual({
|
|
83
|
+
action: 'typeInto', selector: 'email', value: 'alice@test.com',
|
|
84
|
+
});
|
|
85
|
+
expect(parseAction('select role admin')).toEqual({
|
|
86
|
+
action: 'select', selector: 'role', value: 'admin',
|
|
87
|
+
});
|
|
88
|
+
// warnIf with quoted multi-word message
|
|
89
|
+
expect(parseAction("warnIf modal 'should not see this'")).toEqual({
|
|
90
|
+
action: 'warnIf', selector: 'modal', value: 'should not see this',
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
it('parses nested selectors with typeInto/select (last token is value)', () => {
|
|
94
|
+
// Multi-word selector, single-word value
|
|
95
|
+
expect(parseAction('typeInto modal search-input hello')).toEqual({
|
|
96
|
+
action: 'typeInto', selector: 'modal search-input', value: 'hello',
|
|
97
|
+
});
|
|
98
|
+
expect(parseAction('select form dropdown option1')).toEqual({
|
|
99
|
+
action: 'select', selector: 'form dropdown', value: 'option1',
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
it('parses quoted values (single and double quotes)', () => {
|
|
103
|
+
// Single quotes
|
|
104
|
+
expect(parseAction("typeInto search-input 'hello world'")).toEqual({
|
|
105
|
+
action: 'typeInto', selector: 'search-input', value: 'hello world',
|
|
106
|
+
});
|
|
107
|
+
// Double quotes
|
|
108
|
+
expect(parseAction('typeInto search-input "hello world"')).toEqual({
|
|
109
|
+
action: 'typeInto', selector: 'search-input', value: 'hello world',
|
|
110
|
+
});
|
|
111
|
+
// Nested selector with quoted value
|
|
112
|
+
expect(parseAction("typeInto modal search-input 'hello world'")).toEqual({
|
|
113
|
+
action: 'typeInto', selector: 'modal search-input', value: 'hello world',
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
it('handles selector-only for typeInto/select (no value)', () => {
|
|
117
|
+
// Only selector, no value
|
|
118
|
+
expect(parseAction('typeInto email-input')).toEqual({
|
|
119
|
+
action: 'typeInto', selector: 'email-input',
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
it('parses no-argument actions', () => {
|
|
123
|
+
expect(parseAction('prev')).toEqual({ action: 'prev' });
|
|
124
|
+
expect(parseAction('scrollToBottom')).toEqual({ action: 'scrollToBottom' });
|
|
125
|
+
expect(parseAction('click')).toEqual({ action: 'click' });
|
|
126
|
+
expect(parseAction('up')).toEqual({ action: 'up' });
|
|
127
|
+
});
|
|
128
|
+
it('parses waitFor as value-only action', () => {
|
|
129
|
+
expect(parseAction('waitFor data-ready')).toEqual({ action: 'waitFor', value: 'data-ready' });
|
|
130
|
+
});
|
|
131
|
+
it('throws on empty input', () => {
|
|
132
|
+
expect(() => parseAction('')).toThrow('Empty action line');
|
|
133
|
+
expect(() => parseAction(' ')).toThrow('Empty action line');
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe('parseDslLines', () => {
|
|
137
|
+
it('splits multiline text into action lines', () => {
|
|
138
|
+
const lines = parseDslLines(`
|
|
139
|
+
openTo /login
|
|
140
|
+
see login-form
|
|
141
|
+
typeInto email alice@test.com
|
|
142
|
+
click submit
|
|
143
|
+
`);
|
|
144
|
+
expect(lines).toEqual([
|
|
145
|
+
'openTo /login',
|
|
146
|
+
'see login-form',
|
|
147
|
+
'typeInto email alice@test.com',
|
|
148
|
+
'click submit',
|
|
149
|
+
]);
|
|
150
|
+
});
|
|
151
|
+
it('skips empty lines and comments', () => {
|
|
152
|
+
const lines = parseDslLines(`
|
|
153
|
+
openTo /login
|
|
154
|
+
# This is a comment
|
|
155
|
+
see form
|
|
156
|
+
// Another comment
|
|
157
|
+
|
|
158
|
+
click submit
|
|
159
|
+
`);
|
|
160
|
+
expect(lines).toEqual(['openTo /login', 'see form', 'click submit']);
|
|
161
|
+
});
|
|
162
|
+
it('returns empty array for empty/whitespace input', () => {
|
|
163
|
+
expect(parseDslLines('')).toEqual([]);
|
|
164
|
+
expect(parseDslLines(' \n \n ')).toEqual([]);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
// applyDslAction tests
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
describe('applyDslAction', () => {
|
|
171
|
+
it('dispatches to correct methods on a DslTarget', () => {
|
|
172
|
+
const target = createSpyTarget();
|
|
173
|
+
applyDslAction(target, { action: 'openTo', value: '/login' });
|
|
174
|
+
applyDslAction(target, { action: 'see', selector: 'form' });
|
|
175
|
+
applyDslAction(target, { action: 'typeInto', selector: 'email', value: 'a@b.com' });
|
|
176
|
+
applyDslAction(target, { action: 'click', selector: 'submit' });
|
|
177
|
+
applyDslAction(target, { action: 'scrollToBottom' });
|
|
178
|
+
applyDslAction(target, { action: 'prev' });
|
|
179
|
+
expect(target.calls).toEqual([
|
|
180
|
+
'openTo:/login',
|
|
181
|
+
'see:form',
|
|
182
|
+
'typeInto:email=a@b.com',
|
|
183
|
+
'click:submit',
|
|
184
|
+
'scrollToBottom',
|
|
185
|
+
'prev',
|
|
186
|
+
]);
|
|
187
|
+
});
|
|
188
|
+
it('dispatches bare click (no selector)', () => {
|
|
189
|
+
const target = createSpyTarget();
|
|
190
|
+
applyDslAction(target, { action: 'click' });
|
|
191
|
+
expect(target.calls).toEqual(['click:(scope)']);
|
|
192
|
+
});
|
|
193
|
+
it('dispatches seeInView', () => {
|
|
194
|
+
const target = createSpyTarget();
|
|
195
|
+
applyDslAction(target, { action: 'seeInView', selector: 'hero' });
|
|
196
|
+
expect(target.calls).toEqual(['seeInView:hero']);
|
|
197
|
+
});
|
|
198
|
+
it('dispatches bare up (no selector) for page root reset', () => {
|
|
199
|
+
const target = createSpyTarget();
|
|
200
|
+
applyDslAction(target, { action: 'up' });
|
|
201
|
+
expect(target.calls).toEqual(['up:(root)']);
|
|
202
|
+
});
|
|
203
|
+
it('dispatches up with selector', () => {
|
|
204
|
+
const target = createSpyTarget();
|
|
205
|
+
applyDslAction(target, { action: 'up', selector: '~container' });
|
|
206
|
+
expect(target.calls).toEqual(['up:~container']);
|
|
207
|
+
});
|
|
208
|
+
it('dispatches waitFor on targets that support it', () => {
|
|
209
|
+
const target = createSpyTarget();
|
|
210
|
+
target.waitFor = (m) => { target.calls.push(`waitFor:${m}`); };
|
|
211
|
+
applyDslAction(target, { action: 'waitFor', value: 'setup-done' });
|
|
212
|
+
expect(target.calls).toEqual(['waitFor:setup-done']);
|
|
213
|
+
});
|
|
214
|
+
it('throws on unknown action', () => {
|
|
215
|
+
const target = createSpyTarget();
|
|
216
|
+
expect(() => applyDslAction(target, { action: 'flyTo' })).toThrow('Unknown DSL action: flyTo');
|
|
217
|
+
});
|
|
218
|
+
it('throws when required arguments are missing', () => {
|
|
219
|
+
const target = createSpyTarget();
|
|
220
|
+
expect(() => applyDslAction(target, { action: 'openTo' })).toThrow('openTo requires a URL');
|
|
221
|
+
expect(() => applyDslAction(target, { action: 'see' })).toThrow('see requires a selector');
|
|
222
|
+
expect(() => applyDslAction(target, { action: 'typeInto', selector: 'x' })).toThrow('typeInto requires a value');
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
// ---------------------------------------------------------------------------
|
|
226
|
+
// actor.dsl() method on ConcurrentActorHandleImpl
|
|
227
|
+
// ---------------------------------------------------------------------------
|
|
228
|
+
describe('ConcurrentActorHandleImpl.dsl()', () => {
|
|
229
|
+
it('queues actions from a multiline text DSL string', () => {
|
|
230
|
+
const { actor } = createTestActor();
|
|
231
|
+
actor.dsl(`
|
|
232
|
+
openTo /login
|
|
233
|
+
see login-form
|
|
234
|
+
typeInto email alice@test.com
|
|
235
|
+
click submit
|
|
236
|
+
`);
|
|
237
|
+
expect(actor.pending).toBe(4);
|
|
238
|
+
});
|
|
239
|
+
it('returns the actor for chaining', () => {
|
|
240
|
+
const { actor } = createTestActor();
|
|
241
|
+
const result = actor.dsl(`
|
|
242
|
+
openTo /login
|
|
243
|
+
`);
|
|
244
|
+
expect(result).toBe(actor);
|
|
245
|
+
});
|
|
246
|
+
it('can be chained with other DSL methods', () => {
|
|
247
|
+
const { actor } = createTestActor();
|
|
248
|
+
actor
|
|
249
|
+
.dsl(`
|
|
250
|
+
openTo /login
|
|
251
|
+
see login-form
|
|
252
|
+
`)
|
|
253
|
+
.click('submit')
|
|
254
|
+
.see('dashboard');
|
|
255
|
+
expect(actor.pending).toBe(4);
|
|
256
|
+
});
|
|
257
|
+
it('skips comments and empty lines', () => {
|
|
258
|
+
const { actor } = createTestActor();
|
|
259
|
+
actor.dsl(`
|
|
260
|
+
# Navigate
|
|
261
|
+
openTo /
|
|
262
|
+
|
|
263
|
+
// Verify
|
|
264
|
+
see welcome-box
|
|
265
|
+
`);
|
|
266
|
+
expect(actor.pending).toBe(2);
|
|
267
|
+
});
|
|
268
|
+
it('works with dsl() before manual method calls and drains correctly', async () => {
|
|
269
|
+
const { actor } = createTestActor();
|
|
270
|
+
const order = [];
|
|
271
|
+
actor.dsl(`
|
|
272
|
+
openTo /
|
|
273
|
+
`);
|
|
274
|
+
actor.do(async () => { order.push('after-dsl'); });
|
|
275
|
+
await actor.drain();
|
|
276
|
+
// openTo and do both executed
|
|
277
|
+
expect(order).toEqual(['after-dsl']);
|
|
278
|
+
});
|
|
279
|
+
it('queues actions in correct order when mixed with method calls', () => {
|
|
280
|
+
const { actor } = createTestActor();
|
|
281
|
+
actor.openTo('/');
|
|
282
|
+
actor.dsl(`
|
|
283
|
+
see header
|
|
284
|
+
click menu
|
|
285
|
+
`);
|
|
286
|
+
actor.see('page-content');
|
|
287
|
+
// 1 openTo + 2 dsl + 1 see = 4
|
|
288
|
+
expect(actor.pending).toBe(4);
|
|
289
|
+
});
|
|
290
|
+
// -------------------------------------------------------------------------
|
|
291
|
+
// Interpolation tests
|
|
292
|
+
// -------------------------------------------------------------------------
|
|
293
|
+
it('interpolates [self.field] with actor own fields', () => {
|
|
294
|
+
const { actor, page } = createTestActor('alice');
|
|
295
|
+
actor.dsl(`
|
|
296
|
+
typeInto email [self.email]
|
|
297
|
+
typeInto username [self.username]
|
|
298
|
+
`);
|
|
299
|
+
expect(actor.pending).toBe(2);
|
|
300
|
+
// We can verify the interpolated values by draining and checking fill calls
|
|
301
|
+
});
|
|
302
|
+
it('interpolates [role.field] with other actor fields', () => {
|
|
303
|
+
const bus = new MessageBus();
|
|
304
|
+
const timeline = [];
|
|
305
|
+
const warnings = [];
|
|
306
|
+
// Create alice
|
|
307
|
+
const alicePage = mockPage();
|
|
308
|
+
const alice = new ConcurrentActorHandleImpl('alice', { id: 'alice-1', username: 'alice_user', email: 'alice@test.com', password: 'pass' }, alicePage, bus, timeline, warnings, 5000, 60000);
|
|
309
|
+
// Create bob
|
|
310
|
+
const bobPage = mockPage();
|
|
311
|
+
const bob = new ConcurrentActorHandleImpl('bob', { id: 'bob-1', username: 'bob_user', email: 'bob@test.com', password: 'pass' }, bobPage, bus, timeline, warnings, 5000, 60000);
|
|
312
|
+
// Set up actor registry
|
|
313
|
+
const registry = new Map();
|
|
314
|
+
registry.set('alice', alice);
|
|
315
|
+
registry.set('bob', bob);
|
|
316
|
+
alice._setActorRegistry(registry);
|
|
317
|
+
bob._setActorRegistry(registry);
|
|
318
|
+
// Alice references bob's username
|
|
319
|
+
alice.dsl(`
|
|
320
|
+
typeInto search-input [bob.username]
|
|
321
|
+
see user-card-[bob.id]
|
|
322
|
+
`);
|
|
323
|
+
expect(alice.pending).toBe(2);
|
|
324
|
+
});
|
|
325
|
+
it('escapes interpolated values to prevent selector injection', () => {
|
|
326
|
+
const bus = new MessageBus();
|
|
327
|
+
const timeline = [];
|
|
328
|
+
const warnings = [];
|
|
329
|
+
const page = mockPage();
|
|
330
|
+
// Create actor with potentially dangerous field values
|
|
331
|
+
const actor = new ConcurrentActorHandleImpl('hacker', {
|
|
332
|
+
id: 'user-1',
|
|
333
|
+
username: "test[inject]'value",
|
|
334
|
+
email: 'test@test.com',
|
|
335
|
+
password: 'pass',
|
|
336
|
+
}, page, bus, timeline, warnings, 5000, 60000);
|
|
337
|
+
// Self-reference with dangerous characters should be escaped
|
|
338
|
+
actor.dsl(`
|
|
339
|
+
see user-card-[self.username]
|
|
340
|
+
`);
|
|
341
|
+
expect(actor.pending).toBe(1);
|
|
342
|
+
// The brackets and quotes in username should be escaped
|
|
343
|
+
});
|
|
344
|
+
it('throws on unknown [self.field] reference', () => {
|
|
345
|
+
const { actor } = createTestActor();
|
|
346
|
+
expect(() => {
|
|
347
|
+
actor.dsl('typeInto input [self.nonexistent]');
|
|
348
|
+
}).toThrow('[self.nonexistent]');
|
|
349
|
+
});
|
|
350
|
+
it('throws on unknown [role.field] when actor not in registry', () => {
|
|
351
|
+
const { actor } = createTestActor();
|
|
352
|
+
// No registry set - should throw
|
|
353
|
+
expect(() => {
|
|
354
|
+
actor.dsl('typeInto input [bob.username]');
|
|
355
|
+
}).toThrow('cannot reference other actors outside a scene context');
|
|
356
|
+
});
|
|
357
|
+
it('throws on unknown actor in [role.field] reference', () => {
|
|
358
|
+
const bus = new MessageBus();
|
|
359
|
+
const timeline = [];
|
|
360
|
+
const warnings = [];
|
|
361
|
+
const page = mockPage();
|
|
362
|
+
const actor = new ConcurrentActorHandleImpl('alice', { id: 'alice-1', username: 'alice', email: 'alice@test.com', password: 'pass' }, page, bus, timeline, warnings, 5000, 60000);
|
|
363
|
+
// Set up registry with only alice
|
|
364
|
+
const registry = new Map();
|
|
365
|
+
registry.set('alice', actor);
|
|
366
|
+
actor._setActorRegistry(registry);
|
|
367
|
+
expect(() => {
|
|
368
|
+
actor.dsl('typeInto input [bob.username]');
|
|
369
|
+
}).toThrow('unknown actor "bob"');
|
|
370
|
+
});
|
|
371
|
+
it('supports compound selectors with interpolation', () => {
|
|
372
|
+
const bus = new MessageBus();
|
|
373
|
+
const timeline = [];
|
|
374
|
+
const warnings = [];
|
|
375
|
+
const page = mockPage();
|
|
376
|
+
const actor = new ConcurrentActorHandleImpl('alice', { id: '12345', username: 'alice', email: 'alice@test.com', password: 'pass' }, page, bus, timeline, warnings, 5000, 60000);
|
|
377
|
+
// Use self reference in compound selector
|
|
378
|
+
actor.dsl(`
|
|
379
|
+
see user-result-[self.id]
|
|
380
|
+
click delete-btn-[self.id]
|
|
381
|
+
`);
|
|
382
|
+
expect(actor.pending).toBe(2);
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
//# sourceMappingURL=dsl.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsl.test.js","sourceRoot":"","sources":["../../src/__tests__/dsl.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-scene.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/markdown-scene.test.ts"],"names":[],"mappings":""}
|