diff --git a/includes/Services/TicketService.php b/includes/Services/TicketService.php index 37a625b..67bff27 100644 --- a/includes/Services/TicketService.php +++ b/includes/Services/TicketService.php @@ -70,9 +70,32 @@ public function create_guest(array $data): object $priority = $data['priority'] ?? \Escalated\Models\Setting::get('default_priority', 'medium'); $valid_priorities = array_keys(\Escalated\Helpers\Enums::ticket_priorities()); + // Apply the admin-configured guest policy from the + // public-tickets settings page. Persisted under three keys: + // - guest_policy_mode: unassigned | guest_user | prompt_signup + // - guest_policy_user_id: WordPress user id for guest_user mode + // - guest_policy_signup_url_template: for prompt_signup mode + // + // Modes: + // - unassigned (default): requester_id = null + // - guest_user: requester_id = configured shared WordPress user + // - prompt_signup: same as unassigned for ticket creation; + // signup-invite emission is a listener-level follow-up + // + // Misconfigured guest_user (zero/missing id) falls through to + // unassigned so bad admin input can't 500 public submissions. + $requester_id = null; + $policy_mode = \Escalated\Models\Setting::get('guest_policy_mode', 'unassigned'); + if ($policy_mode === 'guest_user') { + $guest_user_id = (int) \Escalated\Models\Setting::get('guest_policy_user_id', 0); + if ($guest_user_id > 0) { + $requester_id = $guest_user_id; + } + } + $ticket_data = [ 'reference' => $reference, - 'requester_id' => null, + 'requester_id' => $requester_id, 'subject' => sanitize_text_field($data['subject']), 'description' => wp_kses_post($data['description']), 'status' => 'open', diff --git a/tests/Test_Ticket_Service.php b/tests/Test_Ticket_Service.php index 7991c39..bdf711e 100644 --- a/tests/Test_Ticket_Service.php +++ b/tests/Test_Ticket_Service.php @@ -192,6 +192,72 @@ public function test_guest_ticket_findable_by_token(): void $this->assertEquals($ticket->id, $found->id); } + // Guest-policy wiring tests — the admin settings page writes three + // keys that create_guest() must read so the setting has actual + // behavioral effect. + + public function test_create_guest_defaults_to_unassigned_mode(): void + { + // No setting written → default behavior (requester_id null). + $ticket = $this->service->create_guest([ + 'subject' => 'Default mode', + 'description' => 'd', + 'guest_name' => 'Alice', + 'guest_email' => 'alice@example.com', + ]); + + $this->assertNull($ticket->requester_id); + $this->assertEquals('alice@example.com', $ticket->guest_email); + } + + public function test_create_guest_routes_to_host_user_in_guest_user_mode(): void + { + $user_id = self::factory()->user->create(['user_email' => 'support@site.test']); + \Escalated\Models\Setting::set('guest_policy_mode', 'guest_user'); + \Escalated\Models\Setting::set('guest_policy_user_id', (string) $user_id); + + $ticket = $this->service->create_guest([ + 'subject' => 'Guest user mode', + 'description' => 'd', + 'guest_name' => 'Bob', + 'guest_email' => 'bob@example.com', + ]); + + $this->assertEquals($user_id, (int) $ticket->requester_id); + // guest_email is still recorded so agents see who submitted. + $this->assertEquals('bob@example.com', $ticket->guest_email); + } + + public function test_create_guest_falls_through_when_guest_user_id_missing(): void + { + \Escalated\Models\Setting::set('guest_policy_mode', 'guest_user'); + \Escalated\Models\Setting::set('guest_policy_user_id', '0'); + + $ticket = $this->service->create_guest([ + 'subject' => 'Misconfigured guest_user', + 'description' => 'd', + 'guest_name' => 'Charlie', + 'guest_email' => 'charlie@example.com', + ]); + + $this->assertNull($ticket->requester_id); + } + + public function test_create_guest_prompt_signup_uses_unassigned_path(): void + { + \Escalated\Models\Setting::set('guest_policy_mode', 'prompt_signup'); + + $ticket = $this->service->create_guest([ + 'subject' => 'Signup prompt mode', + 'description' => 'd', + 'guest_name' => 'Dana', + 'guest_email' => 'dana@example.com', + ]); + + $this->assertNull($ticket->requester_id); + $this->assertEquals('dana@example.com', $ticket->guest_email); + } + // ========================================================================= // Update Tests // =========================================================================