From 5e6db9e47a840687aad674eb3ba624372cc32ec8 Mon Sep 17 00:00:00 2001 From: camilleislasse Date: Thu, 1 May 2025 12:04:58 +0200 Subject: [PATCH 1/4] Add SlackPlainTextInputBlock for Slack message customization - Implemented SlackPlainTextInputBlock class to add a plain text input field to Slack messages. - Created tests for SlackPlainTextInputBlock to ensure proper functionality, including label, action ID, and placeholder validation. - Updated README with usage example for adding a plain text input to a Slack message. --- .../Slack/Block/SlackPlainTextInputBlock.php | 44 +++++++++++++ .../Component/Notifier/Bridge/Slack/README.md | 22 +++++++ .../Block/SlackPlainTextInputBlockTest.php | 66 +++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 src/Symfony/Component/Notifier/Bridge/Slack/Block/SlackPlainTextInputBlock.php create mode 100644 src/Symfony/Component/Notifier/Bridge/Slack/Tests/Block/SlackPlainTextInputBlockTest.php diff --git a/src/Symfony/Component/Notifier/Bridge/Slack/Block/SlackPlainTextInputBlock.php b/src/Symfony/Component/Notifier/Bridge/Slack/Block/SlackPlainTextInputBlock.php new file mode 100644 index 0000000000000..09266b6176ecd --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Slack/Block/SlackPlainTextInputBlock.php @@ -0,0 +1,44 @@ + self::LABEL_LIMIT) { + throw new \LengthException(\sprintf('Maximum length for the label text is %d characters.', self::LABEL_LIMIT)); + } + + if (\strlen($actionId) > self::ACTION_ID_LIMIT) { + throw new \LengthException(\sprintf('Maximum length for the action ID is %d characters.', self::ACTION_ID_LIMIT)); + } + + if ($placeholderText && \strlen($placeholderText) > self::PLACEHOLDER_LIMIT) { + throw new \LengthException(\sprintf('Maximum length for the placeholder text is %d characters.', self::PLACEHOLDER_LIMIT)); + } + $this->options = [ + 'type' => 'input', + 'element' => [ + 'type' => 'plain_text_input', + 'action_id' => $actionId, + ], + 'label' => [ + 'type' => 'plain_text', + 'text' => $labelText, + ], + ]; + + if ($placeholderText) { + $this->options['element']['placeholder'] = [ + 'type' => 'plain_text', + 'text' => $placeholderText, + ]; + } + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/Slack/README.md b/src/Symfony/Component/Notifier/Bridge/Slack/README.md index 5e260b534e910..acf715804a7b5 100644 --- a/src/Symfony/Component/Notifier/Bridge/Slack/README.md +++ b/src/Symfony/Component/Notifier/Bridge/Slack/README.md @@ -241,6 +241,28 @@ $chatMessage->options($options); $chatter->send($chatMessage); ``` +Adding a Plain Text Input to a Message +---------------------------- +To add a simple text input field to your Slack message, use the `SlackPlainTextInputBlock` class. +```php + +use Symfony\Component\Notifier\Bridge\Slack\Block\SlackPlainTextInputBlock; +use Symfony\Component\Notifier\Bridge\Slack\SlackOptions; +use Symfony\Component\Notifier\Message\ChatMessage; + +$chatMessage = new ChatMessage('Enter your feedback'); + +$options = (new SlackOptions()) +->block( +new SlackPlainTextInputBlock('Your Feedback', 'feedback_action_id', 'Type your feedback here...') +); + +// Add the custom options to the chat message and send the message +$chatMessage->options($options); + +$chatter->send($chatMessage); +``` + Sending a Message as a Reply ---------------------------- diff --git a/src/Symfony/Component/Notifier/Bridge/Slack/Tests/Block/SlackPlainTextInputBlockTest.php b/src/Symfony/Component/Notifier/Bridge/Slack/Tests/Block/SlackPlainTextInputBlockTest.php new file mode 100644 index 0000000000000..007a4640e9b56 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Slack/Tests/Block/SlackPlainTextInputBlockTest.php @@ -0,0 +1,66 @@ +assertSame([ + 'type' => 'input', + 'element' => [ + 'type' => 'plain_text_input', + 'action_id' => 'time_spent_input', + 'placeholder' => [ + 'type' => 'plain_text', + 'text' => 'Enter some text here', + ], + ], + 'label' => [ + 'type' => 'plain_text', + 'text' => 'Time spent', + ], + ], $block->toArray()); + } + + public function testCanBeInstantiatedWithoutPlaceholder() + { + $block = new SlackPlainTextInputBlock('Time spent', 'time_spent_input'); + $this->assertSame([ + 'type' => 'input', + 'element' => [ + 'type' => 'plain_text_input', + 'action_id' => 'time_spent_input', + ], + 'label' => [ + 'type' => 'plain_text', + 'text' => 'Time spent', + ], + ], $block->toArray()); + } + + public function testThrowsWhenLabelExceedsCharacterLimit() + { + $this->expectException(\LengthException::class); + $this->expectExceptionMessage('Maximum length for the label text is 150 characters.'); + new SlackPlainTextInputBlock(str_repeat('a', 151), 'time_spent_input'); + } + + public function testThrowsWhenActionIdExceedsCharacterLimit() + { + $this->expectException(\LengthException::class); + $this->expectExceptionMessage('Maximum length for the action ID is 255 characters.'); + new SlackPlainTextInputBlock('Time spent', str_repeat('a', 256)); + } + + public function testThrowsWhenPlaceholderExceedsCharacterLimit() + { + $this->expectException(\LengthException::class); + $this->expectExceptionMessage('Maximum length for the placeholder text is 150 characters.'); + new SlackPlainTextInputBlock('Time spent', 'time_spent_input', str_repeat('a', 151)); + } +} From a4c68dfc9f8f80ab3dc9d4005bd55d676ef057cd Mon Sep 17 00:00:00 2001 From: camilleislasse Date: Thu, 1 May 2025 12:24:26 +0200 Subject: [PATCH 2/4] Fix README formatting by adjusting line breaks --- src/Symfony/Component/Notifier/Bridge/Slack/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Notifier/Bridge/Slack/README.md b/src/Symfony/Component/Notifier/Bridge/Slack/README.md index acf715804a7b5..5c03b588ddea4 100644 --- a/src/Symfony/Component/Notifier/Bridge/Slack/README.md +++ b/src/Symfony/Component/Notifier/Bridge/Slack/README.md @@ -241,11 +241,11 @@ $chatMessage->options($options); $chatter->send($chatMessage); ``` + Adding a Plain Text Input to a Message ---------------------------- To add a simple text input field to your Slack message, use the `SlackPlainTextInputBlock` class. ```php - use Symfony\Component\Notifier\Bridge\Slack\Block\SlackPlainTextInputBlock; use Symfony\Component\Notifier\Bridge\Slack\SlackOptions; use Symfony\Component\Notifier\Message\ChatMessage; From fd6340ef90e90b47af620cefd606cb75847deacd Mon Sep 17 00:00:00 2001 From: camilleislasse Date: Thu, 1 May 2025 12:36:17 +0200 Subject: [PATCH 3/4] License Headers --- .../Bridge/Slack/Block/SlackPlainTextInputBlock.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Notifier/Bridge/Slack/Block/SlackPlainTextInputBlock.php b/src/Symfony/Component/Notifier/Bridge/Slack/Block/SlackPlainTextInputBlock.php index 09266b6176ecd..22fcdcd3545ae 100644 --- a/src/Symfony/Component/Notifier/Bridge/Slack/Block/SlackPlainTextInputBlock.php +++ b/src/Symfony/Component/Notifier/Bridge/Slack/Block/SlackPlainTextInputBlock.php @@ -1,7 +1,15 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Symfony\Component\Notifier\Bridge\Slack\Block; final class SlackPlainTextInputBlock extends AbstractSlackBlock { From 0af771d3d1b6be5c78d640d86b8335ac490ed934 Mon Sep 17 00:00:00 2001 From: camilleislasse Date: Fri, 2 May 2025 10:10:18 +0200 Subject: [PATCH 4/4] Add a testcase where this block is used in the transport --- .../Bridge/Slack/Tests/SlackTransportTest.php | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/Symfony/Component/Notifier/Bridge/Slack/Tests/SlackTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Slack/Tests/SlackTransportTest.php index b0a54d5e0c611..9add78d0498eb 100644 --- a/src/Symfony/Component/Notifier/Bridge/Slack/Tests/SlackTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Slack/Tests/SlackTransportTest.php @@ -12,6 +12,8 @@ namespace Symfony\Component\Notifier\Bridge\Slack\Tests; use Symfony\Component\HttpClient\MockHttpClient; +use Symfony\Component\Notifier\Bridge\Slack\Block\SlackPlainTextInputBlock; +use Symfony\Component\Notifier\Bridge\Slack\Block\SlackSectionBlock; use Symfony\Component\Notifier\Bridge\Slack\SlackOptions; use Symfony\Component\Notifier\Bridge\Slack\SlackSentMessage; use Symfony\Component\Notifier\Bridge\Slack\SlackTransport; @@ -330,4 +332,44 @@ public function testUpdateMessage() $this->assertSame('1503435956.000247', $sentMessage->getMessageId()); } + + public function testSlackTransportSendsMessageWithInputBlock() + { + $channel = 'testChannel'; + $message = 'testMessage'; + + $response = $this->createMock(ResponseInterface::class); + + $response->expects($this->exactly(2)) + ->method('getStatusCode') + ->willReturn(200); + + $response->expects($this->once()) + ->method('getContent') + ->willReturn(json_encode(['ok' => true, 'ts' => '1503435956.000247', 'channel' => 'C123456'])); + + $options = new SlackOptions(); + + $options->block((new SlackSectionBlock())->text($message)); + + $options->block((new SlackPlainTextInputBlock('Time spent', 'time_spent_input', 'Enter some text here'))); + + $expectedBody = json_encode([ + 'blocks' => $options->toArray()['blocks'], + 'channel' => $channel, + 'text' => $message, + ]); + + $client = new MockHttpClient(function (string $method, string $url, array $options = []) use ($response, $expectedBody): ResponseInterface { + $this->assertJsonStringEqualsJsonString($expectedBody, $options['body']); + + return $response; + }); + + $transport = self::createTransport($client, $channel); + + $sentMessage = $transport->send(new ChatMessage('testMessage', $options)); + + $this->assertSame('1503435956.000247', $sentMessage->getMessageId()); + } }