From 291bcf168451d99e7fe30e8b5897c008c4b632f9 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Tue, 3 Sep 2024 11:37:41 +0300 Subject: [PATCH] note replace app link fix --- application/Espo/Tools/Stream/NoteUtil.php | 6 +- tests/unit/Espo/Tools/Stream/NoteUtilTest.php | 86 +++++++++++++++++++ 2 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 tests/unit/Espo/Tools/Stream/NoteUtilTest.php diff --git a/application/Espo/Tools/Stream/NoteUtil.php b/application/Espo/Tools/Stream/NoteUtil.php index 745e8ad72e..86f9537eed 100644 --- a/application/Espo/Tools/Stream/NoteUtil.php +++ b/application/Espo/Tools/Stream/NoteUtil.php @@ -51,11 +51,11 @@ class NoteUtil // PhpStorm inspection highlights RegExpRedundantEscape by a mistake. /** @noinspection RegExpRedundantEscape */ - $regexp = '/' . preg_quote($siteUrl, '/') . + $regexp = '/(\s|^)' . preg_quote($siteUrl, '/') . '(\/portal|\/portal\/[a-zA-Z0-9]*)?\/#([A-Z][a-zA-Z0-9]*)\/view\/([a-zA-Z0-9-]*)/'; - $post = preg_replace($regexp, '[\2/\3](#\2/view/\3)', $post); + $post = preg_replace($regexp, '\1[\3/\4](#\3/view/\4)', $post); - $entity->set('post', $post); + $entity->setPost($post); } } diff --git a/tests/unit/Espo/Tools/Stream/NoteUtilTest.php b/tests/unit/Espo/Tools/Stream/NoteUtilTest.php new file mode 100644 index 0000000000..16e22b9fd1 --- /dev/null +++ b/tests/unit/Espo/Tools/Stream/NoteUtilTest.php @@ -0,0 +1,86 @@ +. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. + ************************************************************************/ + +namespace tests\unit\Espo\Tools\Stream; + +use Espo\Core\Utils\Config; +use Espo\Entities\Note; +use Espo\Tools\Stream\NoteUtil; +use PHPUnit\Framework\TestCase; + +class NoteUtilTest extends TestCase +{ + public function testLink(): void + { + $post = "https://site.com/#Account/view/100 https://site.com/#Account/view/100"; + $newPost = "[Account/100](#Account/view/100) [Account/100](#Account/view/100)"; + + $this->initText($post, $newPost); + + $post = " https://site.com/#Account/view/100"; + $newPost = " [Account/100](#Account/view/100)"; + + $this->initText($post, $newPost); + + $post = "\nhttps://site.com/#Account/view/100"; + $newPost = "\n[Account/100](#Account/view/100)"; + + $this->initText($post, $newPost); + } + + public function testLinkWrapped(): void + { + $post = "[Test](https://site.com/#Account/view/100) https://site.com/#Account/view/100"; + $newPost = "[Test](https://site.com/#Account/view/100) [Account/100](#Account/view/100)"; + + $this->initText($post, $newPost); + } + + private function initText(string $post, string $newPost): void + { + $config = $this->createMock(Config::class); + $note = $this->createMock(Note::class); + + $config->expects($this->once()) + ->method('getSiteUrl') + ->willReturn('https://site.com'); + + $util = new NoteUtil($config); + + $note->expects($this->once()) + ->method('getPost') + ->willReturn($post); + + $note->expects($this->once()) + ->method('setPost') + ->with($newPost); + + $util->handlePostText($note); + } +}