@brillout/test-e2e 0.6.20 → 0.6.22

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/Logs.d.ts CHANGED
@@ -33,11 +33,13 @@ declare function add({ logSource, logText, logInfo, loggedAfterExit, }: {
33
33
  /**
34
34
  * Expect a log to be printed.
35
35
  *
36
+ * @param pattern String or RegExp to search for in logs.
37
+ *
36
38
  * @param filter Only search in certain types of logs, e.g. only in browser- or server-side logs.
37
39
  *
38
40
  * @param allLogs Search in all logs, including the logs of previous tests as well as the logs of the setup/prepare scripts. Usually used in combination with the `filter` parameter.
39
41
  */
40
- declare function expectLog(logText: string, { filter: logFilter, allLogs }?: {
42
+ declare function expectLog(pattern: string | RegExp, { filter: logFilter, allLogs }?: {
41
43
  filter?: (logEntry: LogEntry) => boolean;
42
44
  allLogs?: boolean;
43
45
  }): void;
package/dist/Logs.js CHANGED
@@ -115,28 +115,34 @@ async function terminateUponErrorLog(logSource) {
115
115
  /**
116
116
  * Expect a log to be printed.
117
117
  *
118
+ * @param pattern String or RegExp to search for in logs.
119
+ *
118
120
  * @param filter Only search in certain types of logs, e.g. only in browser- or server-side logs.
119
121
  *
120
122
  * @param allLogs Search in all logs, including the logs of previous tests as well as the logs of the setup/prepare scripts. Usually used in combination with the `filter` parameter.
121
123
  */
122
- function expectLog(logText, { filter: logFilter, allLogs } = {}) {
124
+ function expectLog(pattern, { filter: logFilter, allLogs } = {}) {
123
125
  const logList = allLogs ? logEntriesAll : logEntries;
126
+ const isRegex = pattern instanceof RegExp;
127
+ const patternStr = isRegex ? pattern.toString() : `"${pattern}"`;
124
128
  const logsFound = logList.filter((logEntry) => {
125
- if (removeAnsi(logEntry).logText.includes(logText)) {
129
+ const logText = removeAnsi(logEntry).logText;
130
+ const matches = isRegex ? pattern.test(logText) : logText.includes(pattern);
131
+ if (matches) {
126
132
  logEntry.isNotFailure = true;
127
133
  return true;
128
134
  }
129
135
  return false;
130
136
  });
131
137
  if (logsFound.length === 0) {
132
- throw new Error(`The following log is expected but it wasn't logged: "${logText}"`);
138
+ throw new Error(`The following log is expected but it wasn't logged: ${patternStr}`);
133
139
  }
134
140
  if (!logFilter)
135
141
  return;
136
142
  const logsFoundAfterFilter = logsFound.filter((logEntry) => logFilter(removeAnsi(logEntry)));
137
143
  if (logsFoundAfterFilter.length === 0) {
138
144
  console.log(JSON.stringify(logsFound, null, 2));
139
- throw new Error(`Logs above are matching "${logText}" but don't match the filter you provided.`);
145
+ throw new Error(`Logs above are matching ${patternStr} but don't match the filter you provided.`);
140
146
  }
141
147
  }
142
148
  function removeAnsi(logEntry) {
package/dist/run.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { run };
2
2
  import type { TolerateError } from './Logs/isTolerateError.js';
3
- declare function run(cmd: string, { additionalTimeout, serverIsReadyMessage, serverIsReadyDelay, inspect, verbose, cwd, tolerateError, serverUrl, isFlaky, }?: {
3
+ declare function run(cmd: string, { additionalTimeout, serverIsReadyMessage, serverIsReadyDelay, inspect, verbose, cwd, tolerateError, serverUrl, isFlaky, tolerateExitCode, }?: {
4
4
  additionalTimeout?: number;
5
5
  serverIsReadyMessage?: string | ((log: string) => boolean);
6
6
  serverIsReadyDelay?: number;
@@ -11,4 +11,5 @@ declare function run(cmd: string, { additionalTimeout, serverIsReadyMessage, ser
11
11
  tolerateError?: TolerateError;
12
12
  serverUrl?: string;
13
13
  isFlaky?: boolean;
14
+ tolerateExitCode?: number[];
14
15
  }): void;
package/dist/run.js CHANGED
@@ -8,7 +8,7 @@ import { page } from './page.js';
8
8
  import { TIMEOUT_NPM_SCRIPT, TIMEOUT_PLAYWRIGHT, TIMEOUT_PROCESS_TERMINATION } from './TIMEOUTS.js';
9
9
  function run(cmd, {
10
10
  //baseUrl = '',
11
- additionalTimeout = 0, serverIsReadyMessage, serverIsReadyDelay = 1000, inspect = cliOptions.inspect, verbose = cliOptions.verbose, cwd, tolerateError, serverUrl, isFlaky, } = {}) {
11
+ additionalTimeout = 0, serverIsReadyMessage, serverIsReadyDelay = 1000, inspect = cliOptions.inspect, verbose = cliOptions.verbose, cwd, tolerateError, serverUrl, isFlaky, tolerateExitCode, } = {}) {
12
12
  assert(cwd === undefined);
13
13
  additionalTimeout += serverIsReadyDelay;
14
14
  setRunInfo({
@@ -32,6 +32,7 @@ additionalTimeout = 0, serverIsReadyMessage, serverIsReadyDelay = 1000, inspect
32
32
  additionalTimeout,
33
33
  serverIsReadyMessage,
34
34
  serverIsReadyDelay,
35
+ tolerateExitCode,
35
36
  });
36
37
  page.on('console', onConsole);
37
38
  page.on('pageerror', onPageError);
@@ -104,7 +105,7 @@ additionalTimeout = 0, serverIsReadyMessage, serverIsReadyDelay = 1000, inspect
104
105
  });
105
106
  }
106
107
  }
107
- async function startProcess({ serverIsReadyMessage, serverIsReadyDelay, additionalTimeout, cmd, }) {
108
+ async function startProcess({ serverIsReadyMessage, serverIsReadyDelay, additionalTimeout, cmd, tolerateExitCode, }) {
108
109
  const cwd = getCwd();
109
110
  if (!serverIsReadyMessage) {
110
111
  serverIsReadyMessage = (log) => {
@@ -129,6 +130,7 @@ async function startProcess({ serverIsReadyMessage, serverIsReadyDelay, addition
129
130
  isReadyLog: serverIsReadyMessage,
130
131
  isReadyTimeout: TIMEOUT_NPM_SCRIPT + additionalTimeout,
131
132
  killPort: process.env.CI || !isLinux() ? false : getServerPort(),
133
+ tolerateExitCode,
132
134
  onStderr(data, { loggedAfterExit }) {
133
135
  Logs.add({
134
136
  logSource: 'stderr',
@@ -1,5 +1,5 @@
1
1
  export { runCommandLongRunning };
2
- declare function runCommandLongRunning({ cmd, cwd, killPort, isReadyLog, isReadyTimeout, onStdout, onStderr, onExit, onTerminationError, terminationTimeout, }: {
2
+ declare function runCommandLongRunning({ cmd, cwd, killPort, isReadyLog, isReadyTimeout, onStdout, onStderr, onExit, onTerminationError, terminationTimeout, tolerateExitCode, }: {
3
3
  cmd: string;
4
4
  cwd: string;
5
5
  killPort: false | number;
@@ -14,6 +14,7 @@ declare function runCommandLongRunning({ cmd, cwd, killPort, isReadyLog, isReady
14
14
  onExit: (errMsg?: string) => void;
15
15
  onTerminationError: (errMsg: string) => void;
16
16
  terminationTimeout: number;
17
+ tolerateExitCode?: number[];
17
18
  }): {
18
19
  terminate: (force?: true) => Promise<void>;
19
20
  isReadyPromise: Promise<void>;
@@ -2,7 +2,7 @@ export { runCommandLongRunning };
2
2
  import { spawn } from 'child_process';
3
3
  import stripAnsi from 'strip-ansi';
4
4
  import { assert, runCommandShortLived, humanizeTime, isWindows, isLinux, isCallable } from '../utils.js';
5
- function runCommandLongRunning({ cmd, cwd, killPort, isReadyLog, isReadyTimeout, onStdout, onStderr, onExit, onTerminationError, terminationTimeout, }) {
5
+ function runCommandLongRunning({ cmd, cwd, killPort, isReadyLog, isReadyTimeout, onStdout, onStderr, onExit, onTerminationError, terminationTimeout, tolerateExitCode, }) {
6
6
  if (killPort)
7
7
  killByPort(killPort);
8
8
  let onError;
@@ -82,7 +82,7 @@ function runCommandLongRunning({ cmd, cwd, killPort, isReadyLog, isReadyTimeout,
82
82
  let errMsg;
83
83
  {
84
84
  const exitIsExpected = isReady === true || isReadyPromiseTimedOut;
85
- if (!isSuccessCode(code)) {
85
+ if (!isSuccessCode(code, tolerateExitCode)) {
86
86
  errMsg = `Unexpected termination of command \`${cmd}\` with exit code ${code}`;
87
87
  }
88
88
  else if (!exitIsExpected) {
@@ -219,8 +219,14 @@ async function killByPort(port) {
219
219
  assert(port);
220
220
  await runCommandShortLived(`fuser -k ${port}/tcp`, { swallowError: true, timeout: 10 * 1000 });
221
221
  }
222
- function isSuccessCode(code) {
223
- return code === 0 || code === null || (code === 1 && isWindows());
222
+ function isSuccessCode(code, tolerateExitCode) {
223
+ if (code === 0 || code === null || (code === 1 && isWindows())) {
224
+ return true;
225
+ }
226
+ if (tolerateExitCode?.includes(code)) {
227
+ return true;
228
+ }
229
+ return false;
224
230
  }
225
231
  // Workaround for Node.js regression:
226
232
  // - https://github.com/nodejs/node/issues/52475
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brillout/test-e2e",
3
- "version": "0.6.20",
3
+ "version": "0.6.22",
4
4
  "bin": "./bin.js",
5
5
  "main": "./dist/index.js",
6
6
  "type": "module",