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); }); test('without shares the dashboard shows an empty state instead of the table', function () { $admin = User::query()->where('is_admin', true)->first(); $this->actingAs($admin)->get(route('admin.dashboard')) ->assertOk() ->assertSee('No shares yet') ->assertDontSee('where('is_admin', true)->first(); $completed = Share::factory()->create(['token' => 'completedshare01', 'total_size' => 1000]); ShareFile::factory()->for($completed)->create(); $pending = Share::factory()->pending()->create(['token' => 'pendingshare0001', 'total_size' => 500]); ShareFile::factory()->for($pending)->uploading()->create(); Livewire::actingAs($admin) ->test(AdminDashboard::class) ->assertSee('completedshare01') ->assertDontSee('pendingshare0001') ->assertViewHas('totalShares', 1) ->assertViewHas('activeShares', 1) ->assertViewHas('totalFiles', 1) ->assertViewHas('usedSpace', 1500); });