Add keyboard markup tests and constructors to objects

This commit is contained in:
netkas 2024-10-09 17:50:57 -04:00
parent 560721ffc8
commit 0298049ca2
5 changed files with 255 additions and 13 deletions

View file

@ -11,6 +11,16 @@
private ?string $inline_field_placeholder;
private bool $selective;
/**
* ForceReply constructor.
*/
public function __construct()
{
$this->force_reply = false;
$this->inline_field_placeholder = null;
$this->selective = false;
}
/**
* Shows reply interface to the user, as if they manually selected the bot's message and tapped 'Reply'
*

View file

@ -15,6 +15,20 @@
private ?KeyboardButtonPollType $request_poll;
private ?WebAppInfo $web_app;
/**
* KeyboardButton constructor.
*/
public function __construct()
{
$this->text = (string) null;
$this->request_user = null;
$this->request_chat = null;
$this->request_contact = false;
$this->request_location = false;
$this->request_poll = null;
$this->web_app = null;
}
/**
* Text of the button. If none of the optional fields are used, it will be sent as a message when the
* button is pressed
@ -26,6 +40,18 @@
return $this->text;
}
/**
* Set the text of the button
*
* @param string $text
* @return KeyboardButton
*/
public function setText(string $text): KeyboardButton
{
$this->text = $text;
return $this;
}
/**
* Optional. If specified, pressing the button will open a list of suitable users. Tapping on any user will
* send their identifier to the bot in a “user_shared” service message. Available in private chats only.
@ -37,6 +63,18 @@
return $this->request_user;
}
/**
* Set the request user
*
* @param KeyboardButtonRequestUser $request_user
* @return KeyboardButton
*/
public function setRequestUser(KeyboardButtonRequestUser $request_user): KeyboardButton
{
$this->request_user = $request_user;
return $this;
}
/**
* Optional. If specified, pressing the button will open a list of suitable chats. Tapping on a chat will send
* its identifier to the bot in a “chat_shared” service message. Available in private chats only.
@ -48,6 +86,18 @@
return $this->request_chat;
}
/**
* Set the request chat
*
* @param KeyboardButtonRequestChat $request_chat
* @return KeyboardButton
*/
public function setRequestChat(KeyboardButtonRequestChat $request_chat): KeyboardButton
{
$this->request_chat = $request_chat;
return $this;
}
/**
* Optional. If True, the user's phone number will be sent as a contact when the button is pressed.
* Available in private chats only.
@ -59,6 +109,18 @@
return $this->request_contact;
}
/**
* Set the request contact
*
* @param bool $request_contact
* @return KeyboardButton
*/
public function setRequestContact(bool $request_contact): KeyboardButton
{
$this->request_contact = $request_contact;
return $this;
}
/**
* Optional. If True, the user's current location will be sent when the button is pressed.
* Available in private chats only.
@ -70,6 +132,18 @@
return $this->request_location;
}
/**
* Set the request location
*
* @param bool $request_location
* @return KeyboardButton
*/
public function setRequestLocation(bool $request_location): KeyboardButton
{
$this->request_location = $request_location;
return $this;
}
/**
* Optional. If specified, the user will be asked to create a poll and send it to the bot when the button
* is pressed. Available in private chats only.
@ -81,6 +155,18 @@
return $this->request_poll;
}
/**
* Set the request poll
*
* @param KeyboardButtonPollType $request_poll
* @return KeyboardButton
*/
public function setRequestPoll(KeyboardButtonPollType $request_poll): KeyboardButton
{
$this->request_poll = $request_poll;
return $this;
}
/**
* Optional. If specified, the described Web App will be launched when the button is pressed. The
* Web App will be able to send a “web_app_data” service message. Available in private chats only.
@ -93,6 +179,18 @@
return $this->web_app;
}
/**
* Set the web app
*
* @param WebAppInfo $web_app
* @return KeyboardButton
*/
public function setWebApp(WebAppInfo $web_app): KeyboardButton
{
$this->web_app = $web_app;
return $this;
}
/**
* Returns an array representation of the object
*
@ -100,15 +198,41 @@
*/
public function toArray(): array
{
return [
$array = [
'text' => $this->text,
'request_user' => $this->request_user?->toArray(),
'request_chat' => $this->request_chat?->toArray(),
'request_contact' => $this->request_contact,
'request_location' => $this->request_location,
'request_poll' => $this->request_poll?->toArray(),
'web_app' => $this->web_app?->toArray(),
];
if($this->request_user !== null)
{
$array['request_user'] = $this->request_user->toArray();
}
if($this->request_chat !== null)
{
$array['request_chat'] = $this->request_chat->toArray();
}
if($this->request_contact !== false)
{
$array['request_contact'] = $this->request_contact;
}
if($this->request_location !== false)
{
$array['request_location'] = $this->request_location;
}
if($this->request_poll !== null)
{
$array['request_poll'] = $this->request_poll->toArray();
}
if($this->web_app !== null)
{
$array['web_app'] = $this->web_app->toArray();
}
return $array;
}
/**
@ -125,8 +249,8 @@
$object->text = $data['text'] ?? null;
$object->request_user = isset($data['request_user']) ? KeyboardButtonRequestUser::fromArray($data['request_user']) : null;
$object->request_chat = isset($data['request_chat']) ? KeyboardButtonRequestChat::fromArray($data['request_chat']) : null;
$object->request_contact = $data['request_contact'] ?? null;
$object->request_location = $data['request_location'] ?? null;
$object->request_contact = $data['request_contact'] ?? false;
$object->request_location = $data['request_location'] ?? false;
$object->request_poll = isset($data['request_poll']) ? KeyboardButtonPollType::fromArray($data['request_poll']) : null;
$object->web_app = isset($data['web_app']) ? WebAppInfo::fromArray($data['web_app']) : null;

View file

@ -236,18 +236,26 @@
public function toArray(): array
{
$array = [
'keyboard' => $this->keyboard,
'is_persistent' => $this->is_persistent,
'resize_keyboard' => $this->resize_keyboard,
'one_time_keyboard' => $this->one_time_keyboard,
'input_field_placeholder' => $this->input_field_placeholder,
'selective' => $this->selective
];
if($this->input_field_placeholder !== null)
$keyboard = [];
foreach($this->keyboard as $row)
{
$array['input_field_placeholder'] = $this->input_field_placeholder;
$buttonRow = [];
foreach($row as $button)
{
$buttonRow[] = $button->toArray();
}
$keyboard[] = $buttonRow;
}
$array['keyboard'] = $keyboard;
return $array;
}
@ -261,8 +269,15 @@
$object->keyboard = [];
foreach($data['keyboard'] as $keyboard)
{
$object->keyboard[] = KeyboardButton::fromArray($keyboard);
$buttons = [];
foreach($keyboard as $button)
{
$buttons[] = KeyboardButton::fromArray($button);
}
$object->addRow(...$buttons);
}
$object->is_persistent = $data['is_persistent'] ?? false;
$object->resize_keyboard = $data['resize_keyboard'] ?? false;
$object->one_time_keyboard = $data['one_time_keyboard'] ?? false;

View file

@ -10,6 +10,15 @@
private bool $remove_keyboard;
private bool $selective;
/**
* ReplyKeyboardRemove constructor.
*/
public function __construct()
{
$this->remove_keyboard = false;
$this->selective = false;
}
/**
* Requests clients to remove the custom keyboard (user will not be able to summon this keyboard; if you want
* to hide the keyboard from sight but keep it accessible, use one_time_keyboard in ReplyKeyboardMarkup)

View file

@ -5,8 +5,14 @@ namespace TgBotLib\Methods;
use PHPUnit\Framework\TestCase;
use TgBotLib\Bot;
use TgBotLib\Enums\Types\ParseMode;
use TgBotLib\Objects\ForceReply;
use TgBotLib\Objects\InlineKeyboardButton;
use TgBotLib\Objects\InlineKeyboardMarkup;
use TgBotLib\Objects\KeyboardButton;
use TgBotLib\Objects\LinkPreviewOptions;
use TgBotLib\Objects\Message;
use TgBotLib\Objects\ReplyKeyboardMarkup;
use TgBotLib\Objects\ReplyKeyboardRemove;
class SendMessageTest extends TestCase
{
@ -196,4 +202,82 @@ class SendMessageTest extends TestCase
$this->assertInstanceOf(Message::class, $result);
$this->assertEquals(TEST_CHAT_ID, $result->getChat()->getId());
}
public function testKeyboardMarkup(): void
{
$replyMarkup = new InlineKeyboardMarkup();
$replyMarkup->addRow(
(new InlineKeyboardButton())->setText('Button 1')->setCallbackData('button1'),
(new InlineKeyboardButton())->setText('Button 2')->setCallbackData('button2')
);
$result = self::$bot->sendMessage(
chat_id: TEST_CHAT_ID,
text: 'Test Unit: testKeyboardMarkup',
reply_markup: $replyMarkup
);
$this->assertInstanceOf(Message::class, $result);
$this->assertEquals(TEST_CHAT_ID, $result->getChat()->getId());
}
/**
* Tests the `sendMessage` functionality of the bot with a reply markup.
* The message includes a reply markup with two buttons, and a placeholder text for the input field.
*
* @return void
*/
public function testReplyMarkup(): void
{
$result = self::$bot->sendMessage(
chat_id: TEST_CHAT_ID,
text: 'Test Unit: testReplyMarkup',
reply_markup: (new ReplyKeyboardMarkup())->addRow(
(new KeyboardButton())->setText('Button 1'),
(new KeyboardButton())->setText('Button 2')
)->setInputFieldPlaceholder('Placeholder')
);
$this->assertInstanceOf(Message::class, $result);
$this->assertEquals(TEST_CHAT_ID, $result->getChat()->getId());
// Remove
$result = self::$bot->sendMessage(
chat_id: TEST_CHAT_ID,
text: 'Test Unit: testReplyMarkup',
reply_markup: (new ReplyKeyboardRemove())->setRemoveKeyboard(true)
);
$this->assertInstanceOf(Message::class, $result);
$this->assertEquals(TEST_CHAT_ID, $result->getChat()->getId());
}
/**
* Tests the `sendMessage` functionality of the bot with a force reply.
*
* The message includes a force reply option that requires a reply from the user.
*
* @return void
*/
public function testForceReply(): void
{
$result = self::$bot->sendMessage(
chat_id: TEST_CHAT_ID,
text: 'Test Unit: testForceReply',
reply_markup: (new ForceReply())->setForceReply(true)
);
$this->assertInstanceOf(Message::class, $result);
$this->assertEquals(TEST_CHAT_ID, $result->getChat()->getId());
// Clear
$result = self::$bot->sendMessage(
chat_id: TEST_CHAT_ID,
text: 'Test Unit: testForceReply',
reply_markup: (new ForceReply())->setForceReply(false)
);
$this->assertInstanceOf(Message::class, $result);
$this->assertEquals(TEST_CHAT_ID, $result->getChat()->getId());
}
}