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 ?string $inline_field_placeholder;
private bool $selective; 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' * 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 ?KeyboardButtonPollType $request_poll;
private ?WebAppInfo $web_app; 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 * Text of the button. If none of the optional fields are used, it will be sent as a message when the
* button is pressed * button is pressed
@ -26,6 +40,18 @@
return $this->text; 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 * 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. * 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; 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 * 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. * its identifier to the bot in a “chat_shared” service message. Available in private chats only.
@ -48,6 +86,18 @@
return $this->request_chat; 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. * Optional. If True, the user's phone number will be sent as a contact when the button is pressed.
* Available in private chats only. * Available in private chats only.
@ -59,6 +109,18 @@
return $this->request_contact; 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. * Optional. If True, the user's current location will be sent when the button is pressed.
* Available in private chats only. * Available in private chats only.
@ -70,6 +132,18 @@
return $this->request_location; 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 * 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. * is pressed. Available in private chats only.
@ -81,6 +155,18 @@
return $this->request_poll; 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 * 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. * 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; 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 * Returns an array representation of the object
* *
@ -100,15 +198,41 @@
*/ */
public function toArray(): array public function toArray(): array
{ {
return [ $array = [
'text' => $this->text, '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->text = $data['text'] ?? null;
$object->request_user = isset($data['request_user']) ? KeyboardButtonRequestUser::fromArray($data['request_user']) : 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_chat = isset($data['request_chat']) ? KeyboardButtonRequestChat::fromArray($data['request_chat']) : null;
$object->request_contact = $data['request_contact'] ?? null; $object->request_contact = $data['request_contact'] ?? false;
$object->request_location = $data['request_location'] ?? null; $object->request_location = $data['request_location'] ?? false;
$object->request_poll = isset($data['request_poll']) ? KeyboardButtonPollType::fromArray($data['request_poll']) : null; $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; $object->web_app = isset($data['web_app']) ? WebAppInfo::fromArray($data['web_app']) : null;

View file

@ -236,18 +236,26 @@
public function toArray(): array public function toArray(): array
{ {
$array = [ $array = [
'keyboard' => $this->keyboard,
'is_persistent' => $this->is_persistent, 'is_persistent' => $this->is_persistent,
'resize_keyboard' => $this->resize_keyboard, 'resize_keyboard' => $this->resize_keyboard,
'one_time_keyboard' => $this->one_time_keyboard, 'one_time_keyboard' => $this->one_time_keyboard,
'input_field_placeholder' => $this->input_field_placeholder,
'selective' => $this->selective '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; return $array;
} }
@ -261,8 +269,15 @@
$object->keyboard = []; $object->keyboard = [];
foreach($data['keyboard'] as $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->is_persistent = $data['is_persistent'] ?? false;
$object->resize_keyboard = $data['resize_keyboard'] ?? false; $object->resize_keyboard = $data['resize_keyboard'] ?? false;
$object->one_time_keyboard = $data['one_time_keyboard'] ?? false; $object->one_time_keyboard = $data['one_time_keyboard'] ?? false;

View file

@ -10,6 +10,15 @@
private bool $remove_keyboard; private bool $remove_keyboard;
private bool $selective; 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 * 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) * 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 PHPUnit\Framework\TestCase;
use TgBotLib\Bot; use TgBotLib\Bot;
use TgBotLib\Enums\Types\ParseMode; 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\LinkPreviewOptions;
use TgBotLib\Objects\Message; use TgBotLib\Objects\Message;
use TgBotLib\Objects\ReplyKeyboardMarkup;
use TgBotLib\Objects\ReplyKeyboardRemove;
class SendMessageTest extends TestCase class SendMessageTest extends TestCase
{ {
@ -196,4 +202,82 @@ class SendMessageTest extends TestCase
$this->assertInstanceOf(Message::class, $result); $this->assertInstanceOf(Message::class, $result);
$this->assertEquals(TEST_CHAT_ID, $result->getChat()->getId()); $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());
}
} }