Hello Name'; $data = [ ['id' => '123', 'value' => 'John Doe'] ]; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('
Hello John Doe
'); }); it('uses fallback when value is not found', function () { $content = 'Name'; $data = []; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('Guest'); }); it('removes the element when no value and no fallback is provided', function () { $content = '
Hello Name!
'; $data = []; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('
Hello !
'); }); it('supports mention="true" syntax', function () { $content = '

Hello Full Name

'; $data = [ ['id' => '123', 'value' => 'John Doe'] ]; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('

Hello John Doe

'); }); describe('parseAsText', function () { it('converts HTML to plain text with proper line breaks', function () { $content = '
First line
Second line
'; $parser = new MentionParser($content, []); $result = $parser->parseAsText(); expect($result)->toBe("First line\nSecond line"); }); it('handles email addresses with proper line breaks', function () { $content = 'Email
john@example.com
'; $data = [ ['id' => '123', 'value' => 'jane@example.com'] ]; $parser = new MentionParser($content, $data); $result = $parser->parseAsText(); expect($result)->toBe("jane@example.com\njohn@example.com"); }); it('handles multiple mentions and complex HTML structure', function () { $content = '
Contact: Email1
CC: Email2
Additional: test@example.com
'; $data = [ ['id' => '123', 'value' => 'primary@example.com'], ['id' => '456', 'value' => 'secondary@example.com'], ]; $parser = new MentionParser($content, $data); $result = $parser->parseAsText(); expect($result)->toBe( "Contact: primary@example.com\n" . "CC: secondary@example.com\n" . "Additional: test@example.com" ); }); it('handles array values in mentions', function () { $content = 'Emails'; $data = [ ['id' => '123', 'value' => ['first@test.com', 'second@test.com']] ]; $parser = new MentionParser($content, $data); $result = $parser->parseAsText(); expect($result)->toBe('first@test.com, second@test.com'); }); }); test('it replaces mention elements with their corresponding values', function () { $content = '

Hello Placeholder

'; $data = [['id' => '123', 'value' => 'World']]; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('

Hello World

'); }); test('it handles multiple mentions', function () { $content = '

Name is Age years old

'; $data = [ ['id' => '123', 'value' => 'John'], ['id' => '456', 'value' => 30], ]; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('

John is 30 years old

'); }); test('it uses fallback when value is not found', function () { $content = '

Hello Placeholder

'; $data = []; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('

Hello Friend

'); }); test('it removes mention element when no value and no fallback', function () { $content = '

Hello Placeholder

'; $data = []; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('

Hello

'); }); test('it handles array values', function () { $content = '

Tags: Placeholder

'; $data = [['id' => '123', 'value' => ['PHP', 'Laravel', 'Testing']]]; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('

Tags: PHP, Laravel, Testing

'); }); test('it supports mention="true" attributes', function () { $content = '

Hello Full Name

'; $data = [['id' => '123', 'value' => 'John Doe']]; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('

Hello John Doe

'); }); test('it handles multiple mentions with mention="true" syntax', function () { $content = '

Name and Title

'; $data = [ ['id' => '123', 'value' => 'John Doe'], ['id' => '456', 'value' => 'Developer'], ]; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('

John Doe and Developer

'); }); test('it preserves HTML structure', function () { $content = '

Hello Placeholder

How are you?

'; $data = [['id' => '123', 'value' => 'World']]; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('

Hello World

How are you?

'); }); test('it handles UTF-8 characters', function () { $content = '

こんにちは Placeholder

'; $data = [['id' => '123', 'value' => '世界']]; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('

こんにちは 世界

'); }); test('it handles content without surrounding paragraph tags', function () { $content = 'some text Post excerpt dewde'; $data = [['id' => '123', 'value' => 'replaced text']]; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('some text replaced text dewde'); }); test('it handles URL-encoded field IDs', function () { $content = '

Hello Full Name

'; $data = [['id' => '%3ARGE', 'value' => 'John Doe']]; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('

Hello John Doe

'); }); test('it handles URL-encoded field IDs with mention="true" syntax', function () { $content = '

Hello Full Name

'; $data = [['id' => '%3ARGE', 'value' => 'John Doe']]; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('

Hello John Doe

'); }); test('it handles multiple mentions with URL-encoded IDs and mention="true" syntax', function () { $content = '

Full Name and Phone

'; $data = [ ['id' => '%3ARGE', 'value' => 'John Doe'], ['id' => 'V%7D%40S', 'value' => '123-456-7890'], ]; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('

John Doe and 123-456-7890

'); }); test('it recreates real-world example with URL-encoded IDs', function () { $content = '

Hello there 👋

This is a confirmation that your submission was successfully saved.

Full NameContact FormPhone Number

'; $data = [ ['id' => '%3ARGE', 'value' => 'jujujujuju'], ['id' => 'title', 'value' => 'jujuuj'], ['id' => 'V%7D%40S', 'value' => '555-1234'], ]; $parser = new MentionParser($content, $data); $result = $parser->parse(); expect($result)->toBe('

Hello there 👋

This is a confirmation that your submission was successfully saved.

jujujujujujujuuj555-1234

'); }); describe('urlFriendlyOutput', function () { test('it encodes special characters in values', function () { $content = '

Test: Placeholder

'; $data = [['id' => '123', 'value' => 'Hello & World']]; $parser = new MentionParser($content, $data); $result = $parser->urlFriendlyOutput()->parse(); expect($result)->toBe('

Test: Hello+%26+World

'); }); test('it encodes spaces in values', function () { $content = '

Name: Placeholder

'; $data = [['id' => '123', 'value' => 'John Doe']]; $parser = new MentionParser($content, $data); $result = $parser->urlFriendlyOutput()->parse(); expect($result)->toBe('

Name: John+Doe

'); }); test('it encodes array values', function () { $content = '

Tags: Placeholder

'; $data = [['id' => '123', 'value' => ['Web & Mobile', 'PHP/Laravel']]]; $parser = new MentionParser($content, $data); $result = $parser->urlFriendlyOutput()->parse(); expect($result)->toBe('

Tags: Web+%26+Mobile,+PHP%2FLaravel

'); }); test('it can be disabled explicitly', function () { $content = '

Test: Placeholder

'; $data = [['id' => '123', 'value' => 'Hello & World']]; $parser = new MentionParser($content, $data); $result = $parser->urlFriendlyOutput(false)->parse(); expect($result)->toBe('

Test: Hello & World

'); }); }); });