* fix: stabilize and diagnose browser CI gate - Replace networkidle screenshot wait (5s client timeout, flaky with long-lived connections) with readyState + fonts-loaded wait and fixed settle in a StableScreenshot helper. - Export standalone diff/expected/actual PNGs on visual mismatch so CI artifacts are directly viewable (vendor only writes an HTML diff view). - Create .env in CI test jobs; without it Laravel's env bootstrap emits a file_get_contents warning on every test. - Bump checkout/cache actions to v5 (Node 20 deprecation). - Gitignore tests/Browser/Screenshots. * docs: track browser CI gate task status in tasks.md
48 lines
2.1 KiB
PHP
48 lines
2.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use Tests\Support\MismatchScreenshotExporter;
|
|
|
|
it('exports diff, expected, and actual PNGs from an ImageDiffView html', function (): void {
|
|
$targetDir = sys_get_temp_dir().'/mismatch-exporter-'.uniqid();
|
|
mkdir($targetDir, 0755, true);
|
|
|
|
$expected = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR4nGNgAAACAAFWoS02AAAAAElFTkSuQmCC';
|
|
$actual = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR4nGNgAAACAAFWoS02AAAAAElFTkSuQmCC';
|
|
$diff = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR4nGNgAAACAAFWoS02AAAAAElFTkSuQmCC';
|
|
|
|
$html = <<<HTML
|
|
<!DOCTYPE html>
|
|
<html><body>
|
|
<img alt="Diff" src="data:image/png;base64,{$diff}"/>
|
|
<img slot="image-1" alt="Expected" src="data:image/png;base64,{$expected}"/>
|
|
<img slot="image-2" alt="Actual" src="data:image/png;base64,{$actual}"/>
|
|
</body></html>
|
|
HTML;
|
|
|
|
$htmlPath = $targetDir.'/it_matches_home_desktop.html';
|
|
file_put_contents($htmlPath, $html);
|
|
|
|
$written = MismatchScreenshotExporter::export($htmlPath, $targetDir);
|
|
|
|
expect($written)->toHaveCount(3);
|
|
expect($written)->toContain($targetDir.'/it_matches_home_desktop-diff.png');
|
|
expect($written)->toContain($targetDir.'/it_matches_home_desktop-expected.png');
|
|
expect($written)->toContain($targetDir.'/it_matches_home_desktop-actual.png');
|
|
|
|
expect(base64_decode($diff, true))->toBe((string) file_get_contents($targetDir.'/it_matches_home_desktop-diff.png'));
|
|
expect(base64_decode($expected, true))->toBe((string) file_get_contents($targetDir.'/it_matches_home_desktop-expected.png'));
|
|
expect(base64_decode($actual, true))->toBe((string) file_get_contents($targetDir.'/it_matches_home_desktop-actual.png'));
|
|
});
|
|
|
|
it('returns an empty list when the html has no embedded images', function (): void {
|
|
$targetDir = sys_get_temp_dir().'/mismatch-exporter-'.uniqid();
|
|
mkdir($targetDir, 0755, true);
|
|
|
|
$htmlPath = $targetDir.'/plain.html';
|
|
file_put_contents($htmlPath, '<html><body>no images</body></html>');
|
|
|
|
expect(MismatchScreenshotExporter::export($htmlPath, $targetDir))->toBe([]);
|
|
});
|