Developer-Dashboard
view release on metacpan or search on metacpan
t/32-sql-dashboard-rdbms-playwright.t view on Meta::CPAN
is( $playwright_result->{stderr}, '', "$args{label} sql-dashboard Playwright matrix keeps stderr clean" );
my $payload = $playwright_result->{stdout} ne ''
? _json_decode( $playwright_result->{stdout} )
: {
ok => 0,
cases => [],
consoleMessages => [],
pageErrors => [],
};
ok( $payload->{ok}, "$args{label} sql-dashboard Playwright matrix reports success" )
or diag _diagnostic_text($payload);
is( scalar @{ $payload->{cases} || [] }, 22, "$args{label} sql-dashboard Playwright matrix records 22 browser cases" );
for my $case ( @{ $payload->{cases} || [] } ) {
ok( $case->{ok}, "$args{label}: $case->{name}" ) or diag _case_diagnostic($case);
}
ok( -f $saved_collection, "$args{label} Playwright matrix keeps the saved SQL collection on disk" );
like( _read_text($saved_collection), qr/"name"\s*:\s*"\Q$args{label} Reporting\E"/, "$args{label} Playwright matrix persists the browser-created collection name" );
is( _mode_octal($sql_config_root), '0700', "$args{label} Playwright matrix keeps the sql-dashboard config root owner-only" );
is( _mode_octal($collection_root), '0700', "$args{label} Playwright matrix keeps the sql-dashboard collection root owner-only" );
is( _mode_octal($saved_collection), '0600', "$args{label} Playwright matrix keeps the saved SQL collection file owner-only" );
1;
} or do {
my $error = $@ || "$args{label} sql-dashboard Playwright matrix failed";
diag $error;
diag _read_text($dashboard_log) if -f $dashboard_log;
my $docker_logs = _docker_logs( $docker_bin, $container_name );
diag $docker_logs if $docker_logs ne '';
_stop_dashboard_server(
cwd => $project_root,
home => $home_root,
repo_lib => $repo_lib,
dashboard_bin => $dashboard_bin,
pid => $dashboard_pid,
) if $dashboard_pid;
_docker_rm_force( $docker_bin, $container_name );
fail("$args{label} sql-dashboard Playwright matrix setup or execution failed");
return 0;
};
_stop_dashboard_server(
cwd => $project_root,
home => $home_root,
repo_lib => $repo_lib,
dashboard_bin => $dashboard_bin,
pid => $dashboard_pid,
) if $dashboard_pid;
_docker_rm_force( $docker_bin, $container_name );
return 1;
}
# _playwright_script()
# Purpose: build the generic Chromium Playwright regression script for one server-backed SQL dashboard driver.
# Input: no arguments.
# Output: JavaScript source string that writes JSON case results to stdout.
sub _playwright_script {
return <<'JS';
const path = require('path');
const { chromium } = require(path.join(process.env.PLAYWRIGHT_DIR, 'index.js'));
async function main() {
const browser = await chromium.launch({
executablePath: process.env.CHROMIUM_BIN,
headless: true
});
const page = await browser.newPage();
const consoleMessages = [];
const pageErrors = [];
const cases = [];
function record(name, ok, detail) {
cases.push({ name, ok: !!ok, detail: detail || '' });
}
async function check(name, fn) {
try {
await fn();
record(name, true, '');
} catch (error) {
record(name, false, String(error && error.stack || error));
}
}
function ensure(condition, detail) {
if (!condition) throw new Error(detail);
}
async function waitForBootstrapReady() {
await page.waitForFunction(() => {
const select = document.getElementById('sql-profile-driver');
return !!(select && select.options && select.options.length > 1);
});
}
page.on('console', (message) => {
consoleMessages.push(message.type() + ': ' + message.text());
});
page.on('pageerror', (error) => {
pageErrors.push(String(error && error.stack || error));
});
await page.goto(process.env.DASHBOARD_URL, { waitUntil: 'domcontentloaded' });
await page.waitForSelector('#sql-profile-driver');
await waitForBootstrapReady();
await check('main tabs visible', async () => {
const tabs = await page.locator('[data-sql-main-tab]').allTextContents();
ensure(tabs.includes('Connection Profiles') && tabs.includes('SQL Workspace') && tabs.includes('Schema Explorer'),
'expected top-level SQL tabs were not all visible: ' + JSON.stringify(tabs));
});
await check('driver dropdown exposes requested driver', async () => {
const options = await page.locator('#sql-profile-driver option').allTextContents();
ensure(options.some((value) => String(value || '').includes(process.env.DB_DRIVER)),
'driver dropdown did not expose requested driver: ' + JSON.stringify({ driver: process.env.DB_DRIVER, options }));
});
await check('driver guidance shows the expected DSN example', async () => {
await page.locator('#sql-profile-dsn').fill('');
( run in 1.193 second using v1.01-cache-2.11-cpan-39bf76dae61 )