mirror of
https://github.com/projectsend/projectsend.git
synced 2026-09-17 17:15:08 +00:00
6e47d76ba6
Client file sharing, rebuilt from the ground up: a private area per client, resumable uploads, folders, groups and categories, sharing with expiry dates and download limits, comments, file versions, an activity log, a REST API, and sixteen languages. This repository begins here. ProjectSend 2 was developed privately, and that development history is not published — the previous generation remains available, with its own history, at projectsend/legacy. Free software under the GNU General Public License v2, or (at your option) any later version.
110 lines
4.0 KiB
PHP
110 lines
4.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Models\User;
|
|
use App\Modules\Identity\Permissions\SystemRole;
|
|
use App\Modules\Identity\UserType;
|
|
use App\Modules\Platform\Capabilities\Edition;
|
|
use Inertia\Testing\AssertableInertia;
|
|
|
|
beforeEach(function () {
|
|
$this->admin = User::factory()->create();
|
|
});
|
|
|
|
test('the index lists clients only — staff never appear', function () {
|
|
User::factory()->client()->create(['name' => 'A Client']);
|
|
User::factory()->role(SystemRole::Uploader)->create(['name' => 'A Staffer']);
|
|
|
|
$this->actingAs($this->admin)->get('/clients')->assertInertia(
|
|
fn (AssertableInertia $page) => $page
|
|
->component('clients/index')
|
|
->has('clients', 1)
|
|
->where('clients.0.name', 'A Client'),
|
|
);
|
|
});
|
|
|
|
test('a staff-created client is active with the Client role', function () {
|
|
$response = $this->actingAs($this->admin)->post('/clients', [
|
|
'name' => 'Handmade Client',
|
|
'email' => 'made@example.com',
|
|
'password' => 'super-secret-password',
|
|
'password_confirmation' => 'super-secret-password',
|
|
]);
|
|
|
|
$client = User::query()->where('email', 'made@example.com')->sole();
|
|
$response->assertRedirect(route('clients.edit', $client));
|
|
expect($client->type)->toBe(UserType::Client)
|
|
->and($client->active)->toBeTrue()
|
|
->and($client->role?->name)->toBe('Client');
|
|
});
|
|
|
|
test('staff accounts are unreachable through client screens', function () {
|
|
$staffer = User::factory()->role(SystemRole::Uploader)->create();
|
|
|
|
$this->actingAs($this->admin);
|
|
$this->get("/clients/{$staffer->id}")->assertNotFound();
|
|
$this->patch("/clients/{$staffer->id}", [])->assertNotFound();
|
|
$this->delete("/clients/{$staffer->id}")->assertNotFound();
|
|
});
|
|
|
|
test('activating a pending client through the edit screen clears the request flag', function () {
|
|
$pending = User::factory()->pendingClient()->create();
|
|
|
|
$this->actingAs($this->admin)->patch("/clients/{$pending->id}", [
|
|
'name' => $pending->name,
|
|
'email' => $pending->email,
|
|
'active' => true,
|
|
])->assertRedirect();
|
|
|
|
$pending->refresh();
|
|
expect($pending->active)->toBeTrue()
|
|
->and($pending->account_requested)->toBeFalse();
|
|
});
|
|
|
|
test('an account manager can manage clients but an uploader cannot', function () {
|
|
// Account Manager holds create/edit/delete_clients + approve_account_requests.
|
|
$manager = User::factory()->role(SystemRole::AccountManager)->create();
|
|
$this->actingAs($manager);
|
|
$this->get('/account-requests')->assertOk();
|
|
|
|
// manage_clients is NOT in the Account Manager default set (v1 parity):
|
|
// the list needs it, so the index is refused while the queue works.
|
|
$this->get('/clients')->assertForbidden();
|
|
|
|
$uploader = User::factory()->role(SystemRole::Uploader)->create();
|
|
$this->actingAs($uploader);
|
|
$this->get('/clients')->assertForbidden();
|
|
$this->get('/account-requests')->assertForbidden();
|
|
});
|
|
|
|
test('client management exists in the cloud edition too', function () {
|
|
config()->set('projectsend.edition', Edition::Cloud);
|
|
|
|
$this->actingAs($this->admin)->get('/clients')->assertOk();
|
|
$this->actingAs($this->admin)->get('/account-requests')->assertOk();
|
|
});
|
|
|
|
test('staff can update client settings and they take effect', function () {
|
|
$this->actingAs($this->admin);
|
|
|
|
$this->get('/system/settings/clients')->assertInertia(
|
|
fn (AssertableInertia $page) => $page
|
|
->component('system/settings/clients')
|
|
->where('clients_can_register', false),
|
|
);
|
|
|
|
$this->patch('/system/settings/clients', [
|
|
'clients_can_register' => true,
|
|
'clients_auto_approve' => false,
|
|
'clients_auto_group' => 0,
|
|
'clients_can_select_group' => 'none',
|
|
'clients_membership_deny_cooldown_days' => 30,
|
|
'default_client_storage_quota_mb' => 0,
|
|
])->assertRedirect()->assertSessionDoesntHaveErrors();
|
|
|
|
Auth::logout();
|
|
$this->flushSession();
|
|
$this->get('/register')->assertOk();
|
|
});
|