Тестирование сценария
Теперь создадим 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>