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');
});