feat(v3.3.0): enterprise presets, badges, notifications, rule controller, watch mode, offline healer, and WCAG 2.2 ruleset

This commit is contained in:
Enes Yakıştır
2026-09-12 10:12:05 +03:00
parent 2de1f34878
commit ef8ccb9f75
43 changed files with 2598 additions and 81 deletions
+56
View File
@@ -0,0 +1,56 @@
<?php
namespace YakNet\AccessibilityConsole\Tests\Reporting;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\Console\Style\SymfonyStyle;
use YakNet\AccessibilityConsole\Core\Severity;
use YakNet\AccessibilityConsole\Core\Violation;
use YakNet\AccessibilityConsole\Core\WCAGStandard;
use YakNet\AccessibilityConsole\Reporting\JunitFormatter;
class JunitFormatterTest extends TestCase
{
public function testRendersValidJunitXmlWithViolations(): void
{
$formatter = new JunitFormatter();
$violations = [
new Violation(
'WCAG_1_1_1_IMG_ALT',
'Images must have alternative text.',
Severity::ERROR,
WCAGStandard::A,
'<img src="photo.png">',
['file' => 'views/index.php', 'line' => 10, 'column' => 2]
),
];
$xml = $formatter->render($violations);
$this->assertStringContainsString('<?xml version="1.0" encoding="UTF-8"?>', $xml);
$this->assertStringContainsString('<testsuites', $xml);
$this->assertStringContainsString('failures="1"', $xml);
$this->assertStringContainsString('<failure', $xml);
$this->assertStringContainsString('WCAG_1_1_1_IMG_ALT', $xml);
// Verify valid XML parsing
$dom = new \DOMDocument();
$this->assertTrue($dom->loadXML($xml));
}
public function testRendersCleanXmlWhenEmpty(): void
{
$formatter = new JunitFormatter();
$input = new ArrayInput([]);
$output = new BufferedOutput();
$io = new SymfonyStyle($input, $output);
$exitCode = $formatter->format([], 0, $io);
$this->assertSame(0, $exitCode);
$xml = $output->fetch();
$this->assertStringContainsString('failures="0"', $xml);
$this->assertStringContainsString('AccessibilityCompliant', $xml);
}
}
+73
View File
@@ -0,0 +1,73 @@
<?php
namespace YakNet\AccessibilityConsole\Tests\Reporting;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\Console\Style\SymfonyStyle;
use YakNet\AccessibilityConsole\Core\Severity;
use YakNet\AccessibilityConsole\Core\Violation;
use YakNet\AccessibilityConsole\Core\WCAGStandard;
use YakNet\AccessibilityConsole\Reporting\SarifFormatter;
class SarifFormatterTest extends TestCase
{
public function testRendersValidSarifJson(): void
{
$formatter = new SarifFormatter();
$violations = [
new Violation(
'WCAG_1_1_1_IMG_ALT',
'Images must have alternative text.',
Severity::ERROR,
WCAGStandard::A,
'<img src="test.jpg">',
['file' => 'templates/home.blade.php', 'line' => 14, 'column' => 5],
'Add alt="" attribute'
),
new Violation(
'WCAG_1_4_3_CONTRAST',
'Insufficient color contrast.',
Severity::WARNING,
WCAGStandard::AA,
'<span style="color:#ccc">Text</span>',
['file' => 'templates/home.blade.php', 'line' => 20, 'column' => 1]
),
];
$json = $formatter->render($violations);
$this->assertJson($json);
$decoded = json_decode($json, true);
$this->assertIsArray($decoded);
$this->assertSame('2.1.0', $decoded['version']);
$this->assertSame('YakNet Accessibility Console', $decoded['runs'][0]['tool']['driver']['name']);
$this->assertCount(2, $decoded['runs'][0]['results']);
$firstResult = $decoded['runs'][0]['results'][0];
$this->assertSame('WCAG_1_1_1_IMG_ALT', $firstResult['ruleId']);
$this->assertSame('error', $firstResult['level']);
$this->assertSame('templates/home.blade.php', $firstResult['locations'][0]['physicalLocation']['artifactLocation']['uri']);
$this->assertSame(14, $firstResult['locations'][0]['physicalLocation']['region']['startLine']);
}
public function testFormatOutputsToSymfonyStyle(): void
{
$formatter = new SarifFormatter();
$violations = [];
$input = new ArrayInput([]);
$output = new BufferedOutput();
$io = new SymfonyStyle($input, $output);
$exitCode = $formatter->format($violations, 0, $io);
$this->assertSame(0, $exitCode);
$content = $output->fetch();
$this->assertJson($content);
$decoded = json_decode($content, true);
$this->assertIsArray($decoded);
$this->assertEmpty($decoded['runs'][0]['results']);
}
}