@zohodesk/testinglibrary 0.0.82-n20-experimental → 0.0.84-n20-experimental

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.
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _fs = _interopRequireDefault(require("fs"));
5
+ var _os = _interopRequireDefault(require("os"));
6
+ var _path = _interopRequireDefault(require("path"));
7
+ var _logCollector = require("../../../../../core/playwright/helpers/logCollector");
8
+ function makeEmitter() {
9
+ const handlers = {};
10
+ return {
11
+ handlers,
12
+ on(event, handler) {
13
+ (handlers[event] = handlers[event] || []).push(handler);
14
+ },
15
+ removeListener() {},
16
+ emit(event, arg) {
17
+ (handlers[event] || []).forEach(handler => handler(arg));
18
+ }
19
+ };
20
+ }
21
+ function makeContext() {
22
+ const page = makeEmitter();
23
+ const emitter = makeEmitter();
24
+ return {
25
+ page,
26
+ context: {
27
+ ...emitter,
28
+ pages: () => [page]
29
+ }
30
+ };
31
+ }
32
+ const failedRequest = (url, errorText, resourceType = 'script', method = 'GET') => ({
33
+ url: () => url,
34
+ failure: () => ({
35
+ errorText
36
+ }),
37
+ method: () => method,
38
+ resourceType: () => resourceType
39
+ });
40
+ const response = (url, status, method = 'GET') => ({
41
+ url: () => url,
42
+ status: () => status,
43
+ request: () => ({
44
+ method: () => method
45
+ }),
46
+ fromServiceWorker: () => false
47
+ });
48
+ const consoleMessage = (text, url) => ({
49
+ type: () => 'error',
50
+ text: () => text,
51
+ location: () => ({
52
+ url
53
+ })
54
+ });
55
+ describe('LogCollector baseline-noise stripping', () => {
56
+ let collector;
57
+ let context;
58
+ let page;
59
+ beforeEach(() => {
60
+ collector = new _logCollector.LogCollector();
61
+ const ctx = makeContext();
62
+ context = ctx.context;
63
+ page = ctx.page;
64
+ collector.attachToContext(context);
65
+ });
66
+ test('drops ORB-blocked request failures (message pattern)', () => {
67
+ context.emit('requestfailed', failedRequest('https://app/some/script.js', 'net::ERR_BLOCKED_BY_ORB'));
68
+ expect(collector.events).toHaveLength(0);
69
+ });
70
+ test('drops known noisy third-party URLs (url pattern)', () => {
71
+ context.emit('requestfailed', failedRequest('https://cdn/murphysdk/3.5.0/murphy.min.js', 'net::ERR_ABORTED'));
72
+ expect(collector.events).toHaveLength(0);
73
+ });
74
+ test('drops noisy 4xx responses by URL (e.g. getHamburgerMenu)', () => {
75
+ context.emit('response', response('https://app/biz/getHamburgerMenu.do?version=stable', 404));
76
+ expect(collector.events).toHaveLength(0);
77
+ });
78
+ test('drops CORS console errors (message pattern)', () => {
79
+ page.emit('console', consoleMessage("Access to font at 'https://x/f.woff' has been blocked by CORS policy: ...", 'https://app/page'));
80
+ expect(collector.events).toHaveLength(0);
81
+ });
82
+ test('drops baseline pageerrors (Access is denied / enable* not a function)', () => {
83
+ page.emit('pageerror', {
84
+ name: 'SecurityError',
85
+ message: 'Failed to read the localStorage: Access is denied for this document.',
86
+ stack: ''
87
+ });
88
+ page.emit('pageerror', {
89
+ name: 'TypeError',
90
+ message: 'n.enableDarkTheme is not a function',
91
+ stack: ''
92
+ });
93
+ expect(collector.events).toHaveLength(0);
94
+ });
95
+ test('keeps a real application pageerror', () => {
96
+ page.emit('pageerror', {
97
+ name: 'TypeError',
98
+ message: "Cannot read properties of undefined (reading 'id')",
99
+ stack: 'TypeError: ...'
100
+ });
101
+ expect(collector.events).toHaveLength(1);
102
+ expect(collector.events[0]).toMatchObject({
103
+ kind: 'pageerror',
104
+ name: 'TypeError'
105
+ });
106
+ });
107
+ test('flushes captured events to a jsonl file', () => {
108
+ const flushDir = _fs.default.mkdtempSync(_path.default.join(_os.default.tmpdir(), 'log-collector-flush-'));
109
+ try {
110
+ page.emit('pageerror', {
111
+ name: 'TypeError',
112
+ message: "Cannot read properties of undefined (reading 'id')",
113
+ stack: 'TypeError: ...'
114
+ });
115
+ const filePath = collector.flushToFile(flushDir, 'w0-test-0');
116
+ const contents = _fs.default.readFileSync(filePath, 'utf8');
117
+ expect(filePath).toContain('w0-test-0.jsonl');
118
+ expect(contents).toContain('"kind":"pageerror"');
119
+ expect(contents).toContain("Cannot read properties of undefined (reading 'id')");
120
+ expect(contents.endsWith('\n')).toBe(true);
121
+ } finally {
122
+ _fs.default.rmSync(flushDir, {
123
+ recursive: true,
124
+ force: true
125
+ });
126
+ }
127
+ });
128
+ test('returns null from flushToFile when no events were captured', () => {
129
+ expect(collector.flushToFile('/tmp', 'empty')).toBeNull();
130
+ });
131
+ test('keeps a document-navigation abort (real environment signal)', () => {
132
+ context.emit('requestfailed', failedRequest('https://app/agent/events/list/commentsubtabevent', 'net::ERR_ABORTED', 'document'));
133
+ expect(collector.events).toHaveLength(1);
134
+ expect(collector.events[0]).toMatchObject({
135
+ kind: 'requestfailed',
136
+ resourceType: 'document'
137
+ });
138
+ });
139
+ });
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _fs = _interopRequireDefault(require("fs"));
5
+ var _os = _interopRequireDefault(require("os"));
6
+ var _path = _interopRequireDefault(require("path"));
7
+ var _runtimeLogPath = require("../../../../../core/playwright/helpers/runtimeLogPath");
8
+ var _runtimeLogReader = require("../../../../../core/playwright/helpers/runtimeLogReader");
9
+ const TEST_TITLE = 'runtime-log-reader-test';
10
+ let tempDir;
11
+ function writeRuntimeLog(events, {
12
+ workerIndex = 0,
13
+ retry = 0,
14
+ title = TEST_TITLE
15
+ } = {}) {
16
+ const file = (0, _runtimeLogPath.resolveRuntimeLogFilePath)(tempDir, {
17
+ workerIndex,
18
+ retry,
19
+ title
20
+ });
21
+ _fs.default.mkdirSync(_path.default.dirname(file), {
22
+ recursive: true
23
+ });
24
+ _fs.default.writeFileSync(file, `${events.map(e => JSON.stringify(e)).join('\n')}\n`);
25
+ return file;
26
+ }
27
+ beforeEach(() => {
28
+ tempDir = _fs.default.mkdtempSync(_path.default.join(_os.default.tmpdir(), 'runtime-log-reader-'));
29
+ });
30
+ afterEach(() => {
31
+ _fs.default.rmSync(tempDir, {
32
+ recursive: true,
33
+ force: true
34
+ });
35
+ });
36
+ describe('readRuntimeLogEventsForResult', () => {
37
+ test('reads project-side runtime log for a failing result', () => {
38
+ const events = [{
39
+ kind: 'pageerror',
40
+ message: 'inline boom'
41
+ }];
42
+ writeRuntimeLog(events);
43
+ const result = {
44
+ status: 'failed',
45
+ workerIndex: 0,
46
+ retry: 0
47
+ };
48
+ expect((0, _runtimeLogReader.readRuntimeLogEventsForResult)(result, TEST_TITLE, tempDir)).toEqual(events);
49
+ });
50
+ test('skips malformed jsonl lines', () => {
51
+ const file = writeRuntimeLog([]);
52
+ _fs.default.writeFileSync(file, [JSON.stringify({
53
+ kind: 'console',
54
+ text: 'ok'
55
+ }), 'not-json', JSON.stringify({
56
+ kind: 'pageerror',
57
+ message: 'err'
58
+ })].join('\n') + '\n');
59
+ const result = {
60
+ status: 'failed',
61
+ workerIndex: 0,
62
+ retry: 0
63
+ };
64
+ expect((0, _runtimeLogReader.readRuntimeLogEventsForResult)(result, TEST_TITLE, tempDir)).toEqual([{
65
+ kind: 'console',
66
+ text: 'ok'
67
+ }, {
68
+ kind: 'pageerror',
69
+ message: 'err'
70
+ }]);
71
+ });
72
+ test('returns an empty array when the runtime log file is missing', () => {
73
+ const result = {
74
+ status: 'failed',
75
+ workerIndex: 0,
76
+ retry: 0
77
+ };
78
+ expect((0, _runtimeLogReader.readRuntimeLogEventsForResult)(result, 'missing-test', tempDir)).toEqual([]);
79
+ expect((0, _runtimeLogReader.readRuntimeLogEventsForResult)(null, TEST_TITLE, tempDir)).toEqual([]);
80
+ });
81
+ test('returns an empty array when logsDir is missing', () => {
82
+ const result = {
83
+ status: 'failed',
84
+ workerIndex: 0,
85
+ retry: 0
86
+ };
87
+ expect((0, _runtimeLogReader.readRuntimeLogEventsForResult)(result, TEST_TITLE)).toEqual([]);
88
+ expect((0, _runtimeLogReader.readRuntimeLogEventsForResult)(result, TEST_TITLE, undefined)).toEqual([]);
89
+ });
90
+ });
91
+ describe('readRuntimeLogEvents', () => {
92
+ test('reads events from a jsonl file path', () => {
93
+ const file = writeRuntimeLog([{
94
+ kind: 'console',
95
+ text: 'ok'
96
+ }, {
97
+ kind: 'pageerror',
98
+ message: 'err'
99
+ }]);
100
+ expect((0, _runtimeLogReader.readRuntimeLogEvents)(file)).toEqual([{
101
+ kind: 'console',
102
+ text: 'ok'
103
+ }, {
104
+ kind: 'pageerror',
105
+ message: 'err'
106
+ }]);
107
+ });
108
+ test('returns an empty array for a missing file', () => {
109
+ expect((0, _runtimeLogReader.readRuntimeLogEvents)(null)).toEqual([]);
110
+ expect((0, _runtimeLogReader.readRuntimeLogEvents)(_path.default.join(tempDir, 'missing.jsonl'))).toEqual([]);
111
+ });
112
+ });
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@zohodesk/testinglibrary",
3
- "version": "0.0.82-n20-experimental",
3
+ "version": "0.0.84-n20-experimental",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@zohodesk/testinglibrary",
9
- "version": "0.0.82-n20-experimental",
9
+ "version": "0.0.84-n20-experimental",
10
10
  "hasInstallScript": true,
11
11
  "license": "ISC",
12
12
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zohodesk/testinglibrary",
3
- "version": "0.0.82-n20-experimental",
3
+ "version": "0.0.84-n20-experimental",
4
4
  "main": "./build/index.js",
5
5
  "scripts": {
6
6
  "postinstall": "node bin/postinstall.js",
@@ -274,4 +274,4 @@ header {
274
274
  font-size: 1rem;
275
275
  padding: 0 0.5rem;
276
276
  }
277
- </style></head><body><main class="jesthtml-content"><header><h1 id="title">Unit Report</h1></header><section id="metadata-container"><div id="timestamp">Started: 2026-07-03 13:32:15</div><div id="summary"><div id="suite-summary"><div class="summary-total">Suites (1)</div><div class="summary-passed ">1 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div><div id="test-summary"><div class="summary-total">Tests (14)</div><div class="summary-passed ">14 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div></div></section><details id="suite-1" class="suite-container" open=""><summary class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/helpers/__tests__/failureTagClassifier.test.js</div><div class="suite-time">0.498s</div></summary><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">returns flaky and skips log analysis for flaky outcome</div><div class="test-status">passed</div><div class="test-duration">0.002s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">tags environment when a document abort is present</div><div class="test-status">passed</div><div class="test-duration">0.002s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">tags environment for a network/cert failure</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">tags code when an app undefined-property error is present</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">does not tag a non-document (xhr) abort as environment</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">tags tool when stderr reports a DATA_GENERATION_ERROR</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">tags tool for an "Error Type:" line in base64 stdout</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">does not tag tool for benign stdout/stderr</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">does not throw for malformed stdio chunk entries</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">leaves untagged when no environment or code pattern is present</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">mergeFailureTags</div><div class="test-title">places suffixed failure tags first, then existing tags</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">mergeFailureTags</div><div class="test-title">emits the flaky category as FLAKY without a suffix</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">mergeFailureTags</div><div class="test-title">does not duplicate an already-present failure tag</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">regex safety</div><div class="test-title">resets stateful regex for tool pattern checks</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div></div></details></main></body></html>
277
+ </style></head><body><main class="jesthtml-content"><header><h1 id="title">Unit Report</h1></header><section id="metadata-container"><div id="timestamp">Started: 2026-07-05 14:02:44</div><div id="summary"><div id="suite-summary"><div class="summary-total">Suites (3)</div><div class="summary-passed ">3 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div><div id="test-summary"><div class="summary-total">Tests (41)</div><div class="summary-passed ">41 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div></div></section><details id="suite-1" class="suite-container" open=""><summary class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/helpers/__tests__/failureTagClassifier.test.js</div><div class="suite-time">0.428s</div></summary><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">returns flaky and skips log analysis for flaky outcome</div><div class="test-status">passed</div><div class="test-duration">0.002s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">tags environment when a document abort is present</div><div class="test-status">passed</div><div class="test-duration">0.002s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">tags environment for a network/cert failure</div><div class="test-status">passed</div><div class="test-duration">0.002s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">tags code when an app undefined-property error is present</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">does not tag a non-document (xhr) abort as environment</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">tags case and code when stderr reports DATA_GENERATION_ERROR</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">tags tool for a known tool pattern in base64 stdout</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">tags case and code when stderr matches a case pattern</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">does not tag tool for benign stdout/stderr</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">does not throw for malformed stdio chunk entries</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureTags</div><div class="test-title">leaves untagged when no environment or code pattern is present</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureDetails</div><div class="test-title">records the matching pattern for environment failures</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureDetails</div><div class="test-title">records the matching pattern for code failures from events</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureDetails</div><div class="test-title">records flaky outcome without a regex pattern</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureDetails</div><div class="test-title">records tool pattern from stdio</div><div class="test-status">passed</div><div class="test-duration">0.002s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureDetails</div><div class="test-title">records case pattern from stdio and implies code</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureDetails</div><div class="test-title">keeps runtime-log code match when case also matches</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">classifyFailureDetails</div><div class="test-title">implies code from case when no runtime log is present</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">failure tag metadata attachment</div><div class="test-title">builds a small JSON attachment when tags are present</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">failure tag metadata attachment</div><div class="test-title">returns null when no tags are present</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">failure tag metadata attachment</div><div class="test-title">replaces an existing metadata attachment</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">mergeFailureTags</div><div class="test-title">places suffixed failure tags first, then existing tags</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">mergeFailureTags</div><div class="test-title">emits the flaky category as FLAKY without a suffix</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">mergeFailureTags</div><div class="test-title">does not duplicate an already-present failure tag</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">mergeFailureTags</div><div class="test-title">formats case and code failure tags with suffix</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">regex safety</div><div class="test-title">resets stateful regex for tool pattern checks</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div></div></details><details id="suite-2" class="suite-container" open=""><summary class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/helpers/__tests__/logCollector.test.js</div><div class="suite-time">0.049s</div></summary><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">LogCollector baseline-noise stripping</div><div class="test-title">drops ORB-blocked request failures (message pattern)</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">LogCollector baseline-noise stripping</div><div class="test-title">drops known noisy third-party URLs (url pattern)</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">LogCollector baseline-noise stripping</div><div class="test-title">drops noisy 4xx responses by URL (e.g. getHamburgerMenu)</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">LogCollector baseline-noise stripping</div><div class="test-title">drops CORS console errors (message pattern)</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">LogCollector baseline-noise stripping</div><div class="test-title">drops baseline pageerrors (Access is denied / enable* not a function)</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">LogCollector baseline-noise stripping</div><div class="test-title">keeps a real application pageerror</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">LogCollector baseline-noise stripping</div><div class="test-title">flushes captured events to a jsonl file</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">LogCollector baseline-noise stripping</div><div class="test-title">returns null from flushToFile when no events were captured</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">LogCollector baseline-noise stripping</div><div class="test-title">keeps a document-navigation abort (real environment signal)</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div></div></details><details id="suite-3" class="suite-container" open=""><summary class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/helpers/__tests__/runtimeLogReader.test.js</div><div class="suite-time">0.043s</div></summary><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">readRuntimeLogEventsForResult</div><div class="test-title">reads project-side runtime log for a failing result</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">readRuntimeLogEventsForResult</div><div class="test-title">skips malformed jsonl lines</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">readRuntimeLogEventsForResult</div><div class="test-title">returns an empty array when the runtime log file is missing</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">readRuntimeLogEventsForResult</div><div class="test-title">returns an empty array when logsDir is missing</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">readRuntimeLogEvents</div><div class="test-title">reads events from a jsonl file path</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">readRuntimeLogEvents</div><div class="test-title">returns an empty array for a missing file</div><div class="test-status">passed</div><div class="test-duration"> </div></div></div></div></details></main></body></html>