193 lines
6.2 KiB
PHP
193 lines
6.2 KiB
PHP
<?php
|
|
|
|
use Illuminate\Support\Facades\Blade;
|
|
|
|
// ============================================
|
|
// Card Component Tests
|
|
// ============================================
|
|
|
|
test('card component renders with default variant', function () {
|
|
$html = Blade::render('<x-ui.card>Card content</x-ui.card>');
|
|
|
|
expect($html)
|
|
->toContain('bg-off-white')
|
|
->toContain('rounded-lg')
|
|
->toContain('p-6')
|
|
->toContain('shadow-card')
|
|
->toContain('Card content');
|
|
});
|
|
|
|
test('card component renders with elevated variant', function () {
|
|
$html = Blade::render('<x-ui.card variant="elevated">Elevated card</x-ui.card>');
|
|
|
|
expect($html)
|
|
->toContain('bg-off-white')
|
|
->toContain('rounded-lg')
|
|
->toContain('p-6')
|
|
->toContain('shadow-md')
|
|
->not->toContain('shadow-card')
|
|
->toContain('Elevated card');
|
|
});
|
|
|
|
test('card component applies hover classes when hover is true', function () {
|
|
$html = Blade::render('<x-ui.card :hover="true">Hoverable card</x-ui.card>');
|
|
|
|
expect($html)
|
|
->toContain('hover:shadow-card-hover')
|
|
->toContain('hover:-translate-y-0.5')
|
|
->toContain('transition-all')
|
|
->toContain('cursor-pointer')
|
|
->toContain('Hoverable card');
|
|
});
|
|
|
|
test('card component does not apply hover classes when hover is false', function () {
|
|
$html = Blade::render('<x-ui.card :hover="false">Non-hoverable card</x-ui.card>');
|
|
|
|
expect($html)
|
|
->not->toContain('hover:shadow-card-hover')
|
|
->not->toContain('hover:-translate-y-0.5')
|
|
->not->toContain('cursor-pointer')
|
|
->toContain('Non-hoverable card');
|
|
});
|
|
|
|
test('card component applies highlight border when highlight is true', function () {
|
|
$html = Blade::render('<x-ui.card :highlight="true">Highlighted card</x-ui.card>');
|
|
|
|
expect($html)
|
|
->toContain('border-s-4')
|
|
->toContain('border-warm-gray')
|
|
->toContain('Highlighted card');
|
|
});
|
|
|
|
test('card component does not apply highlight border when highlight is false', function () {
|
|
$html = Blade::render('<x-ui.card :highlight="false">Normal card</x-ui.card>');
|
|
|
|
expect($html)
|
|
->not->toContain('border-s-4')
|
|
->not->toContain('border-warm-gray')
|
|
->toContain('Normal card');
|
|
});
|
|
|
|
test('card component allows custom classes via attributes', function () {
|
|
$html = Blade::render('<x-ui.card class="custom-class">Custom class card</x-ui.card>');
|
|
|
|
expect($html)
|
|
->toContain('custom-class')
|
|
->toContain('bg-off-white')
|
|
->toContain('Custom class card');
|
|
});
|
|
|
|
test('card component supports multiple props together', function () {
|
|
$html = Blade::render('<x-ui.card variant="elevated" :hover="true" :highlight="true">Full featured card</x-ui.card>');
|
|
|
|
expect($html)
|
|
->toContain('shadow-md')
|
|
->toContain('hover:shadow-card-hover')
|
|
->toContain('hover:-translate-y-0.5')
|
|
->toContain('cursor-pointer')
|
|
->toContain('border-s-4')
|
|
->toContain('border-warm-gray')
|
|
->toContain('Full featured card');
|
|
});
|
|
|
|
// ============================================
|
|
// Stat Card Component Tests
|
|
// ============================================
|
|
|
|
test('stat card displays value and label correctly', function () {
|
|
$html = Blade::render('<x-ui.stat-card value="42" label="Total Items" />');
|
|
|
|
expect($html)
|
|
->toContain('42')
|
|
->toContain('Total Items')
|
|
->toContain('text-2xl')
|
|
->toContain('font-bold')
|
|
->toContain('text-charcoal');
|
|
});
|
|
|
|
test('stat card renders icon when provided', function () {
|
|
$html = Blade::render('<x-ui.stat-card icon="users" value="100" label="Users" />');
|
|
|
|
expect($html)
|
|
->toContain('bg-warm-gray/10')
|
|
->toContain('rounded-lg')
|
|
->toContain('100')
|
|
->toContain('Users');
|
|
});
|
|
|
|
test('stat card hides icon container when icon is null', function () {
|
|
$html = Blade::render('<x-ui.stat-card value="50" label="Items" />');
|
|
|
|
// Icon container should not be rendered when icon is null
|
|
expect($html)
|
|
->not->toContain('bg-warm-gray/10')
|
|
->toContain('50')
|
|
->toContain('Items');
|
|
});
|
|
|
|
test('stat card shows positive trend with plus prefix and success color', function () {
|
|
$html = Blade::render('<x-ui.stat-card value="75" label="Growth" :trend="15" />');
|
|
|
|
expect($html)
|
|
->toContain('+15%')
|
|
->toContain('text-success')
|
|
->toContain('75')
|
|
->toContain('Growth');
|
|
});
|
|
|
|
test('stat card shows negative trend with danger color', function () {
|
|
$html = Blade::render('<x-ui.stat-card value="30" label="Decline" :trend="-10" />');
|
|
|
|
expect($html)
|
|
->toContain('-10%')
|
|
->toContain('text-danger')
|
|
->not->toContain('text-success')
|
|
->toContain('30')
|
|
->toContain('Decline');
|
|
});
|
|
|
|
test('stat card shows zero trend with neutral color', function () {
|
|
$html = Blade::render('<x-ui.stat-card value="50" label="Stable" :trend="0" />');
|
|
|
|
expect($html)
|
|
->toContain('0%')
|
|
->toContain('text-charcoal/50')
|
|
->not->toContain('text-success')
|
|
->not->toContain('text-danger')
|
|
->toContain('50')
|
|
->toContain('Stable');
|
|
});
|
|
|
|
test('stat card hides trend indicator when trend is null', function () {
|
|
$html = Blade::render('<x-ui.stat-card value="25" label="No Trend" />');
|
|
|
|
// Should not contain any trend percentage display
|
|
expect($html)
|
|
->not->toContain('text-success')
|
|
->not->toContain('text-danger')
|
|
->not->toContain('text-charcoal/50')
|
|
->toContain('25')
|
|
->toContain('No Trend');
|
|
});
|
|
|
|
test('stat card is wrapped in a card component', function () {
|
|
$html = Blade::render('<x-ui.stat-card value="100" label="Wrapped" />');
|
|
|
|
// Should contain card styling
|
|
expect($html)
|
|
->toContain('bg-off-white')
|
|
->toContain('rounded-lg')
|
|
->toContain('p-6');
|
|
});
|
|
|
|
test('stat card displays all elements together', function () {
|
|
$html = Blade::render('<x-ui.stat-card icon="chart-bar" value="1,234" label="Total Sales" :trend="25" />');
|
|
|
|
expect($html)
|
|
->toContain('bg-warm-gray/10') // Icon container
|
|
->toContain('1,234') // Value
|
|
->toContain('Total Sales') // Label
|
|
->toContain('+25%') // Trend
|
|
->toContain('text-success'); // Positive trend color
|
|
});
|