create(); $role = Role::firstOrCreate(['name' => 'ROLE_ADMIN'], ['color' => '#111111']); $admin->roles()->attach($role); return $admin; } it('lists extensions for admins', function (): void { $admin = makeAdminForAttachmentExtensions(); $group = AttachmentGroup::create(['name' => 'General', 'max_size_kb' => 100, 'is_active' => true]); AttachmentExtension::create([ 'extension' => 'pdf', 'attachment_group_id' => $group->id, ]); Sanctum::actingAs($admin); $response = $this->getJson('/api/attachment-extensions'); $response->assertOk(); $response->assertJsonFragment(['extension' => 'pdf']); }); it('lists public extensions for active groups', function (): void { $active = AttachmentGroup::create(['name' => 'Active', 'max_size_kb' => 100, 'is_active' => true]); $inactive = AttachmentGroup::create(['name' => 'Inactive', 'max_size_kb' => 100, 'is_active' => false]); AttachmentExtension::create([ 'extension' => 'png', 'attachment_group_id' => $active->id, ]); AttachmentExtension::create([ 'extension' => 'exe', 'attachment_group_id' => $inactive->id, ]); $response = $this->getJson('/api/attachment-extensions/public'); $response->assertOk(); $response->assertJsonFragment(['png']); $response->assertJsonMissing(['exe']); }); it('creates extensions as admin and normalizes extension', function (): void { $admin = makeAdminForAttachmentExtensions(); $group = AttachmentGroup::create(['name' => 'Docs', 'max_size_kb' => 100, 'is_active' => true]); Sanctum::actingAs($admin); $response = $this->postJson('/api/attachment-extensions', [ 'extension' => '.PDF', 'attachment_group_id' => $group->id, 'allowed_mimes' => ['application/pdf'], ]); $response->assertStatus(201); $response->assertJsonFragment(['extension' => 'pdf']); }); it('updates extensions as admin', function (): void { $admin = makeAdminForAttachmentExtensions(); $group = AttachmentGroup::create(['name' => 'Images', 'max_size_kb' => 100, 'is_active' => true]); $ext = AttachmentExtension::create([ 'extension' => 'png', 'attachment_group_id' => null, ]); Sanctum::actingAs($admin); $response = $this->patchJson("/api/attachment-extensions/{$ext->id}", [ 'attachment_group_id' => $group->id, 'allowed_mimes' => ['image/png'], ]); $response->assertOk(); $response->assertJsonFragment(['attachment_group_id' => $group->id]); }); it('prevents deleting extensions in use', function (): void { $admin = makeAdminForAttachmentExtensions(); $ext = AttachmentExtension::create([ 'extension' => 'pdf', 'attachment_group_id' => null, ]); Attachment::create([ 'thread_id' => null, 'post_id' => null, 'attachment_extension_id' => $ext->id, 'attachment_group_id' => null, 'user_id' => null, 'disk' => 'local', 'path' => 'attachments/misc/file.pdf', 'original_name' => 'file.pdf', 'extension' => 'pdf', 'mime_type' => 'application/pdf', 'size_bytes' => 10, ]); Sanctum::actingAs($admin); $response = $this->deleteJson("/api/attachment-extensions/{$ext->id}"); $response->assertStatus(422); $response->assertJsonFragment(['message' => 'Extension is in use.']); });