Тестирование сценария
Теперь создадим xml-тесты, чтобы проверить логику работы бота.
Создайте файл test.xml
в папке test
.
<test>
<test-case id="ChooseCity">
<q>/start</q>
<responseData field="replies[1].buttons">[{text:"Санкт-Петербург",transition:"/ChooseCity/RememberCity"},{text:"Москва",transition:"/ChooseCity/RememberCity"}]</responseData>
<a state="/ChooseCity"/>
<q>Спб</q>
<a state=""/>
<a state="/ChooseCity"/>
</test-case>
<test-case id="CatchAll">
<q>/start</q>
<a state="/ChooseCity"/>
<q>Санкт-Петербург</q>
<a state="/ChoosePizza"/>
<q>Хочу с грибами</q>
<a state="/CatchAll"/>
</test-case>
<test-case id="ReturnToMenu">
<q>/start</q>
<a state="/ChooseCity"/>
<q>Санкт-Петербург</q>
<a state="/ChoosePizza"/>
<responseData field="replies[1].buttons">[ {text: "Маргарита", transition: "/ChoosePizza/GetName"} ] </responseData>
<responseData field="replies[2].buttons">[ {text: "Пепперони", transition: "/ChoosePizza/GetName"} ] </responseData>
<responseData field="replies[3].buttons">[ {text: "С грибами", transition: "/ChoosePizza/GetName"} ] </responseData>
<q>Маргарита</q>
<a state="/ChooseVariant"/>
<q>Меню</q>
<a state="/ChoosePizza"/>
</test-case>
<test-case id="WholeScript">
<q>/start</q>
<a state="/ChooseCity"/>
<q>Санкт-Петербург</q>
<a state="/ChoosePizza"/>
<responseData field="replies[1].buttons">[ {text: "Маргарита", transition: "/ChoosePizza/GetName"} ] </responseData>
<q>Маргарита</q>
<a state="/ChooseVariant"/>
<responseData field="replies[1].buttons"> [{ text:"Большая на тонком тесте за 299 руб.",callback_data:1 }] </responseData>
<responseData field="replies[2].buttons"> [{ text:"Большая на толстом тесте за 399 руб.",callback_data:2 }] </responseData>
<responseData field="replies[3].buttons"> [{ text:"Маленькая на тонком тесте за 199 руб.",callback_data:3 }] </responseData>
<responseData field="replies[4].buttons"> [{ text:"Маленькая на толстом тесте за 249 руб.",callback_data:4 }] </responseData>
<request>{type:"query",query:"1",event:"telegramCallbackQuery"}</request>
<a state="/ChooseQuantity"/>
<responseData field="replies[1].buttons"> [
{text:"1",transition:"/ChooseQuantity/GetQuantity"},
{text:"2",transition:"/ChooseQuantity/GetQuantity"},
{text:"3",transition:"/ChooseQuantity/GetQuantity"}]</responseData>
<q>2</q>
<a state="/ChooseQuantity/GetQuantity"/>
<responseData field="replies[1].buttons"> [{text:"Меню",transition:"/ChoosePizza"}]</responseData>
<responseData field="replies[2].buttons"> [{text:"Оформить заказ",transition:"/Cart"}]</responseData>
<request>{query:"Оформить заказ",rawRequest:{message:{message_id:1}}}</request>
<a state="/Cart"/>
<responseData field="replies[2].buttons"> [{ text:"Удалить",callback_data:"Маргарита" }] </responseData>
<request>{type:"query",event:"telegramSendContact",rawRequest:{message:{message_id:1, contact: {phone_number:"+7123123123"}}}}</request>
<a state="/GetPhoneNumber"/>
</test-case>
<test-case id="ChooseSomePizzas">
<q>/start</q>
<a state="/ChooseCity"/>
<q>Санкт-Петербург</q>
<a state="/ChoosePizza"/>
<q>Маргарита</q>
<a state="/ChooseVariant"/>
<request>{type:"query", event:"telegramCallbackQuery", query:"1", rawRequest: {callback_query: {data: "1"}}}</request>
<a state="/ChooseQuantity"/>
<q>2</q>
<a state="/ChooseQuantity/GetQuantity"/>
<q>Меню</q>
<a state="/ChoosePizza"/>
<q>Пепперони</q>
<a state="/ChooseVariant"/>
<request>{type:"query", event:"telegramCallbackQuery", query:"6", rawRequest: {callback_query: {data: "6"}}}</request>
<a state="/ChooseQuantity"/>
<q>1</q>
<a state="/ChooseQuantity/GetQuantity"/>
<request>{query:"Оформить заказ", rawRequest:{message: {message_id: 1}}}</request>
<responseData field="answer">"Ваша корзина:\n\n1. Маргарита, Большая на тонком тесте\nЦена: 299\nКоличество: 2\n\n2. Пепперони, Большая на толстом тесте\nЦена: 499\nКоличество: 1\n\nОбщая сумма заказа: 1097 рублей.\n\nЕсли все верно, отправьте свой номер телефона, и наш менеджер с вами свяжется."</responseData> -->
<a state="/Cart"/>
<responseData field="replies[2].buttons"> [{ text:"Удалить",callback_data:"Маргарита" }] </responseData>
<responseData field="replies[4].buttons"> [{ text:"Удалить",callback_data:"Пепперони" }] </responseData>
</test-case>
<test-case id="EditCart">
<q>/start</q>
<a state="/ChooseCity"/>
<q>Санкт-Петербург</q>
<a state="/ChoosePizza"/>
<q>Маргарита</q>
<a state="/ChooseVariant"/>
<request>{type:"query",query:"1",event:"telegramCallbackQuery"}</request>
<a state="/ChooseQuantity"/>
<q>2</q>
<a state="/ChooseQuantity/GetQuantity"/>
<request>{query:"Оформить заказ", rawRequest:{message: {message_id: 1}}}</request>
<a state="/Cart"/>
<responseData field="replies[2].buttons"> [{ text:"Удалить",callback_data:"Маргарита" }] </responseData>
<a state="/Cart"/>
<request>{type:"query", event:"telegramCallbackQuery", query:"Маргарита", rawRequest:{callback_query: {data:"Маргарита", message:{message_id: 1}}}}</request>
<responseData field="replies[0]"> {"type":"raw","body":{"text":"Удален","message_id":1,"reply_markup":{"resize_keyboard":false}},"method":"editMessageText"}</responseData>
<responseData field="replies[1]"> {"type":"raw","body":{"text":"Общая сумма заказа: 0 руб.","message_id":4,"reply_markup":{"resize_keyboard":false}},"method":"editMessageText"}</responseData>
<a state="/Cart/Edit"/>
<a state="/ChoosePizza"/>
</test-case>
</test>
подсказка
Подробнее о работе с xml-тестами
ChooseCity
Проверим наличие кнопок:
<responseData field="replies[1].buttons">[{text:"Санкт-Петербург",transition:"/ChooseCity/RememberCity"},{text:"Москва",transition:"/ChooseCity/RememberCity"}]</responseData>
CatchAll
Проверим попадание в стейт CatchAll
, если клиент введет сообщение вместо нажатия кнопки:
<test-case id="catchAll">
<q>/start</q>
<a state="/ChooseCity"/>
<q>Санкт-Петербург</q>
<a state="/ChoosePizza"/>
<q>Хочу с грибами</q>
<a state="/CatchAll"/>
</test-case>
ReturnToMenu
Проверим наличие кнопок в стейте ChoosePizza
:
<test-case id="ReturnToMenu">
<q>/start</q>
<a state="/ChooseCity"/>
<q>Санкт-Петербург</q>
<a state="/ChoosePizza"/>
<responseData field="replies[1].buttons">[ {text: "Маргарита", transition: "/ChoosePizza/GetName"} ] </responseData>
<responseData field="replies[2].buttons">[ {text: "Пепперони", transition: "/ChoosePizza/GetName"} ] </responseData>
<responseData field="replies[3].buttons">[ {text: "С грибами", transition: "/ChoosePizza/GetName"} ] </responseData>
<q>Маргарита</q>
<a state="/ChooseVariant"/>
<q>Меню</q>
<a state="/ChoosePizza"/>
</test-case>
WholeScript
Проверим работу сценария от начала до конца. Проверяем наличие инлайн-кнопок:
<responseData field="replies[1].buttons"> [{ text:"Большая на тонком тесте за 299 руб.",callback_data:1 }] </responseData>
ChooseSomePizzas
Проверим клик по инлайн-кнопке:
<request>{type:"query",query:"1",event:"telegramCallbackQuery"}</request>
Здесь в качестве запроса отправля ется значение поля callback_data
, также указывается вызов события telegramCallbackQuery
.
EditCart
Проверим отредактированную корзину, должна произойти замена кнопки Удалить
на текст Удален
:
<responseData field="replies[0]"> {"type":"raw","body":{"text":"Удален","message_id":1,"reply_markup":{"resize_keyboard":false}},"method":"editMessageText"}</responseData>
Проверим редактирование общей суммы заказа:
<responseData field="replies[1]"> {"type":"raw","body":{"text":"Общая сумма заказа: 0 руб.","message_id":4,"reply_markup":{"resize_keyboard":false}},"method":"editMessageText"}</responseData>