Files
SealShare/tests/Feature/Admin/AdminDashboardTest.php
T
Andreas Reinhold / reiniandClaude Opus 5 c4a17b65c8 Move SealShare onto Livewire Material
Replaces maryUI and daisyUI with nonameweb/livewire-material: the Vibrant
indigo scheme, a system/light/dark theme under sealshare-theme, one top
app bar with the account menu, the upload drop zone and link-ready
moments, M3 fields, dialogs instead of wire:confirm, snackbars instead of
flashed messages, a sortable admin table, and the starter-kit cleanup.
Docker builds assets after Composer; CI drops the Flux step.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V9NnLxnPp8vaaurb3Z1MFy
2026-09-13 10:49:38 +02:00

90 lines
2.7 KiB
PHP

<?php
use App\Livewire\Admin\AdminDashboard;
use App\Models\Share;
use App\Models\ShareFile;
use App\Models\User;
use Illuminate\Support\Facades\Storage;
use Livewire\Livewire;
test('admin dashboard requires authentication', function () {
$response = $this->get(route('admin.dashboard'));
$response->assertRedirect(route('login'));
});
test('non-admin user cannot access admin dashboard', function () {
$user = User::factory()->create(['is_admin' => false]);
$response = $this->actingAs($user)->get(route('admin.dashboard'));
$response->assertForbidden();
});
test('admin can access dashboard', function () {
$admin = User::query()->where('is_admin', true)->first();
$response = $this->actingAs($admin)->get(route('admin.dashboard'));
$response->assertOk();
});
test('admin dashboard shows stats', function () {
$admin = User::query()->where('is_admin', true)->first();
$share = Share::factory()->create(['total_size' => 1024]);
ShareFile::factory()->create(['share_id' => $share->id]);
$response = $this->actingAs($admin)->get(route('admin.dashboard'));
$response->assertOk();
$response->assertSee('Total Shares');
$response->assertSee('Active Shares');
$response->assertSee('Total Files');
$response->assertSee('Disk Usage');
});
test('admin can delete share', function () {
Storage::fake('shares');
$admin = User::query()->where('is_admin', true)->first();
$share = Share::factory()->create();
$shareId = $share->id;
Livewire::actingAs($admin)
->test(AdminDashboard::class)
->set('deletingShareId', $shareId)
->call('deleteShare', $shareId)
->assertSet('deletingShareId', null);
expect(Share::query()->find($shareId))->toBeNull();
});
test('admin dashboard shows shares table', function () {
$admin = User::query()->where('is_admin', true)->first();
$share = Share::factory()->create(['token' => 'testtoken12345678']);
$response = $this->actingAs($admin)->get(route('admin.dashboard'));
$response->assertOk();
$response->assertSee('testtoken12345678');
});
test('the shares table sorts only by its own columns', function () {
$admin = User::query()->where('is_admin', true)->first();
Share::factory()->create(['token' => 'aaaaaaaaaaaaaaaa', 'download_count' => 9]);
Share::factory()->create(['token' => 'zzzzzzzzzzzzzzzz', 'download_count' => 1]);
Livewire::actingAs($admin)
->test(AdminDashboard::class)
->set('sortBy', ['column' => 'download_count', 'direction' => 'asc'])
->assertSeeInOrder(['zzzzzzzzzzzzzzzz', 'aaaaaaaaaaaaaaaa'])
->set('sortBy', ['column' => 'token; drop table shares', 'direction' => 'sideways'])
->assertOk();
expect(Share::query()->count())->toBe(2);
});