251 lines
8.4 KiB
PHP
251 lines
8.4 KiB
PHP
<?php
|
|
|
|
use App\Models\User;
|
|
use App\Models\Vehicle;
|
|
use Spatie\Permission\Models\Permission;
|
|
use Spatie\Permission\Models\Role;
|
|
|
|
beforeEach(function () {
|
|
Permission::firstOrCreate(['name' => 'flota_access']);
|
|
});
|
|
|
|
function createFleetUser(string $roleName = 'pracownik'): User
|
|
{
|
|
$user = User::factory()->create();
|
|
$role = Role::firstOrCreate(['name' => $roleName]);
|
|
$role->givePermissionTo('flota_access');
|
|
$user->assignRole($role);
|
|
|
|
return $user;
|
|
}
|
|
|
|
test('manager sees all vehicles and employee sees only assigned vehicles', function () {
|
|
$manager = createFleetUser('kierownik');
|
|
$employee = createFleetUser('pracownik');
|
|
|
|
$assignedVehicle = Vehicle::create([
|
|
'brand' => 'Toyota',
|
|
'registration_number' => 'DW1234A',
|
|
'user_id' => $employee->id,
|
|
'year' => 2020,
|
|
'purchase_date' => '2020-06-01',
|
|
'oc_expiry_date' => '2027-06-01',
|
|
'oil_change_km' => 10000,
|
|
'insurance_provider' => 'Warta',
|
|
'technical_inspection_date' => '2026-09-15',
|
|
'mileage_km' => 120000,
|
|
'status' => 'używany',
|
|
]);
|
|
|
|
$otherVehicle = Vehicle::create([
|
|
'brand' => 'Ford',
|
|
'registration_number' => 'WA9876Z',
|
|
'user_id' => $manager->id,
|
|
'year' => 2018,
|
|
'purchase_date' => '2018-03-01',
|
|
'oc_expiry_date' => '2027-03-01',
|
|
'oil_change_km' => 8000,
|
|
'insurance_provider' => 'PZU',
|
|
'technical_inspection_date' => '2026-10-01',
|
|
'mileage_km' => 180000,
|
|
'status' => 'używany',
|
|
]);
|
|
|
|
$managerResponse = $this->actingAs($manager)->get(route('flota'));
|
|
$managerResponse->assertOk();
|
|
$managerResponse->assertSee('Toyota');
|
|
$managerResponse->assertSee('Ford');
|
|
|
|
$employeeResponse = $this->actingAs($employee)->get(route('flota'));
|
|
$employeeResponse->assertOk();
|
|
$employeeResponse->assertSee('Toyota');
|
|
$employeeResponse->assertDontSee('Ford');
|
|
|
|
$this->assertDatabaseHas('vehicles', ['id' => $assignedVehicle->id, 'brand' => 'Toyota']);
|
|
$this->assertDatabaseHas('vehicles', ['id' => $otherVehicle->id, 'brand' => 'Ford']);
|
|
});
|
|
|
|
test('manager can create and edit a vehicle', function () {
|
|
$manager = createFleetUser('kierownik');
|
|
$user = User::factory()->create();
|
|
|
|
$createResponse = $this->actingAs($manager)->post(route('flota.store'), [
|
|
'brand' => 'BMW',
|
|
'registration_number' => 'PO1111A',
|
|
'user_id' => $user->id,
|
|
'year' => 2022,
|
|
'purchase_date' => '2022-02-10',
|
|
'oc_expiry_date' => '2027-02-10',
|
|
'oil_change_km' => 15000,
|
|
'insurance_provider' => 'PZU',
|
|
'technical_inspection_date' => '2026-11-20',
|
|
'mileage_km' => 50000,
|
|
'status' => 'używany',
|
|
]);
|
|
|
|
$createResponse->assertRedirect(route('flota'));
|
|
$this->assertDatabaseHas('vehicles', ['registration_number' => 'PO1111A', 'brand' => 'BMW']);
|
|
|
|
$vehicle = Vehicle::where('registration_number', 'PO1111A')->first();
|
|
|
|
$editResponse = $this->actingAs($manager)->put(route('flota.update', $vehicle), [
|
|
'brand' => 'BMW',
|
|
'registration_number' => 'PO1111A',
|
|
'user_id' => $user->id,
|
|
'year' => 2023,
|
|
'purchase_date' => '2022-02-10',
|
|
'oc_expiry_date' => '2028-02-10',
|
|
'oil_change_km' => 15000,
|
|
'insurance_provider' => 'Warta',
|
|
'technical_inspection_date' => '2027-11-20',
|
|
'mileage_km' => 60000,
|
|
'status' => 'sprzedany',
|
|
]);
|
|
|
|
$editResponse->assertRedirect(route('flota'));
|
|
$this->assertDatabaseHas('vehicles', ['id' => $vehicle->id, 'year' => 2023, 'status' => 'sprzedany']);
|
|
});
|
|
|
|
test('manager can delete a vehicle', function () {
|
|
$manager = createFleetUser('kierownik');
|
|
$user = User::factory()->create();
|
|
|
|
$vehicle = Vehicle::create([
|
|
'brand' => 'Audi',
|
|
'registration_number' => 'KR9999X',
|
|
'user_id' => $user->id,
|
|
'year' => 2019,
|
|
'purchase_date' => '2019-01-01',
|
|
'oc_expiry_date' => '2027-01-01',
|
|
'oil_change_km' => 12000,
|
|
'insurance_provider' => 'Warta',
|
|
'technical_inspection_date' => '2026-12-01',
|
|
'mileage_km' => 99000,
|
|
'status' => 'używany',
|
|
]);
|
|
|
|
$response = $this->actingAs($manager)->delete(route('flota.destroy', $vehicle));
|
|
|
|
$response->assertRedirect(route('flota'));
|
|
$this->assertDatabaseMissing('vehicles', ['id' => $vehicle->id]);
|
|
});
|
|
|
|
test('dashboard shows vehicles with upcoming technical inspection or oc expiry within 14 days', function () {
|
|
$manager = createFleetUser('kierownik');
|
|
$user = User::factory()->create();
|
|
|
|
$urgentVehicle = Vehicle::create([
|
|
'brand' => 'Toyota',
|
|
'model' => 'Corolla',
|
|
'registration_number' => 'DW1234A',
|
|
'user_id' => $user->id,
|
|
'year' => 2021,
|
|
'purchase_date' => '2021-05-12',
|
|
'oc_expiry_date' => now()->addDays(10)->toDateString(),
|
|
'oil_change_km' => 12000,
|
|
'insurance_provider' => 'PZU',
|
|
'technical_inspection_date' => now()->addDays(20)->toDateString(),
|
|
'mileage_km' => 95000,
|
|
'status' => 'używany',
|
|
]);
|
|
|
|
$safeVehicle = Vehicle::create([
|
|
'brand' => 'Ford',
|
|
'model' => 'Transit',
|
|
'registration_number' => 'WA9876Z',
|
|
'user_id' => $user->id,
|
|
'year' => 2019,
|
|
'purchase_date' => '2019-07-20',
|
|
'oc_expiry_date' => now()->addDays(30)->toDateString(),
|
|
'oil_change_km' => 8000,
|
|
'insurance_provider' => 'Warta',
|
|
'technical_inspection_date' => now()->addDays(40)->toDateString(),
|
|
'mileage_km' => 175000,
|
|
'status' => 'aktywny',
|
|
]);
|
|
|
|
$response = $this->actingAs($manager)->get(route('dashboard'));
|
|
|
|
$response->assertOk();
|
|
$response->assertSee('Samochody do uwagi');
|
|
$response->assertSee($urgentVehicle->brand);
|
|
$response->assertSee('OC');
|
|
$response->assertDontSee($safeVehicle->brand);
|
|
});
|
|
|
|
test('employee profile shows assigned vehicle with expire dates and insurance details', function () {
|
|
Permission::firstOrCreate(['name' => 'users_access']);
|
|
|
|
$manager = User::factory()->create();
|
|
$managerRole = Role::firstOrCreate(['name' => 'kierownik']);
|
|
$managerRole->givePermissionTo(['users_access', 'flota_access']);
|
|
$manager->assignRole($managerRole);
|
|
|
|
$user = User::factory()->create();
|
|
|
|
$vehicle = Vehicle::create([
|
|
'brand' => 'BMW',
|
|
'model' => 'X5',
|
|
'registration_number' => 'PO1111A',
|
|
'user_id' => $user->id,
|
|
'year' => 2022,
|
|
'purchase_date' => '2022-02-10',
|
|
'oc_expiry_date' => now()->addDays(9)->toDateString(),
|
|
'oil_change_km' => 12000,
|
|
'insurance_provider' => 'PZU',
|
|
'technical_inspection_date' => now()->addDays(12)->toDateString(),
|
|
'mileage_km' => 55000,
|
|
'status' => 'używany',
|
|
]);
|
|
|
|
$response = $this->actingAs($manager)->get(route('users.show', $user));
|
|
|
|
$response->assertOk();
|
|
$response->assertSee('Przypisany pojazd');
|
|
$response->assertSee($vehicle->brand);
|
|
$response->assertSee('PZU');
|
|
$response->assertSee('OC');
|
|
$response->assertSee('Przegląd');
|
|
});
|
|
|
|
test('employee dashboard shows only own vehicle and advances', function () {
|
|
Permission::firstOrCreate(['name' => 'zaliczki_access']);
|
|
|
|
$employee = User::factory()->create();
|
|
$role = Role::firstOrCreate(['name' => 'pracownik']);
|
|
$role->givePermissionTo('zaliczki_access');
|
|
$employee->assignRole($role);
|
|
|
|
$assignedVehicle = Vehicle::create([
|
|
'brand' => 'Toyota',
|
|
'model' => 'Corolla',
|
|
'registration_number' => 'DW1234A',
|
|
'user_id' => $employee->id,
|
|
'year' => 2021,
|
|
'purchase_date' => '2021-05-12',
|
|
'oc_expiry_date' => now()->addDays(10)->toDateString(),
|
|
'oil_change_km' => 12000,
|
|
'insurance_provider' => 'PZU',
|
|
'technical_inspection_date' => now()->addDays(12)->toDateString(),
|
|
'mileage_km' => 95000,
|
|
'status' => 'używany',
|
|
]);
|
|
|
|
$advanceType = \App\Models\AdvanceType::create(['name' => 'Paliwo']);
|
|
\App\Models\Advance::create([
|
|
'date' => now()->subDays(2)->toDateString(),
|
|
'user_id' => $employee->id,
|
|
'amount' => 250.50,
|
|
'advance_type_id' => $advanceType->id,
|
|
]);
|
|
|
|
$response = $this->actingAs($employee)->get(route('dashboard'));
|
|
|
|
$response->assertOk();
|
|
$response->assertSee('Mój dashboard');
|
|
$response->assertSee('Mój samochód');
|
|
$response->assertSee($assignedVehicle->brand);
|
|
$response->assertSee('Moje zaliczki');
|
|
$response->assertSee('250,50');
|
|
});
|