ftmocks-utils 1.4.4 → 1.4.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ftmocks-utils",
3
- "version": "1.4.4",
3
+ "version": "1.4.5",
4
4
  "description": "Util functions for FtMocks",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -37,51 +37,79 @@ const getLocator = async (page, event) => {
37
37
  return event.target;
38
38
  };
39
39
 
40
- const runEvent = async (page, event, delay = 0) => {
40
+ const getSelectorPosition = async (page, selector) => {
41
+ const element = await page.locator(selector).elementHandle();
42
+ const position = await element.boundingBox();
43
+ console.log("position", position);
44
+ return position;
45
+ };
46
+
47
+ const runEvent = async ({
48
+ page,
49
+ event,
50
+ delay = 0,
51
+ screenshots = false,
52
+ screenshotsDir = null,
53
+ }) => {
41
54
  try {
42
55
  console.log("➡ Running event", event);
56
+ const beforeEvent = async () => {
57
+ await page.waitForTimeout(delay);
58
+ if (screenshots) {
59
+ const locator = await getLocator(page, event);
60
+ const position = await getSelectorPosition(page, locator);
61
+ event.screenshotInfo = {
62
+ name: `${event.id}.png`,
63
+ position,
64
+ };
65
+ await page.screenshot({
66
+ path: path.join(screenshotsDir, `${event.id}.png`),
67
+ fullPage: false,
68
+ });
69
+ }
70
+ };
43
71
  switch (event.type) {
44
72
  case "url":
45
73
  await page.goto(event.value);
46
74
  break;
47
75
  case "click":
48
- await page.waitForTimeout(delay);
76
+ await beforeEvent();
49
77
  await page.click(await getLocator(page, event));
50
78
  break;
51
79
  case "input":
52
- await page.waitForTimeout(delay);
80
+ await beforeEvent();
53
81
  await page.fill(await getLocator(page, event), event.value);
54
82
  break;
55
83
  case "keypress":
56
- await page.waitForTimeout(delay);
84
+ await beforeEvent();
57
85
  await page.keyboard.press(await getLocator(page, event), event.key);
58
86
  break;
59
87
  case "change":
60
- await page.waitForTimeout(delay);
88
+ await beforeEvent();
61
89
  await page.select(await getLocator(page, event), event.value);
62
90
  break;
63
91
  case "url":
64
- await page.waitForTimeout(delay);
92
+ await beforeEvent();
65
93
  await page.goto(await getLocator(page, event), event.value);
66
94
  break;
67
95
  case "dblclick":
68
- await page.waitForTimeout(delay);
96
+ await beforeEvent();
69
97
  await page.dblclick(await getLocator(page, event));
70
98
  break;
71
99
  case "contextmenu":
72
- await page.waitForTimeout(delay);
100
+ await beforeEvent();
73
101
  await page.contextmenu(await getLocator(page, event));
74
102
  break;
75
103
  case "hover":
76
- await page.waitForTimeout(delay);
104
+ await beforeEvent();
77
105
  await page.hover(await getLocator(page, event));
78
106
  break;
79
107
  case "keydown":
80
- await page.waitForTimeout(delay);
108
+ await beforeEvent();
81
109
  await page.keyboard.down(await getLocator(page, event), event.key);
82
110
  break;
83
111
  case "keyup":
84
- await page.waitForTimeout(delay);
112
+ await beforeEvent();
85
113
  await page.keyboard.up(await getLocator(page, event), event.key);
86
114
  break;
87
115
  default:
@@ -129,9 +157,15 @@ const isValidEvent = (event) => {
129
157
  return false;
130
158
  };
131
159
 
132
- const runEvents = async (page, events, delay = 1000) => {
160
+ const runEvents = async ({
161
+ page,
162
+ events,
163
+ delay = 1000,
164
+ screenshots = false,
165
+ screenshotsDir = null,
166
+ }) => {
133
167
  for (const event of events) {
134
- await runEvent(page, event, delay);
168
+ await runEvent({ page, event, delay, screenshots, screenshotsDir });
135
169
  }
136
170
  };
137
171
 
@@ -142,14 +176,12 @@ const runEventsForTest = async (page, ftmocksConifg, testName) => {
142
176
  `_events.json`
143
177
  );
144
178
  const events = JSON.parse(fs.readFileSync(eventsFile, "utf8"));
145
- await runEvents(page, events, ftmocksConifg.delay || 1000);
146
- };
147
-
148
- const getSelectorPosition = async (page, selector) => {
149
- const element = await page.locator(selector).elementHandle();
150
- const position = await element.boundingBox();
151
- console.log("position", position);
152
- return position;
179
+ await runEvents({
180
+ page,
181
+ events,
182
+ delay: ftmocksConifg.delay || 1000,
183
+ screenshots: false,
184
+ });
153
185
  };
154
186
 
155
187
  const runEventsInPresentationMode = async (page, ftmocksConifg, testName) => {
@@ -168,10 +200,10 @@ const runEventsInPresentationMode = async (page, ftmocksConifg, testName) => {
168
200
  console.log("➡ No more events to run!");
169
201
  return false;
170
202
  }
171
- let result = await runEvent(page, events[currentEventIndex]);
203
+ let result = await runEvent({ page, event: events[currentEventIndex] });
172
204
  while (result === "Unsupported event type") {
173
205
  currentEventIndex = currentEventIndex + 1;
174
- result = await runEvent(page, events[currentEventIndex]);
206
+ result = await runEvent({ page, event: events[currentEventIndex] });
175
207
  }
176
208
  currentEventIndex = currentEventIndex + 1;
177
209
  return true;
@@ -206,7 +238,7 @@ const runEventsInPresentationMode = async (page, ftmocksConifg, testName) => {
206
238
  });
207
239
  });
208
240
 
209
- await runEvent(page, events[0]);
241
+ await runEvent({ page, event: events[0] });
210
242
  };
211
243
 
212
244
  const runEventsInTrainingMode = async (page, ftmocksConifg, testName) => {
@@ -375,6 +407,15 @@ const runEventsInTrainingMode = async (page, ftmocksConifg, testName) => {
375
407
  }
376
408
  };
377
409
 
410
+ const showNextEvent = async () => {
411
+ currentEventInfo = await window.getNextEvent();
412
+ if (currentEventInfo) {
413
+ showPopover(currentEventInfo);
414
+ } else {
415
+ hidePopover();
416
+ }
417
+ };
418
+
378
419
  const matchElement = (event, currentEventInfo) => {
379
420
  const inBoudingBox =
380
421
  currentEventInfo?.position?.x <= event.clientX &&
@@ -400,13 +441,7 @@ const runEventsInTrainingMode = async (page, ftmocksConifg, testName) => {
400
441
  matchElement(event, currentEventInfo)
401
442
  ) {
402
443
  console.log("➡ Click event triggered!", event);
403
- currentEventInfo = await window.getNextEvent();
404
- console.log("➡ Next event", currentEventInfo);
405
- if (currentEventInfo) {
406
- showPopover(currentEventInfo);
407
- } else {
408
- hidePopover();
409
- }
444
+ showNextEvent();
410
445
  }
411
446
  });
412
447
  window.addEventListener("dblclick", async (event) => {
@@ -414,12 +449,7 @@ const runEventsInTrainingMode = async (page, ftmocksConifg, testName) => {
414
449
  currentEventInfo?.event?.type === "dblclick" &&
415
450
  matchElement(event, currentEventInfo)
416
451
  ) {
417
- currentEventInfo = await window.getNextEvent();
418
- if (currentEventInfo) {
419
- showPopover(currentEventInfo);
420
- } else {
421
- hidePopover();
422
- }
452
+ showNextEvent();
423
453
  }
424
454
  });
425
455
  window.addEventListener("contextmenu", async (event) => {
@@ -427,12 +457,7 @@ const runEventsInTrainingMode = async (page, ftmocksConifg, testName) => {
427
457
  currentEventInfo?.event?.type === "contextmenu" &&
428
458
  matchElement(event, currentEventInfo)
429
459
  ) {
430
- currentEventInfo = await window.getNextEvent();
431
- if (currentEventInfo) {
432
- showPopover(currentEventInfo);
433
- } else {
434
- hidePopover();
435
- }
460
+ showNextEvent();
436
461
  }
437
462
  });
438
463
  window.addEventListener("input", async (event) => {
@@ -440,10 +465,7 @@ const runEventsInTrainingMode = async (page, ftmocksConifg, testName) => {
440
465
  currentEventInfo?.event?.type === "input" &&
441
466
  matchElement(event, currentEventInfo)
442
467
  ) {
443
- currentEventInfo = await window.getNextEvent();
444
- if (currentEventInfo) {
445
- showPopover(currentEventInfo);
446
- }
468
+ showNextEvent();
447
469
  }
448
470
  });
449
471
  window.addEventListener("keypress", async (event) => {
@@ -451,15 +473,35 @@ const runEventsInTrainingMode = async (page, ftmocksConifg, testName) => {
451
473
  currentEventInfo?.event?.type === "keypress" &&
452
474
  matchElement(event, currentEventInfo)
453
475
  ) {
454
- currentEventInfo = await window.getNextEvent();
455
- if (currentEventInfo) {
456
- showPopover(currentEventInfo);
457
- }
476
+ showNextEvent();
458
477
  }
459
478
  });
460
479
  });
461
480
 
462
- await runEvent(page, events[0]);
481
+ await runEvent({ page, event: events[0] });
482
+ };
483
+
484
+ const runEventsForScreenshots = async (page, ftmocksConifg, testName) => {
485
+ const eventsFile = path.join(
486
+ getMockDir(ftmocksConifg),
487
+ `test_${nameToFolder(testName)}`,
488
+ `_events.json`
489
+ );
490
+ const events = JSON.parse(fs.readFileSync(eventsFile, "utf8"));
491
+ await runEvents({
492
+ page,
493
+ events,
494
+ delay: ftmocksConifg.delay || 1000,
495
+ screenshots: true,
496
+ screenshotsDir: path.join(
497
+ getMockDir(ftmocksConifg),
498
+ `test_${nameToFolder(testName)}`,
499
+ `screenshots`
500
+ ),
501
+ });
502
+ fs.writeFileSync(eventsFile, JSON.stringify(events, null, 2));
503
+ await page.waitForTimeout(1000);
504
+ await page.close();
463
505
  };
464
506
 
465
507
  module.exports = {
@@ -467,5 +509,6 @@ module.exports = {
467
509
  runEventsForTest,
468
510
  runEventsInPresentationMode,
469
511
  runEventsInTrainingMode,
512
+ runEventsForScreenshots,
470
513
  runEvent,
471
514
  };
package/src/index.js CHANGED
@@ -27,6 +27,7 @@ const {
27
27
  runEvent,
28
28
  runEventsInPresentationMode,
29
29
  runEventsInTrainingMode,
30
+ runEventsForScreenshots,
30
31
  } = require("./event-run-utils");
31
32
 
32
33
  // Export functions as a module
@@ -54,4 +55,5 @@ module.exports = {
54
55
  runEvent,
55
56
  runEventsInPresentationMode,
56
57
  runEventsInTrainingMode,
58
+ runEventsForScreenshots,
57
59
  };