Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 24 additions & 1 deletion includes/Services/TicketService.php
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
66 changes: 66 additions & 0 deletions tests/Test_Ticket_Service.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
// =========================================================================
Expand Down
Loading