@brightspace-ui/testing 1.0.0 → 1.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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@brightspace-ui/testing",
3
3
  "description": "Utilities for testing front-end components and applications",
4
4
  "type": "module",
5
- "version": "1.0.0",
5
+ "version": "1.1.0",
6
6
  "repository": "https://github.com/BrightspaceUI/testing.git",
7
7
  "scripts": {
8
8
  "lint": "eslint . --ext .js",
@@ -24,7 +24,7 @@
24
24
  "eslint": "^8",
25
25
  "eslint-config-brightspace": "^0.23",
26
26
  "mocha": "^10",
27
- "sinon": "^15"
27
+ "sinon": "^16"
28
28
  },
29
29
  "exports": {
30
30
  ".": "./src/browser/index.js"
@@ -4,6 +4,7 @@ import { executeServerCommand } from '@web/test-runner-commands';
4
4
  // start loading fonts early
5
5
  [...document.fonts].forEach(font => font.load());
6
6
 
7
+ const DEFAULT_MARGIN = 10;
7
8
  let test;
8
9
 
9
10
  /* eslint-disable no-undef, no-invalid-this */
@@ -26,7 +27,7 @@ function findTargets(elem) {
26
27
  return Array.from(nestedTargets).reduce((acc, target) => [...acc, ...findTargets(target)], [elem]);
27
28
  }
28
29
 
29
- function findLargestRect(elems) {
30
+ function findLargestRect(elems, margin) {
30
31
  let largestRect = { left: Number.MAX_SAFE_INTEGER, top: Number.MAX_SAFE_INTEGER, right: 0, bottom: 0 };
31
32
  elems.forEach(elem => {
32
33
  const targets = findTargets(elem);
@@ -42,11 +43,29 @@ function findLargestRect(elems) {
42
43
  }
43
44
  });
44
45
  });
45
-
46
- return { x: largestRect.left, y: largestRect.top, width: largestRect.right - largestRect.left, height: largestRect.bottom - largestRect.top };
46
+ const rect = {
47
+ x: largestRect.left - margin,
48
+ y: largestRect.top - margin,
49
+ width: largestRect.right - largestRect.left + (margin * 2),
50
+ height: largestRect.bottom - largestRect.top + (margin * 2)
51
+ };
52
+ // We need to handle RTL overflow/scroll scenarios because of Playwright limitations
53
+ if (document.documentElement.getAttribute('dir') === 'rtl' && (largestRect.left < 0 || window.scrollX < 0)) {
54
+ rect.x = -1 * largestRect.left - 1;
55
+ rect.width = largestRect.right + margin;
56
+
57
+ if (largestRect.top <= 0) {
58
+ rect.y = window.scrollY;
59
+ rect.height = largestRect.bottom + margin;
60
+ }
61
+ rect.width = Math.min(rect.width, document.documentElement.clientWidth);
62
+ rect.height = Math.min(rect.height, document.documentElement.clientHeight);
63
+ return { rect, fullPage: true };
64
+ }
65
+ return { rect, fullPage: false };
47
66
  }
48
67
 
49
- async function ScreenshotAndCompare(opts) {
68
+ async function ScreenshotAndCompare(opts = {}) {
50
69
 
51
70
  if (window.d2lTest) {
52
71
  document.documentElement.classList.add('screenshot');
@@ -54,13 +73,18 @@ async function ScreenshotAndCompare(opts) {
54
73
  }
55
74
 
56
75
  const name = this.test.fullTitle();
57
- let rect = null;
58
- if (this.elem !== document) {
76
+ let fullPage = false,
77
+ rect = null;
78
+ if (this.elem === document) {
79
+ fullPage = true;
80
+ } else {
59
81
  const elemsToInclude = [this.elem, ...this.elem.querySelectorAll('.vdiff-include')];
60
- rect = findLargestRect(elemsToInclude);
82
+ const margin = opts.margin ?? DEFAULT_MARGIN;
83
+ ({ rect, fullPage } = findLargestRect(elemsToInclude, margin));
61
84
  }
62
85
  const slowDuration = this.test.slow();
63
- let result = await executeServerCommand('brightspace-visual-diff-compare', { name, rect, slowDuration, opts });
86
+
87
+ let result = await executeServerCommand('brightspace-visual-diff-compare', { name, fullPage, rect, slowDuration });
64
88
  if (result.resizeRequired) {
65
89
  this.test.timeout(0);
66
90
  result = await executeServerCommand('brightspace-visual-diff-compare-resize', { name });
@@ -5,7 +5,6 @@ import pixelmatch from 'pixelmatch';
5
5
  import { PNG } from 'pngjs';
6
6
 
7
7
  const isCI = !!env['CI'];
8
- const DEFAULT_MARGIN = 10;
9
8
  const DEFAULT_TOLERANCE = 0; // TODO: Support tolerance override?
10
9
  const METADATA_NAME = '.vdiff.json';
11
10
  const ROOT_NAME = '.vdiff';
@@ -181,21 +180,13 @@ export function visualDiff({ updateGoldens = false, runSubset = false } = {}) {
181
180
  }
182
181
  }
183
182
 
184
- const opts = { margin: DEFAULT_MARGIN, ...payload.opts };
185
183
  const screenshotOpts = {
186
184
  animations: 'disabled',
187
185
  path: updateGoldens ? goldenFileName : screenshotFileName
188
186
  };
189
- if (!payload.rect) {
190
- screenshotOpts.fullPage = true;
191
- } else {
192
- screenshotOpts.clip = {
193
- x: payload.rect.x - opts.margin,
194
- y: payload.rect.y - opts.margin,
195
- width: payload.rect.width + (opts.margin * 2),
196
- height: payload.rect.height + (opts.margin * 2)
197
- };
198
- }
187
+
188
+ if (payload.fullPage) screenshotOpts.fullPage = true;
189
+ if (payload.rect) screenshotOpts.clip = payload.rect;
199
190
 
200
191
  const page = session.browser.getPage(session.id);
201
192
  await page.screenshot(screenshotOpts);