workign comments strucuture

This commit is contained in:
Mark Gregory
2026-06-17 09:47:24 +01:00
parent 2df11f9f58
commit 878f383f7a
7 changed files with 222 additions and 70 deletions
@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace Modules\Helpdesk\Tests\Browser;
use Laravel\Dusk\Browser;
use Modules\Helpdesk\Models\CannedResponse;
use Modules\Helpdesk\Models\Comment;
use Modules\Helpdesk\Tests\Concerns\BuildsHelpdeskFixtures;
use Tests\DuskTestCase;
@@ -57,29 +58,59 @@ final class HelpdeskTicketBrowserTest extends DuskTestCase
'subject' => 'Browser response ticket',
]);
$this->browse(function (Browser $browser) use ($user, $ticket): void {
$cannedResponse = CannedResponse::query()->create([
'name' => 'Browser canned response',
'slug' => 'browser-canned-response',
'visibility' => 'agents',
'body' => 'Inserted canned browser response',
'is_active' => true,
'sort_order' => 1,
]);
$this->browse(function (Browser $browser) use ($user, $ticket, $cannedResponse): void {
$browser->loginAs($user)
->visitRoute('helpdesk.tickets.show', $ticket)
->waitFor('@helpdesk-ticket-show')
->assertSee('Browser response ticket');
$this->setHelpdeskEditor($browser, 'ticket-comment-editor', '<p>First browser response</p>');
$browser->pause(1000)
->assertSee('Browser response ticket')
->select('canned_response_id', (string) $cannedResponse->id)
->press('@insert-canned-response')
->assertInputValue('commentBody', 'Inserted canned browser response')
->type('@ticket-comment-editor', 'First browser response')
->press('@post-comment')
->waitForLocation(route('helpdesk.tickets.show', $ticket, false), 10)
->waitForText('First browser response', 10)
->assertSee('First browser response');
$this->assertDatabaseHas('helpdesk_comments', [
'ticket_id' => $ticket->id,
'user_id' => $user->id,
'body' => '<p>First browser response</p>',
'is_internal' => false,
]);
$comment = Comment::query()
->where('ticket_id', $ticket->id)
->whereNull('parent_id')
->where('body', 'First browser response')
->firstOrFail();
self::assertSame(1, Comment::query()->where('ticket_id', $ticket->id)->count());
$browser->press('@reply-to-comment-'.$comment->id)
->waitFor('@reply-body-'.$comment->id)
->type('@reply-body-'.$comment->id, 'Nested browser response')
->press('@post-reply-'.$comment->id)
->waitForText('Nested browser response', 10)
->assertSee('Nested browser response');
});
$this->assertDatabaseHas('helpdesk_comments', [
'ticket_id' => $ticket->id,
'parent_id' => null,
'body' => 'First browser response',
]);
$parentId = Comment::query()
->where('ticket_id', $ticket->id)
->whereNull('parent_id')
->where('body', 'First browser response')
->value('id');
$this->assertDatabaseHas('helpdesk_comments', [
'ticket_id' => $ticket->id,
'parent_id' => $parentId,
'body' => 'Nested browser response',
]);
}
private function setHelpdeskEditor(Browser $browser, string $dusk, string $html): void
@@ -96,22 +127,27 @@ if (! root) {
throw new Error('Helpdesk editor ' + key + ' was not found.');
}
const editor = root.matches('[contenteditable="true"]')
const editor = root.matches('textarea, input, [contenteditable="true"]')
? root
: root.querySelector('[contenteditable="true"]');
: root.querySelector('textarea, input, [contenteditable="true"]');
if (! editor) {
throw new Error('Helpdesk editor content area ' + key + ' was not found.');
}
editor.focus();
editor.innerHTML = html;
if (editor.matches('textarea, input')) {
editor.value = html.replace(/^<p>/, '').replace(/<\/p>$/, '');
} else {
editor.innerHTML = html;
}
editor.dispatchEvent(new InputEvent('input', {
bubbles: true,
composed: true,
inputType: 'insertText',
data: editor.textContent || ' ',
data: editor.value || editor.textContent || ' ',
}));
editor.dispatchEvent(new Event('change', { bubbles: true, composed: true }));