Added tests

This commit is contained in:
snipe
2026-05-18 11:06:54 +01:00
parent db46e16530
commit 94e14e5ee9
8 changed files with 358 additions and 9 deletions
@@ -0,0 +1,65 @@
<?php
namespace Tests\Feature\Maintenances\Api;
use App\Models\Actionlog;
use App\Models\Maintenance;
use App\Models\User;
use Tests\TestCase;
class CompleteMaintenanceTest extends TestCase
{
public function test_requires_permission()
{
$maintenance = Maintenance::factory()->create();
$this->actingAsForApi(User::factory()->create())
->postJson(route('api.maintenances.complete', $maintenance))
->assertForbidden();
}
public function test_can_mark_maintenance_complete()
{
$actor = User::factory()->superuser()->create();
$maintenance = Maintenance::factory()->create();
$this->actingAsForApi($actor)
->postJson(route('api.maintenances.complete', $maintenance))
->assertOk()
->assertStatusMessageIs('success');
$maintenance->refresh();
$this->assertNotNull($maintenance->completed_at);
$this->assertEquals($actor->id, $maintenance->completed_by);
$this->assertHasTheseActionLogs($maintenance, ['create', 'completed']);
}
public function test_marking_complete_does_not_create_update_log()
{
$actor = User::factory()->superuser()->create();
$maintenance = Maintenance::factory()->create();
$this->actingAsForApi($actor)
->postJson(route('api.maintenances.complete', $maintenance));
$updateLogs = Actionlog::where('item_type', Maintenance::class)
->where('item_id', $maintenance->id)
->where('action_type', 'update')
->count();
$this->assertEquals(0, $updateLogs);
}
public function test_cannot_mark_already_completed_maintenance_complete()
{
$actor = User::factory()->superuser()->create();
$maintenance = Maintenance::factory()->create(['completed_at' => now()->subDay(), 'completed_by' => $actor->id]);
$this->actingAsForApi($actor)
->postJson(route('api.maintenances.complete', $maintenance))
->assertStatusMessageIs('error');
$this->assertHasTheseActionLogs($maintenance, ['create']);
}
}
@@ -4,6 +4,7 @@ namespace Tests\Feature\Maintenances\Api;
use App\Models\Asset;
use App\Models\Maintenance;
use App\Models\MaintenanceType;
use App\Models\Supplier;
use App\Models\User;
use Illuminate\Http\UploadedFile;
@@ -27,13 +28,14 @@ class CreateMaintenanceTest extends TestCase
$asset = Asset::factory()->create();
$supplier = Supplier::factory()->create();
$type = MaintenanceType::factory()->create();
$response = $this->actingAsForApi($actor)
->postJson(route('api.maintenances.store'), [
'name' => 'Test Maintenance',
'asset_id' => $asset->id,
'supplier_id' => $supplier->id,
'asset_maintenance_type' => 'Maintenance',
'maintenance_type_id' => $type->id,
'start_date' => '2021-01-01',
'completion_date' => '2021-01-10',
'is_warranty' => '1',
@@ -54,7 +56,8 @@ class CreateMaintenanceTest extends TestCase
$this->assertDatabaseHas('maintenances', [
'asset_id' => $asset->id,
'supplier_id' => $supplier->id,
'asset_maintenance_type' => 'Maintenance',
'maintenance_type_id' => $type->id,
'asset_maintenance_type' => $type->name,
'name' => 'Test Maintenance',
'is_warranty' => 1,
'start_date' => '2021-01-01',
@@ -5,6 +5,7 @@ namespace Tests\Feature\Maintenances\Api;
use App\Models\Actionlog;
use App\Models\Company;
use App\Models\Maintenance;
use App\Models\MaintenanceType;
use App\Models\Supplier;
use App\Models\User;
use Illuminate\Http\UploadedFile;
@@ -26,13 +27,14 @@ class EditMaintenanceTest extends TestCase
$actor = User::factory()->superuser()->create();
$supplier = Supplier::factory()->create();
$maintenance = Maintenance::factory()->create();
$type = MaintenanceType::factory()->create();
$response = $this->actingAs($actor)
->followingRedirects()
->patch(route('maintenances.update', $maintenance), [
'name' => 'Test Maintenance',
'supplier_id' => $supplier->id,
'asset_maintenance_type' => 'Maintenance',
'maintenance_type_id' => $type->id,
'start_date' => '2021-01-01',
'completion_date' => '2021-01-10',
'is_warranty' => '1',
@@ -50,7 +52,8 @@ class EditMaintenanceTest extends TestCase
$this->assertDatabaseHas('maintenances', [
'supplier_id' => $supplier->id,
'asset_maintenance_type' => 'Maintenance',
'maintenance_type_id' => $type->id,
'asset_maintenance_type' => $type->name,
'name' => 'Test Maintenance',
'is_warranty' => 1,
'start_date' => '2021-01-01',
@@ -0,0 +1,78 @@
<?php
namespace Tests\Feature\Maintenances\Api;
use App\Models\MaintenanceType;
use App\Models\User;
use Tests\TestCase;
class MaintenanceTypesTest extends TestCase
{
public function test_index_requires_permission()
{
$this->actingAsForApi(User::factory()->create())
->getJson(route('api.maintenance-types.index'))
->assertForbidden();
}
public function test_can_list_maintenance_types()
{
MaintenanceType::factory()->count(3)->create();
$this->actingAsForApi(User::factory()->superuser()->create())
->getJson(route('api.maintenance-types.index'))
->assertOk()
->assertJsonStructure(['total', 'rows']);
}
public function test_can_show_maintenance_type()
{
$type = MaintenanceType::factory()->create();
$this->actingAsForApi(User::factory()->superuser()->create())
->getJson(route('api.maintenance-types.show', $type))
->assertOk()
->assertJsonFragment(['name' => $type->name]);
}
public function test_can_create_maintenance_type()
{
$this->actingAsForApi(User::factory()->superuser()->create())
->postJson(route('api.maintenance-types.store'), ['name' => 'My Custom Type'])
->assertOk()
->assertStatusMessageIs('success');
$this->assertDatabaseHas('maintenance_types', ['name' => 'My Custom Type']);
}
public function test_create_requires_name()
{
$this->actingAsForApi(User::factory()->superuser()->create())
->postJson(route('api.maintenance-types.store'), [])
->assertStatusMessageIs('error');
}
public function test_can_update_maintenance_type()
{
$type = MaintenanceType::factory()->create(['name' => 'Old Name']);
$this->actingAsForApi(User::factory()->superuser()->create())
->putJson(route('api.maintenance-types.update', $type), ['name' => 'New Name'])
->assertOk()
->assertStatusMessageIs('success');
$this->assertDatabaseHas('maintenance_types', ['id' => $type->id, 'name' => 'New Name']);
}
public function test_can_delete_maintenance_type()
{
$type = MaintenanceType::factory()->create();
$this->actingAsForApi(User::factory()->superuser()->create())
->deleteJson(route('api.maintenance-types.destroy', $type))
->assertOk()
->assertStatusMessageIs('success');
$this->assertSoftDeleted($type);
}
}
@@ -0,0 +1,71 @@
<?php
namespace Tests\Feature\Maintenances\Ui;
use App\Models\Actionlog;
use App\Models\Maintenance;
use App\Models\User;
use Tests\TestCase;
class CompleteMaintenanceTest extends TestCase
{
public function test_requires_permission()
{
$maintenance = Maintenance::factory()->create();
$this->actingAs(User::factory()->create())
->post(route('maintenances.complete', $maintenance))
->assertForbidden();
$this->assertDatabaseMissing('maintenances', [
'id' => $maintenance->id,
'completed_at' => now(),
]);
}
public function test_can_mark_maintenance_complete()
{
$actor = User::factory()->superuser()->create();
$maintenance = Maintenance::factory()->create();
$this->actingAs($actor)
->post(route('maintenances.complete', $maintenance))
->assertSessionHasNoErrors()
->assertRedirect();
$maintenance->refresh();
$this->assertNotNull($maintenance->completed_at);
$this->assertEquals($actor->id, $maintenance->completed_by);
$this->assertHasTheseActionLogs($maintenance, ['create', 'completed']);
}
public function test_marking_complete_does_not_create_update_log()
{
$actor = User::factory()->superuser()->create();
$maintenance = Maintenance::factory()->create();
$this->actingAs($actor)
->post(route('maintenances.complete', $maintenance));
$updateLogs = Actionlog::where('item_type', Maintenance::class)
->where('item_id', $maintenance->id)
->where('action_type', 'update')
->count();
$this->assertEquals(0, $updateLogs);
}
public function test_cannot_mark_already_completed_maintenance_complete()
{
$actor = User::factory()->superuser()->create();
$maintenance = Maintenance::factory()->create(['completed_at' => now()->subDay(), 'completed_by' => $actor->id]);
$this->actingAs($actor)
->post(route('maintenances.complete', $maintenance))
->assertRedirect()
->assertSessionHas('warning');
$this->assertHasTheseActionLogs($maintenance, ['create']);
}
}
@@ -5,6 +5,7 @@ namespace Tests\Feature\Maintenances\Ui;
use App\Models\Actionlog;
use App\Models\Asset;
use App\Models\Maintenance;
use App\Models\MaintenanceType;
use App\Models\Supplier;
use App\Models\User;
use Illuminate\Http\UploadedFile;
@@ -34,13 +35,14 @@ class CreateMaintenanceTest extends TestCase
$actor = User::factory()->superuser()->create();
$asset = Asset::factory()->create();
$supplier = Supplier::factory()->create();
$type = MaintenanceType::factory()->create();
$this->actingAs($actor)
->post(route('maintenances.store'), [
'name' => 'Test Maintenance',
'selected_assets' => [$asset->id],
'supplier_id' => $supplier->id,
'asset_maintenance_type' => 'Maintenance',
'maintenance_type_id' => $type->id,
'start_date' => '2021-01-01',
'completion_date' => '2021-01-10',
'is_warranty' => '1',
@@ -72,7 +74,8 @@ class CreateMaintenanceTest extends TestCase
$this->assertDatabaseHas('maintenances', [
'asset_id' => $asset->id,
'supplier_id' => $supplier->id,
'asset_maintenance_type' => 'Maintenance',
'maintenance_type_id' => $type->id,
'asset_maintenance_type' => $type->name,
'name' => 'Test Maintenance',
'is_warranty' => 1,
'start_date' => '2021-01-01',
@@ -0,0 +1,123 @@
<?php
namespace Tests\Feature\Maintenances\Ui;
use App\Models\Asset;
use App\Models\MaintenanceType;
use App\Models\User;
use Tests\TestCase;
class CreateMaintenanceTrackingTest extends TestCase
{
public function test_checkout_snapshot_is_captured_when_asset_is_checked_out()
{
$actor = User::factory()->superuser()->create();
$assignedUser = User::factory()->create();
$asset = Asset::factory()->assignedToUser($assignedUser)->create();
$type = MaintenanceType::factory()->create();
$this->actingAs($actor)
->post(route('maintenances.store'), [
'name' => 'Snapshot Test',
'selected_assets' => [$asset->id],
'maintenance_type_id' => $type->id,
'start_date' => '2026-01-01',
])
->assertSessionHasNoErrors()
->assertRedirect(route('maintenances.index'));
$this->assertDatabaseHas('maintenances', [
'asset_id' => $asset->id,
'checked_out_to_id' => $assignedUser->id,
'checked_out_to_type' => User::class,
]);
}
public function test_checkout_snapshot_is_null_when_asset_is_not_checked_out()
{
$actor = User::factory()->superuser()->create();
$asset = Asset::factory()->create();
$type = MaintenanceType::factory()->create();
$this->actingAs($actor)
->post(route('maintenances.store'), [
'name' => 'No Checkout Test',
'selected_assets' => [$asset->id],
'maintenance_type_id' => $type->id,
'start_date' => '2026-01-01',
])
->assertSessionHasNoErrors();
$this->assertDatabaseHas('maintenances', [
'asset_id' => $asset->id,
'checked_out_to_id' => null,
'checked_out_to_type' => null,
]);
}
public function test_responsible_party_defaults_to_creating_user()
{
$actor = User::factory()->superuser()->create();
$asset = Asset::factory()->create();
$type = MaintenanceType::factory()->create();
$this->actingAs($actor)
->post(route('maintenances.store'), [
'name' => 'RP Default Test',
'selected_assets' => [$asset->id],
'maintenance_type_id' => $type->id,
'start_date' => '2026-01-01',
])
->assertSessionHasNoErrors();
$this->assertDatabaseHas('maintenances', [
'asset_id' => $asset->id,
'responsible_party_id' => $actor->id,
]);
}
public function test_responsible_party_can_be_set_to_another_user()
{
$actor = User::factory()->superuser()->create();
$technician = User::factory()->create();
$asset = Asset::factory()->create();
$type = MaintenanceType::factory()->create();
$this->actingAs($actor)
->post(route('maintenances.store'), [
'name' => 'RP Explicit Test',
'selected_assets' => [$asset->id],
'maintenance_type_id' => $type->id,
'responsible_party_id' => $technician->id,
'start_date' => '2026-01-01',
])
->assertSessionHasNoErrors();
$this->assertDatabaseHas('maintenances', [
'asset_id' => $asset->id,
'responsible_party_id' => $technician->id,
]);
}
public function test_maintenance_type_id_syncs_legacy_asset_maintenance_type()
{
$actor = User::factory()->superuser()->create();
$asset = Asset::factory()->create();
$type = MaintenanceType::factory()->create(['name' => 'Custom Calibration']);
$this->actingAs($actor)
->post(route('maintenances.store'), [
'name' => 'Type Sync Test',
'selected_assets' => [$asset->id],
'maintenance_type_id' => $type->id,
'start_date' => '2026-01-01',
])
->assertSessionHasNoErrors();
$this->assertDatabaseHas('maintenances', [
'asset_id' => $asset->id,
'maintenance_type_id' => $type->id,
'asset_maintenance_type' => 'Custom Calibration',
]);
}
}
@@ -6,6 +6,7 @@ use App\Models\Actionlog;
use App\Models\Asset;
use App\Models\Company;
use App\Models\Maintenance;
use App\Models\MaintenanceType;
use App\Models\Supplier;
use App\Models\User;
use Illuminate\Http\UploadedFile;
@@ -30,13 +31,14 @@ class EditMaintenanceTest extends TestCase
$asset = Asset::factory()->create();
$maintenance = Maintenance::factory()->create(['asset_id' => $asset]);
$supplier = Supplier::factory()->create();
$type = MaintenanceType::factory()->create();
$this->actingAs($actor)
->put(route('maintenances.update', $maintenance), [
'name' => 'Test Maintenance',
'asset_id' => $asset->id,
'supplier_id' => $supplier->id,
'asset_maintenance_type' => 'Maintenance',
'maintenance_type_id' => $type->id,
'start_date' => '2021-01-01',
'completion_date' => '2021-01-10',
'is_warranty' => 1,
@@ -68,7 +70,8 @@ class EditMaintenanceTest extends TestCase
$this->assertDatabaseHas('maintenances', [
'asset_id' => $asset->id,
'supplier_id' => $supplier->id,
'asset_maintenance_type' => 'Maintenance',
'maintenance_type_id' => $type->id,
'asset_maintenance_type' => $type->name,
'name' => 'Test Maintenance',
'is_warranty' => 1,
'start_date' => '2021-01-01',
@@ -111,7 +114,7 @@ class EditMaintenanceTest extends TestCase
->put(route('maintenances.update', $maintenanceForCompanyB), [
'name' => 'Should Not Update',
'asset_id' => $maintenanceForCompanyB->asset_id,
'asset_maintenance_type' => $maintenanceForCompanyB->asset_maintenance_type,
'maintenance_type_id' => $maintenanceForCompanyB->maintenance_type_id,
'start_date' => $maintenanceForCompanyB->start_date,
])
->assertRedirectToRoute('maintenances.index');