coolify/tests/Feature/ServiceDatabaseVerticalNavigationTest.php
Andras Bacsai 262ad8981a feat(ui): unify status summaries, tooltips, and resource headings
Add shared status-summary and icon-tooltip components and wire them into
application, service, and database headings, breadcrumbs, and previews.
Badge production and PR domain links, prefer helper popups below the
trigger, keep full wire targets for button loading, and cover the UI
with feature tests.
2026-08-06 18:15:58 +02:00

122 lines
6.3 KiB
PHP

<?php
it('moves service and database page navigation into their sidebars', function () {
$serviceHeading = file_get_contents(resource_path('views/livewire/project/service/heading.blade.php'));
$databaseHeading = file_get_contents(resource_path('views/livewire/project/database/heading.blade.php'));
$serviceConfiguration = file_get_contents(resource_path('views/livewire/project/service/configuration.blade.php'));
$databaseSidebar = file_get_contents(resource_path('views/components/database/configuration-sidebar.blade.php'));
expect($serviceHeading)->not->toContain('<x-resource-heading-tabs')
->and($databaseHeading)->not->toContain('<x-resource-heading-tabs')
->and($serviceConfiguration)
->toContain("['label' => 'Backups'")
->toContain("['label' => 'Runtime'")
->toContain("['label' => 'Terminal'")
->and($databaseSidebar)
->toContain("['label' => 'Backups'")
->toContain("['label' => 'Runtime'")
->toContain("['label' => 'Terminal'");
});
it('matches application action bar behavior for services and databases', function () {
$service = file_get_contents(resource_path('views/livewire/project/service/heading.blade.php'));
$database = file_get_contents(resource_path('views/livewire/project/database/heading.blade.php'));
foreach ([$service, $database] as $heading) {
expect($heading)
->toContain('xl:fixed xl:top-14 xl:right-4')
->toContain('xl:w-auto')
->toContain('Actions')
->toContain('listbox-panel top-full! right-0! left-auto!')
->not->toContain('hidden lg:block lg:h-12');
}
expect($service)->toContain('id="service-desktop-actions"')
->and($database)->toContain('id="database-desktop-actions"');
});
it('keeps database and service sidebar sections in the application sequence', function () {
$database = file_get_contents(resource_path('views/components/database/configuration-sidebar.blade.php'));
$service = file_get_contents(resource_path('views/livewire/project/service/configuration.blade.php'));
expect($database)
->toContain("'Settings' => ['General', 'Environment Variables', 'Persistent Storage', 'Backups', 'Servers', 'Import Backup']")
->toContain("'Automation' => ['Webhooks', 'Healthcheck']")
->toContain("'Logs' => ['Runtime']")
->toContain("'Operations' => ['Terminal', 'Resource Limits', 'Resource Operations', 'Metrics', 'Tags', 'Danger Zone']");
expect($service)
->toContain("'Settings' => ['General', 'Domains', 'Environment Variables', 'Persistent Storage', 'Backups']")
->toContain("'Automation' => ['Scheduled Tasks', 'Webhooks']")
->toContain("'Logs' => ['Runtime']")
->toContain("'Operations' => ['Terminal', 'Resource Operations', 'Tags', 'Danger Zone']");
});
it('shows the database sidebar on backup pages', function () {
$configuration = file_get_contents(resource_path('views/livewire/project/database/configuration.blade.php'));
$backups = file_get_contents(resource_path('views/livewire/project/database/backup/index.blade.php'));
$sidebar = file_get_contents(resource_path('views/components/database/configuration-sidebar.blade.php'));
expect($configuration)->toContain('<x-database.configuration-sidebar')
->and($backups)
->toContain('<x-database.configuration-sidebar')
->toContain('current-route="project.database.backup.index"')
->and($sidebar)
->toContain("str(\$currentRoute)->startsWith('project.database.backup')");
});
it('shows the service sidebar on the storage backups page', function () {
$backups = file_get_contents(resource_path('views/livewire/project/service/volume-backup/index.blade.php'));
expect($backups)
->toContain('<x-service.configuration-sidebar :service="$service"')
->toContain('current-route="project.service.volume-backups.index"')
->toContain('xl:grid-cols-[210px_minmax(0,1fr)]');
});
it('uses a distinct backup icon across resource sidebars', function () {
$sidebars = [
resource_path('views/components/application/configuration-sidebar.blade.php'),
resource_path('views/components/database/configuration-sidebar.blade.php'),
resource_path('views/livewire/project/service/configuration.blade.php'),
];
foreach ($sidebars as $sidebar) {
$contents = file_get_contents($sidebar);
expect($contents)->toMatch("/['\"]Backups['\"].*['\"]database['\"]/s");
}
});
it('shows the database sidebar on runtime logs', function () {
$logs = file_get_contents(resource_path('views/livewire/project/shared/logs.blade.php'));
expect($logs)
->toContain("in_array(\$type, ['application', 'database', 'service'], true)")
->toContain('<x-database.configuration-sidebar :database="$resource" current-route="project.database.logs"')
->toContain('loading-state-card');
});
it('shows the database sidebar in the terminal', function () {
$terminal = file_get_contents(resource_path('views/livewire/project/shared/execute-container-command.blade.php'));
expect($terminal)
->toContain("in_array(\$type, ['application', 'database', 'service', 'server'], true)")
->toContain('<x-database.configuration-sidebar :database="$resource" current-route="project.database.command"');
});
it('shows the service sidebar on runtime logs and terminal pages', function () {
$logs = file_get_contents(resource_path('views/livewire/project/shared/logs.blade.php'));
$terminal = file_get_contents(resource_path('views/livewire/project/shared/execute-container-command.blade.php'));
$sidebar = file_get_contents(resource_path('views/components/service/configuration-sidebar.blade.php'));
expect($logs)
->toContain("in_array(\$type, ['application', 'database', 'service'], true)")
->toContain('<x-service.configuration-sidebar :service="$resource" current-route="project.service.logs"')
->and($terminal)
->toContain("in_array(\$type, ['application', 'database', 'service', 'server'], true)")
->toContain('<x-service.configuration-sidebar :service="$resource" current-route="project.service.command"')
->and($sidebar)
->toContain("'Logs' => ['Runtime']")
->toContain("'Operations' => ['Terminal', 'Resource Operations', 'Tags', 'Danger Zone']");
});