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 )