diff --git a/src/Symfony/Component/Notifier/Bridge/Slack/Block/SlackHeaderBlock.php b/src/Symfony/Component/Notifier/Bridge/Slack/Block/SlackHeaderBlock.php new file mode 100644 index 0000000000..c958962f1b --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Slack/Block/SlackHeaderBlock.php @@ -0,0 +1,51 @@ + + * + * 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; + +use Symfony\Component\Notifier\Exception\LogicException; + +/** + * @author Tomas Norkūnas + * + * @experimental in 5.3 + */ +final class SlackHeaderBlock extends AbstractSlackBlock +{ + private const TEXT_LIMIT = 150; + private const ID_LIMIT = 255; + + public function __construct(string $text) + { + if (\strlen($text) > self::TEXT_LIMIT) { + throw new LogicException(sprintf('Maximum length for the text is %d characters.', self::TEXT_LIMIT)); + } + + $this->options = [ + 'type' => 'header', + 'text' => [ + 'type' => 'plain_text', + 'text' => $text, + ], + ]; + } + + public function id(string $id): self + { + if (\strlen($id) > self::ID_LIMIT) { + throw new LogicException(sprintf('Maximum length for the block id is %d characters.', self::ID_LIMIT)); + } + + $this->options['block_id'] = $id; + + return $this; + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/Slack/CHANGELOG.md b/src/Symfony/Component/Notifier/Bridge/Slack/CHANGELOG.md index b860fa08db..650a09bc1e 100644 --- a/src/Symfony/Component/Notifier/Bridge/Slack/CHANGELOG.md +++ b/src/Symfony/Component/Notifier/Bridge/Slack/CHANGELOG.md @@ -5,6 +5,7 @@ CHANGELOG ----- * Check for maximum number of buttons in Slack action block + * Add HeaderBlock 5.2.0 ----- diff --git a/src/Symfony/Component/Notifier/Bridge/Slack/Tests/Block/SlackHeaderBlockTest.php b/src/Symfony/Component/Notifier/Bridge/Slack/Tests/Block/SlackHeaderBlockTest.php new file mode 100644 index 0000000000..c899b1822c --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Slack/Tests/Block/SlackHeaderBlockTest.php @@ -0,0 +1,51 @@ + + * + * 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\Tests\Block; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Notifier\Bridge\Slack\Block\SlackHeaderBlock; +use Symfony\Component\Notifier\Exception\LogicException; + +final class SlackHeaderBlockTest extends TestCase +{ + public function testCanBeInstantiated(): void + { + $header = new SlackHeaderBlock('header text'); + $header->id('header_id'); + + $this->assertSame([ + 'type' => 'header', + 'text' => [ + 'type' => 'plain_text', + 'text' => 'header text', + ], + 'block_id' => 'header_id', + ], $header->toArray()); + } + + public function testThrowsWhenTextExceedsCharacterLimit(): void + { + $this->expectException(LogicException::class); + $this->expectExceptionMessage('Maximum length for the text is 150 characters.'); + + new SlackHeaderBlock(str_repeat('h', 151)); + } + + public function testThrowsWhenBlockIdExceedsCharacterLimit(): void + { + $this->expectException(LogicException::class); + $this->expectExceptionMessage('Maximum length for the block id is 255 characters.'); + + $header = new SlackHeaderBlock('header'); + $header->id(str_repeat('h', 256)); + } +}