@baseline-ui/test-utils 0.55.0 → 0.56.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.
@@ -0,0 +1,20 @@
1
+ import { Reporter, TestCase, TestResult } from '@playwright/test/reporter';
2
+
3
+ declare class FlakyReporter implements Reporter {
4
+ private flakyTests;
5
+ private browsers;
6
+ private project;
7
+ private variant;
8
+ private databaseUrl;
9
+ private rootDir;
10
+ constructor();
11
+ private deriveVariant;
12
+ private detectRootDir;
13
+ private detectProjectFromGit;
14
+ private formatError;
15
+ private stripAnsi;
16
+ onTestEnd(test: TestCase, result: TestResult): void;
17
+ onEnd(): Promise<void>;
18
+ }
19
+
20
+ export { FlakyReporter as default };
@@ -0,0 +1,20 @@
1
+ import { Reporter, TestCase, TestResult } from '@playwright/test/reporter';
2
+
3
+ declare class FlakyReporter implements Reporter {
4
+ private flakyTests;
5
+ private browsers;
6
+ private project;
7
+ private variant;
8
+ private databaseUrl;
9
+ private rootDir;
10
+ constructor();
11
+ private deriveVariant;
12
+ private detectRootDir;
13
+ private detectProjectFromGit;
14
+ private formatError;
15
+ private stripAnsi;
16
+ onTestEnd(test: TestCase, result: TestResult): void;
17
+ onEnd(): Promise<void>;
18
+ }
19
+
20
+ export { FlakyReporter as default };
@@ -0,0 +1,46 @@
1
+ 'use strict';var child_process=require('child_process');/**
2
+ * Copyright (c) 2023-2024 PSPDFKit GmbH. All rights reserved.
3
+ *
4
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
5
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
6
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
7
+ * This notice may not be removed from this file.
8
+ *
9
+ */
10
+ var p=[`CREATE TABLE IF NOT EXISTS ci_runs (
11
+ id BIGSERIAL PRIMARY KEY,
12
+ project TEXT NOT NULL,
13
+ browser TEXT NOT NULL,
14
+ variant TEXT NOT NULL DEFAULT 'default',
15
+ run_date DATE NOT NULL DEFAULT CURRENT_DATE,
16
+ run_count INTEGER NOT NULL DEFAULT 0,
17
+ UNIQUE (project, browser, variant, run_date)
18
+ )`,`CREATE TABLE IF NOT EXISTS flaky_tests (
19
+ id BIGSERIAL PRIMARY KEY,
20
+ test_name TEXT NOT NULL,
21
+ file_path TEXT NOT NULL,
22
+ project TEXT NOT NULL,
23
+ browser TEXT NOT NULL,
24
+ variant TEXT NOT NULL DEFAULT 'default',
25
+ run_date DATE NOT NULL DEFAULT CURRENT_DATE,
26
+ flaky_count INTEGER NOT NULL DEFAULT 0,
27
+ error_message TEXT,
28
+ UNIQUE (test_name, project, browser, variant, run_date)
29
+ )`,`CREATE INDEX IF NOT EXISTS idx_flaky_tests_date
30
+ ON flaky_tests (run_date)`,`CREATE INDEX IF NOT EXISTS idx_flaky_tests_identity_date
31
+ ON flaky_tests (test_name, project, browser, variant, run_date)`],E=`
32
+ INSERT INTO ci_runs (project, browser, variant, run_date, run_count)
33
+ VALUES ($1, $2, $3, CURRENT_DATE, 1)
34
+ ON CONFLICT (project, browser, variant, run_date) DO UPDATE SET
35
+ run_count = ci_runs.run_count + 1
36
+ `,_=`
37
+ INSERT INTO flaky_tests (test_name, file_path, project, browser, variant, run_date, flaky_count, error_message)
38
+ SELECT unnest($1::text[]), unnest($2::text[]), unnest($3::text[]), unnest($4::text[]), unnest($5::text[]),
39
+ CURRENT_DATE, 1, unnest($6::text[])
40
+ ON CONFLICT (test_name, project, browser, variant, run_date) DO UPDATE SET
41
+ file_path = EXCLUDED.file_path,
42
+ flaky_count = flaky_tests.flaky_count + 1,
43
+ error_message = COALESCE(EXCLUDED.error_message, flaky_tests.error_message)
44
+ `,i=class{flakyTests=[];browsers=new Set;project;variant;databaseUrl;rootDir;constructor(){this.databaseUrl=process.env.TEST_DASHBOARD_DATABASE_URL,this.rootDir=this.detectRootDir(),this.project=process.env.PROJECT??this.detectProjectFromGit(),this.variant=this.deriveVariant();}deriveVariant(){return process.env.METADATA_SHADOW_DOM==="true"?"shadow-dom":process.env.METADATA_IFRAME==="true"?"iframe":"default"}detectRootDir(){if(process.env.TEST_ROOT_DIR)return process.env.TEST_ROOT_DIR;try{return child_process.execSync("git rev-parse --show-toplevel",{encoding:"utf8"}).trim()}catch{return console.debug("[flaky-reporter] Could not detect git root, falling back to cwd."),process.cwd()}}detectProjectFromGit(){try{let t=child_process.execSync("git remote get-url origin",{encoding:"utf8"}).trim(),r=/[/:]([\w.-]+)\/([\w.-]+?)(?:\.git)?$/.exec(t);if(r)return `${r[1]}/${r[2]}`}catch{console.debug("[flaky-reporter] Could not detect project from git remote.");}return "unknown"}formatError(t){if(!t)return null;let r=[];if(t.message&&r.push(t.message),t.snippet&&r.push(t.snippet),t.stack){let s=t.message?t.stack.replace(t.message,"").trim():t.stack;s&&r.push(s);}return this.stripAnsi(r.join(`
45
+
46
+ `))||null}stripAnsi(t){return t.replaceAll(/\u001B\[[0-9;]*m/g,"")}onTestEnd(t,r){if(!this.databaseUrl)return;let s=t.parent.project()?.name??"unknown";if(this.browsers.add(s),!(r.status==="passed"&&t.results.length>1&&t.results.some(a=>a.status==="failed")))return;let n=t.results.find(a=>a.status==="failed");this.flakyTests.push({test_name:t.titlePath().filter(Boolean).join(" > "),file_path:t.location.file.replace(this.rootDir+"/",""),browser:s,error_message:this.formatError(n?.error)});}async onEnd(){if(!this.databaseUrl)return;let t="@neondatabase/serverless",r;try{({neon:r}=await import(t));}catch{console.error("[flaky-reporter] @neondatabase/serverless is not installed. Skipping.");return}let s=r(this.databaseUrl);try{for(let e of p)await s.query(e);}catch(e){console.error("[flaky-reporter] CRITICAL: Failed to initialize database tables. No flaky test data was recorded. Check TEST_DASHBOARD_DATABASE_URL and database permissions.",e);return}try{for(let e of this.browsers)await s.query(E,[this.project,e,this.variant]);}catch(e){console.error("[flaky-reporter] Failed to record CI run:",e);}if(this.flakyTests.length===0){console.log("[flaky-reporter] No flaky tests detected.");return}let o=[],n=[],a=[],l=[],c=[],T=[];for(let e of this.flakyTests)o.push(e.test_name),n.push(e.file_path),a.push(this.project),l.push(e.browser),c.push(this.variant),T.push(e.error_message);try{await s.query(_,[o,n,a,l,c,T]),console.log(`[flaky-reporter] Reported ${this.flakyTests.length} flaky test(s) to database.`);}catch(e){console.error("[flaky-reporter] Failed to write to database:",e);}}},N=i;module.exports=N;
@@ -0,0 +1,46 @@
1
+ import {execSync}from'child_process';/**
2
+ * Copyright (c) 2023-2024 PSPDFKit GmbH. All rights reserved.
3
+ *
4
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
5
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
6
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
7
+ * This notice may not be removed from this file.
8
+ *
9
+ */
10
+ var p=[`CREATE TABLE IF NOT EXISTS ci_runs (
11
+ id BIGSERIAL PRIMARY KEY,
12
+ project TEXT NOT NULL,
13
+ browser TEXT NOT NULL,
14
+ variant TEXT NOT NULL DEFAULT 'default',
15
+ run_date DATE NOT NULL DEFAULT CURRENT_DATE,
16
+ run_count INTEGER NOT NULL DEFAULT 0,
17
+ UNIQUE (project, browser, variant, run_date)
18
+ )`,`CREATE TABLE IF NOT EXISTS flaky_tests (
19
+ id BIGSERIAL PRIMARY KEY,
20
+ test_name TEXT NOT NULL,
21
+ file_path TEXT NOT NULL,
22
+ project TEXT NOT NULL,
23
+ browser TEXT NOT NULL,
24
+ variant TEXT NOT NULL DEFAULT 'default',
25
+ run_date DATE NOT NULL DEFAULT CURRENT_DATE,
26
+ flaky_count INTEGER NOT NULL DEFAULT 0,
27
+ error_message TEXT,
28
+ UNIQUE (test_name, project, browser, variant, run_date)
29
+ )`,`CREATE INDEX IF NOT EXISTS idx_flaky_tests_date
30
+ ON flaky_tests (run_date)`,`CREATE INDEX IF NOT EXISTS idx_flaky_tests_identity_date
31
+ ON flaky_tests (test_name, project, browser, variant, run_date)`],E=`
32
+ INSERT INTO ci_runs (project, browser, variant, run_date, run_count)
33
+ VALUES ($1, $2, $3, CURRENT_DATE, 1)
34
+ ON CONFLICT (project, browser, variant, run_date) DO UPDATE SET
35
+ run_count = ci_runs.run_count + 1
36
+ `,_=`
37
+ INSERT INTO flaky_tests (test_name, file_path, project, browser, variant, run_date, flaky_count, error_message)
38
+ SELECT unnest($1::text[]), unnest($2::text[]), unnest($3::text[]), unnest($4::text[]), unnest($5::text[]),
39
+ CURRENT_DATE, 1, unnest($6::text[])
40
+ ON CONFLICT (test_name, project, browser, variant, run_date) DO UPDATE SET
41
+ file_path = EXCLUDED.file_path,
42
+ flaky_count = flaky_tests.flaky_count + 1,
43
+ error_message = COALESCE(EXCLUDED.error_message, flaky_tests.error_message)
44
+ `,i=class{flakyTests=[];browsers=new Set;project;variant;databaseUrl;rootDir;constructor(){this.databaseUrl=process.env.TEST_DASHBOARD_DATABASE_URL,this.rootDir=this.detectRootDir(),this.project=process.env.PROJECT??this.detectProjectFromGit(),this.variant=this.deriveVariant();}deriveVariant(){return process.env.METADATA_SHADOW_DOM==="true"?"shadow-dom":process.env.METADATA_IFRAME==="true"?"iframe":"default"}detectRootDir(){if(process.env.TEST_ROOT_DIR)return process.env.TEST_ROOT_DIR;try{return execSync("git rev-parse --show-toplevel",{encoding:"utf8"}).trim()}catch{return console.debug("[flaky-reporter] Could not detect git root, falling back to cwd."),process.cwd()}}detectProjectFromGit(){try{let t=execSync("git remote get-url origin",{encoding:"utf8"}).trim(),r=/[/:]([\w.-]+)\/([\w.-]+?)(?:\.git)?$/.exec(t);if(r)return `${r[1]}/${r[2]}`}catch{console.debug("[flaky-reporter] Could not detect project from git remote.");}return "unknown"}formatError(t){if(!t)return null;let r=[];if(t.message&&r.push(t.message),t.snippet&&r.push(t.snippet),t.stack){let s=t.message?t.stack.replace(t.message,"").trim():t.stack;s&&r.push(s);}return this.stripAnsi(r.join(`
45
+
46
+ `))||null}stripAnsi(t){return t.replaceAll(/\u001B\[[0-9;]*m/g,"")}onTestEnd(t,r){if(!this.databaseUrl)return;let s=t.parent.project()?.name??"unknown";if(this.browsers.add(s),!(r.status==="passed"&&t.results.length>1&&t.results.some(a=>a.status==="failed")))return;let n=t.results.find(a=>a.status==="failed");this.flakyTests.push({test_name:t.titlePath().filter(Boolean).join(" > "),file_path:t.location.file.replace(this.rootDir+"/",""),browser:s,error_message:this.formatError(n?.error)});}async onEnd(){if(!this.databaseUrl)return;let t="@neondatabase/serverless",r;try{({neon:r}=await import(t));}catch{console.error("[flaky-reporter] @neondatabase/serverless is not installed. Skipping.");return}let s=r(this.databaseUrl);try{for(let e of p)await s.query(e);}catch(e){console.error("[flaky-reporter] CRITICAL: Failed to initialize database tables. No flaky test data was recorded. Check TEST_DASHBOARD_DATABASE_URL and database permissions.",e);return}try{for(let e of this.browsers)await s.query(E,[this.project,e,this.variant]);}catch(e){console.error("[flaky-reporter] Failed to record CI run:",e);}if(this.flakyTests.length===0){console.log("[flaky-reporter] No flaky tests detected.");return}let o=[],n=[],a=[],l=[],c=[],T=[];for(let e of this.flakyTests)o.push(e.test_name),n.push(e.file_path),a.push(this.project),l.push(e.browser),c.push(this.variant),T.push(e.error_message);try{await s.query(_,[o,n,a,l,c,T]),console.log(`[flaky-reporter] Reported ${this.flakyTests.length} flaky test(s) to database.`);}catch(e){console.error("[flaky-reporter] Failed to write to database:",e);}}},N=i;export{N as default};