3
0
mirror of https://github.com/snipe/snipe-it.git synced 2026-08-22 05:08:05 +00:00
Files
snipe-it/tests/Feature/Console/Commands/PurgeEulaPDFTest.php
2026-07-10 14:41:47 +01:00

220 lines
8.2 KiB
PHP

<?php
namespace Tests\Feature\Console\Commands;
use App\Models\Asset;
use App\Models\CheckoutAcceptance;
use App\Models\Company;
use App\Models\User;
use Storage;
use Tests\TestCase;
class PurgeEulaPDFTest extends TestCase
{
public function test_only_purges_acceptances_for_deleted_users(): void
{
$intervalDate = now()->subDays(30);
$company = Company::factory()->create();
$asset = Asset::factory()->create();
$otherAsset = Asset::factory()->create();
$softDeletedUser = User::factory()->forCompany($company)->create();
$softDeletedUser->delete();
$activeUser = User::factory()->forCompany($company)->create();
$acceptanceToPurge = CheckoutAcceptance::factory()->create([
'checkoutable_type' => Asset::class,
'checkoutable_id' => $asset->id,
'assigned_to_id' => $softDeletedUser->id,
'signature_filename' => 'signature-to-purge.png',
'stored_eula_file' => 'eula-to-purge.pdf',
'updated_at' => $intervalDate->copy()->subDay(),
]);
$acceptanceToKeep = CheckoutAcceptance::factory()->create([
'checkoutable_type' => Asset::class,
'checkoutable_id' => $otherAsset->id,
'assigned_to_id' => $activeUser->id,
'signature_filename' => 'signature-to-keep.png',
'stored_eula_file' => 'eula-to-keep.pdf',
'updated_at' => $intervalDate->copy()->subDay(),
]);
$this->artisan('snipeit:purge-eula-pdfs', [
'--older-than-days' => 0,
'--only-deleted-users' => true,
'--force' => true,
])->assertExitCode(0);
$this->assertSoftDeleted('checkout_acceptances', [
'id' => $acceptanceToPurge->id,
]);
$this->assertDatabaseHas('checkout_acceptances', [
'id' => $acceptanceToKeep->id,
]);
}
public function test_only_purges_records_for_the_given_company(): void
{
$intervalDate = now()->subDays(30);
$targetCompany = Company::factory()->create();
$otherCompany = Company::factory()->create();
$targetAsset = Asset::factory()->create();
$otherAsset = Asset::factory()->create();
$userInTargetCompany = User::factory()->forCompany($targetCompany)->create();
$userInOtherCompany = User::factory()->forCompany($otherCompany)->create();
$targetAcceptance = CheckoutAcceptance::factory()->create([
'checkoutable_type' => Asset::class,
'checkoutable_id' => $targetAsset->id,
'assigned_to_id' => $userInTargetCompany->id,
'signature_filename' => 'target-signature.png',
'stored_eula_file' => 'target-eula.pdf',
'updated_at' => $intervalDate->copy()->subDay(),
]);
$otherAcceptance = CheckoutAcceptance::factory()->create([
'checkoutable_type' => Asset::class,
'checkoutable_id' => $otherAsset->id,
'assigned_to_id' => $userInOtherCompany->id,
'signature_filename' => 'other-signature.png',
'stored_eula_file' => 'other-eula.pdf',
'updated_at' => $intervalDate->copy()->subDay(),
]);
Storage::fake('local');
Storage::put('private_uploads/signatures/target-signature.png', 'fake');
Storage::put('private_uploads/eula-pdfs/target-eula.pdf', 'fake');
Storage::put('private_uploads/signatures/other-signature.png', 'fake');
Storage::put('private_uploads/eula-pdfs/other-eula.pdf', 'fake');
$this->artisan('snipeit:purge-eula-pdfs', [
'--older-than-days' => 0,
'--company-id' => $targetCompany->id,
'--force' => true,
])->assertExitCode(0);
$this->assertSoftDeleted('checkout_acceptances', [
'id' => $targetAcceptance->id,
]);
$this->assertDatabaseHas('checkout_acceptances', [
'id' => $otherAcceptance->id,
]);
}
public function test_only_purges_soft_deleted_users_for_the_given_company(): void
{
$intervalDate = now()->subDays(30);
$targetCompany = Company::factory()->create();
$otherCompany = Company::factory()->create();
$matchingAsset = Asset::factory()->create();
$wrongCompanyAsset = Asset::factory()->create();
$activeUserAsset = Asset::factory()->create();
$matchingUser = User::factory()->forCompany($targetCompany)->create();
$matchingUser->delete();
$wrongCompanyUser = User::factory()->forCompany($otherCompany)->create();
$wrongCompanyUser->delete();
$activeUserInTargetCompany = User::factory()->forCompany($targetCompany)->create();
Storage::fake('local');
Storage::put('private_uploads/signatures/matching-signature.png', 'fake');
Storage::put('private_uploads/eula-pdfs/matching-eula.pdf', 'fake');
Storage::put('private_uploads/signatures/wrong-company-signature.png', 'fake');
Storage::put('private_uploads/eula-pdfs/wrong-company-eula.pdf', 'fake');
Storage::put('private_uploads/signatures/active-user-signature.png', 'fake');
Storage::put('private_uploads/eula-pdfs/active-user-eula.pdf', 'fake');
$matchingAcceptance = CheckoutAcceptance::factory()->create([
'checkoutable_type' => Asset::class,
'checkoutable_id' => $matchingAsset->id,
'assigned_to_id' => $matchingUser->id,
'signature_filename' => 'matching-signature.png',
'stored_eula_file' => 'matching-eula.pdf',
'updated_at' => $intervalDate->copy()->subDay(),
]);
$wrongCompanyAcceptance = CheckoutAcceptance::factory()->create([
'checkoutable_type' => Asset::class,
'checkoutable_id' => $wrongCompanyAsset->id,
'assigned_to_id' => $wrongCompanyUser->id,
'signature_filename' => 'wrong-company-signature.png',
'stored_eula_file' => 'wrong-company-eula.pdf',
'updated_at' => $intervalDate->copy()->subDay(),
]);
$activeUserAcceptance = CheckoutAcceptance::factory()->create([
'checkoutable_type' => Asset::class,
'checkoutable_id' => $activeUserAsset->id,
'assigned_to_id' => $activeUserInTargetCompany->id,
'signature_filename' => 'active-user-signature.png',
'stored_eula_file' => 'active-user-eula.pdf',
'updated_at' => $intervalDate->copy()->subDay(),
]);
$this->artisan('snipeit:purge-eula-pdfs', [
'--older-than-days' => 0,
'--company-id' => $targetCompany->id,
'--only-deleted-users' => true,
'--force' => true,
])->assertExitCode(0);
$this->assertSoftDeleted('checkout_acceptances', [
'id' => $matchingAcceptance->id,
]);
$this->assertDatabaseHas('checkout_acceptances', [
'id' => $wrongCompanyAcceptance->id,
]);
$this->assertDatabaseHas('checkout_acceptances', [
'id' => $activeUserAcceptance->id,
]);
}
public function test_does_not_purge_recent_acceptances_even_for_soft_deleted_users(): void
{
$company = Company::factory()->create();
$softDeletedUser = User::factory()->forCompany($company)->create();
$softDeletedUser->delete();
$recentAsset = Asset::factory()->create();
Storage::fake('local');
Storage::put('private_uploads/signatures/recent-signature.png', 'fake');
Storage::put('private_uploads/eula-pdfs/recent-eula.pdf', 'fake');
$recentAcceptance = CheckoutAcceptance::factory()->create([
'checkoutable_type' => Asset::class,
'checkoutable_id' => $recentAsset->id,
'assigned_to_id' => $softDeletedUser->id,
'signature_filename' => 'recent-signature.png',
'stored_eula_file' => 'recent-eula.pdf',
'updated_at' => now()->subDay(), // <-- stays recent
]);
$this->artisan('snipeit:purge-eula-pdfs', [
'--older-than-days' => 0,
'--only-deleted-users' => true,
'--force' => true,
])->assertExitCode(0);
$this->assertDatabaseHas('checkout_acceptances', [
'id' => $recentAcceptance->id,
]);
}
}