Files
WMS/Modules/Helpdesk/Tests/Feature/SettingsCrudTest.php
T
2026-06-23 15:32:05 +01:00

270 lines
12 KiB
PHP

<?php
declare(strict_types=1);
namespace Modules\Helpdesk\Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Livewire\Livewire;
use Modules\Helpdesk\Livewire\SettingsManager;
use Modules\Helpdesk\Models\AutomationRule;
use Modules\Helpdesk\Models\CannedResponse;
use Modules\Helpdesk\Models\Category;
use Modules\Helpdesk\Models\ChecklistTemplate;
use Modules\Helpdesk\Models\GitRepository;
use Modules\Helpdesk\Models\KanbanBoard;
use Modules\Helpdesk\Models\Priority;
use Modules\Helpdesk\Models\Product;
use Modules\Helpdesk\Models\Project;
use Modules\Helpdesk\Models\SlaPolicy;
use Modules\Helpdesk\Models\Status;
use Modules\Helpdesk\Models\Tag;
use Modules\Helpdesk\Models\Team;
use Modules\Helpdesk\Models\WorkflowTemplate;
use Modules\Helpdesk\Tests\Concerns\BuildsHelpdeskFixtures;
use Tests\TestCase;
final class SettingsCrudTest extends TestCase
{
use BuildsHelpdeskFixtures;
use RefreshDatabase;
public function test_all_helpdesk_settings_create_and_update_actions_persist_records(): void
{
$fixtures = $this->seedLookupData();
$admin = $this->admin(['name' => 'Settings CRUD Admin']);
$this->actingAs($admin);
Livewire::test(SettingsManager::class)
->set('statusForm.name', 'Awaiting Customer')
->set('statusForm.slug', 'awaiting-customer')
->set('statusForm.color', 'amber')
->set('statusForm.sort_order', 20)
->call('saveStatus')
->assertHasNoErrors();
$status = Status::query()->where('slug', 'awaiting-customer')->firstOrFail();
Livewire::test(SettingsManager::class)
->call('editStatus', $status->id)
->set('statusForm.name', 'Awaiting Customer Reply')
->call('saveStatus')
->assertHasNoErrors();
$this->assertDatabaseHas('helpdesk_statuses', ['id' => $status->id, 'name' => 'Awaiting Customer Reply']);
Livewire::test(SettingsManager::class)
->set('priorityForm.name', 'Critical')
->set('priorityForm.slug', 'critical')
->set('priorityForm.color', 'red')
->set('priorityForm.sort_order', 1)
->call('savePriority')
->assertHasNoErrors();
$priority = Priority::query()->where('slug', 'critical')->firstOrFail();
Livewire::test(SettingsManager::class)
->call('editPriority', $priority->id)
->set('priorityForm.name', 'Critical Updated')
->call('savePriority')
->assertHasNoErrors();
$this->assertDatabaseHas('helpdesk_priorities', ['id' => $priority->id, 'name' => 'Critical Updated']);
Livewire::test(SettingsManager::class)
->set('categoryForm.name', 'Billing')
->set('categoryForm.slug', 'billing')
->set('categoryForm.color', 'blue')
->call('saveCategory')
->assertHasNoErrors();
$category = Category::query()->where('slug', 'billing')->firstOrFail();
Livewire::test(SettingsManager::class)
->call('editCategory', $category->id)
->set('categoryForm.name', 'Billing Updated')
->call('saveCategory')
->assertHasNoErrors();
$this->assertDatabaseHas('helpdesk_categories', ['id' => $category->id, 'name' => 'Billing Updated']);
Livewire::test(SettingsManager::class)
->set('teamForm.name', 'Second Line')
->set('teamForm.slug', 'second-line')
->set('teamForm.color', 'indigo')
->call('saveTeam')
->assertHasNoErrors();
$team = Team::query()->where('slug', 'second-line')->firstOrFail();
Livewire::test(SettingsManager::class)
->call('editTeam', $team->id)
->set('teamForm.name', 'Second Line Updated')
->call('saveTeam')
->assertHasNoErrors();
$this->assertDatabaseHas('helpdesk_teams', ['id' => $team->id, 'name' => 'Second Line Updated']);
Livewire::test(SettingsManager::class)
->set('projectForm.team_id', $fixtures['team']->id)
->set('projectForm.title', 'Customer Portal')
->set('projectForm.slug', 'customer-portal')
->set('projectForm.color', 'blue')
->call('saveProject')
->assertHasNoErrors();
$project = Project::query()->where('slug', 'customer-portal')->firstOrFail();
Livewire::test(SettingsManager::class)
->call('editProject', $project->id)
->set('projectForm.title', 'Customer Portal Updated')
->call('saveProject')
->assertHasNoErrors();
$this->assertDatabaseHas('helpdesk_projects', ['id' => $project->id, 'title' => 'Customer Portal Updated']);
Livewire::test(SettingsManager::class)
->set('boardForm.name', 'Escalations')
->set('boardForm.slug', 'escalations')
->set('boardForm.sort_order', 30)
->set('boardForm.status_ids', [$fixtures['open']->id, $fixtures['closed']->id])
->call('saveBoard')
->assertHasNoErrors();
$board = KanbanBoard::query()->where('slug', 'escalations')->firstOrFail();
Livewire::test(SettingsManager::class)
->call('editBoard', $board->id)
->set('boardForm.name', 'Escalations Updated')
->call('saveBoard')
->assertHasNoErrors();
$this->assertDatabaseHas('helpdesk_kanban_boards', ['id' => $board->id, 'name' => 'Escalations Updated']);
Livewire::test(SettingsManager::class)
->set('repositoryForm.project_id', $fixtures['project']->id)
->set('repositoryForm.name', 'WMS Core Repo')
->set('repositoryForm.provider', 'github')
->set('repositoryForm.remote_url', 'git@example.com:wms/core.git')
->set('repositoryForm.default_branch', 'main')
->call('saveRepository')
->assertHasNoErrors();
$repository = GitRepository::query()->where('name', 'WMS Core Repo')->firstOrFail();
Livewire::test(SettingsManager::class)
->call('editRepository', $repository->id)
->set('repositoryForm.default_branch', 'develop')
->call('saveRepository')
->assertHasNoErrors();
$this->assertDatabaseHas('helpdesk_git_repositories', ['id' => $repository->id, 'default_branch' => 'develop']);
Livewire::test(SettingsManager::class)
->set('workflowForm.name', 'Ticket Created')
->set('workflowForm.event', 'ticket.created')
->set('workflowForm.subject', 'New ticket')
->set('workflowForm.html_body', '<p>Created</p>')
->set('workflowForm.to_role', 'requester')
->call('saveWorkflowTemplate')
->assertHasNoErrors();
$workflow = WorkflowTemplate::query()->where('name', 'Ticket Created')->firstOrFail();
Livewire::test(SettingsManager::class)
->call('editWorkflowTemplate', $workflow->id)
->set('workflowForm.subject', 'New ticket updated')
->call('saveWorkflowTemplate')
->assertHasNoErrors();
$this->assertDatabaseHas('helpdesk_workflow_templates', ['id' => $workflow->id, 'subject' => 'New ticket updated']);
Livewire::test(SettingsManager::class)
->set('cannedForm.category_id', $fixtures['category']->id)
->set('cannedForm.team_id', $fixtures['team']->id)
->set('cannedForm.name', 'Greeting')
->set('cannedForm.slug', 'greeting')
->set('cannedForm.body', '<p>Hello</p>')
->call('saveCannedResponse')
->assertHasNoErrors();
$canned = CannedResponse::query()->where('slug', 'greeting')->firstOrFail();
Livewire::test(SettingsManager::class)
->call('editCannedResponse', $canned->id)
->set('cannedForm.body', '<p>Hello updated</p>')
->call('saveCannedResponse')
->assertHasNoErrors();
$this->assertDatabaseHas('helpdesk_canned_responses', ['id' => $canned->id, 'body' => '<p>Hello updated</p>']);
Livewire::test(SettingsManager::class)
->set('slaForm.priority_id', $fixtures['normal']->id)
->set('slaForm.category_id', $fixtures['category']->id)
->set('slaForm.name', 'Standard SLA')
->set('slaForm.slug', 'standard-sla')
->set('slaForm.first_response_minutes', 120)
->set('slaForm.resolution_minutes', 1440)
->call('saveSlaPolicy')
->assertHasNoErrors();
$sla = SlaPolicy::query()->where('slug', 'standard-sla')->firstOrFail();
Livewire::test(SettingsManager::class)
->call('editSlaPolicy', $sla->id)
->set('slaForm.resolution_minutes', 720)
->call('saveSlaPolicy')
->assertHasNoErrors();
$this->assertDatabaseHas('helpdesk_sla_policies', ['id' => $sla->id, 'resolution_minutes' => 720]);
Livewire::test(SettingsManager::class)
->set('automationForm.name', 'Auto Route')
->set('automationForm.slug', 'auto-route')
->set('automationForm.set_priority_id', $fixtures['high']->id)
->set('automationForm.set_status_id', $fixtures['open']->id)
->call('saveAutomationRule')
->assertHasNoErrors();
$automation = AutomationRule::query()->where('slug', 'auto-route')->firstOrFail();
Livewire::test(SettingsManager::class)
->call('editAutomationRule', $automation->id)
->set('automationForm.match_subject', 'urgent')
->call('saveAutomationRule')
->assertHasNoErrors();
$this->assertDatabaseHas('helpdesk_automation_rules', ['id' => $automation->id, 'match_subject' => 'urgent']);
Livewire::test(SettingsManager::class)
->set('checklistTemplateForm.category_id', $fixtures['category']->id)
->set('checklistTemplateForm.project_id', $fixtures['project']->id)
->set('checklistTemplateForm.name', 'Release Checklist')
->set('checklistTemplateForm.slug', 'release-checklist')
->set('checklistTemplateForm.items_text', "Check logs\nConfirm release")
->call('saveChecklistTemplate')
->assertHasNoErrors();
$checklist = ChecklistTemplate::query()->where('slug', 'release-checklist')->firstOrFail();
Livewire::test(SettingsManager::class)
->call('editChecklistTemplate', $checklist->id)
->set('checklistTemplateForm.items_text', 'Updated item')
->call('saveChecklistTemplate')
->assertHasNoErrors();
$this->assertDatabaseHas('helpdesk_checklist_templates', ['id' => $checklist->id]);
self::assertSame(['Updated item'], $checklist->refresh()->items);
Livewire::test(SettingsManager::class)
->set('tagForm.name', 'VIP')
->set('tagForm.slug', 'vip')
->set('tagForm.color', 'purple')
->call('saveTag')
->assertHasNoErrors();
$tag = Tag::query()->where('slug', 'vip')->firstOrFail();
Livewire::test(SettingsManager::class)
->call('editTag', $tag->id)
->set('tagForm.color', 'purple')
->call('saveTag')
->assertHasNoErrors();
$this->assertDatabaseHas('helpdesk_tags', ['id' => $tag->id, 'color' => 'purple']);
Livewire::test(SettingsManager::class)
->set('productForm.name', 'WMS')
->set('productForm.slug', 'wms')
->set('productForm.type', 'service')
->call('saveProduct')
->assertHasNoErrors();
$product = Product::query()->where('slug', 'wms')->firstOrFail();
Livewire::test(SettingsManager::class)
->call('editProduct', $product->id)
->set('productForm.version', '1.1')
->call('saveProduct')
->assertHasNoErrors();
$this->assertDatabaseHas('helpdesk_products', ['id' => $product->id, 'version' => '1.1']);
}
public function test_helpdesk_colour_selectors_are_dropdowns_and_reject_unknown_values(): void
{
$this->seedLookupData();
$admin = $this->admin(['name' => 'Colour Settings Admin']);
$this->actingAs($admin);
Livewire::test(SettingsManager::class)
->assertSee('● Red — #dc2626')
->assertSee('● Green — #16a34a')
->set('statusForm.name', 'Invalid Colour')
->set('statusForm.slug', 'invalid-colour')
->set('statusForm.color', 'brown')
->set('statusForm.sort_order', 99)
->call('saveStatus')
->assertHasErrors(['statusForm.color']);
}
}