1
0
зеркало из https://github.com/glebtv/telegram-bot.git synced 2026-09-04 02:05:52 +03:00

Support for testing bots in poller mode and non-Rails apps

Этот коммит содержится в:
Max Melentiev
2018-05-25 18:48:38 +03:00
родитель 050df20533
Коммит 4d76941d03
18 изменённых файлов: 331 добавлений и 170 удалений

Просмотреть файл

@@ -2,6 +2,15 @@ module Telegram
module Bot
module RSpec
autoload :ClientMatchers, 'telegram/bot/rspec/client_matchers'
module_function
# Yelds a block if `include_context` is supported.
def with_include_context
::RSpec.configure do |config|
yield(config) if config.respond_to?(:include_context)
end
end
end
end
end

Просмотреть файл

@@ -3,7 +3,6 @@ require 'telegram/bot/rspec/message_helpers'
# Shared helpers for testing callback query updates.
RSpec.shared_context 'telegram/bot/callback_query' do
include_context 'telegram/bot/integration'
include_context 'telegram/bot/message_helpers'
subject { -> { dispatch callback_query: payload } }
@@ -38,9 +37,3 @@ RSpec.shared_context 'telegram/bot/callback_query' do
).with(hash_including(options))
end
end
RSpec.configure do |config|
if config.respond_to?(:include_context)
config.include_context 'telegram/bot/callback_query', :telegram_bot, :callback_query
end
end

Просмотреть файл

@@ -1,36 +0,0 @@
require 'telegram/bot/rspec/message_helpers'
require 'telegram/bot/rspec/callback_query_helpers'
RSpec.shared_context 'telegram/bot/integration' do
include Telegram::Bot::RSpec::ClientMatchers
include_context 'telegram/bot/message_helpers'
let(:bot) { Telegram.bot }
let(:controller_path) do
route_name = Telegram::Bot::RoutesHelper.route_name_for_bot(bot)
Rails.application.routes.url_helpers.public_send("#{route_name}_path")
end
let(:request_headers) do
{
'ACCEPT' => 'application/json',
'Content-Type' => 'application/json',
}
end
let(:clear_session?) { described_class.respond_to?(:session_store) }
before { described_class.session_store.try!(:clear) if clear_session? }
# Process update.
def dispatch(update)
if ActionPack::VERSION::MAJOR >= 5
post(controller_path, params: update.to_json, headers: request_headers)
else
post(controller_path, update.to_json, request_headers)
end
end
end
RSpec.configure do |config|
if config.respond_to?(:include_context)
config.include_context 'telegram/bot/integration', :telegram_bot
end
end

Просмотреть файл

@@ -0,0 +1,14 @@
require 'telegram/bot/rspec/integration/shared'
RSpec.shared_context 'telegram/bot/integration/poller' do
include_context 'telegram/bot/integration/shared'
let(:controller_class) { described_class }
def dispatch(update)
controller_class.dispatch(bot, update.as_json)
end
end
Telegram::Bot::RSpec.with_include_context do |config|
config.include_context 'telegram/bot/integration/poller', telegram_bot: :poller
end

24
lib/telegram/bot/rspec/integration/rack.rb Обычный файл
Просмотреть файл

@@ -0,0 +1,24 @@
require 'telegram/bot/rspec/integration/shared'
require 'rack/test'
RSpec.shared_context 'telegram/bot/integration/rack' do
include_context 'telegram/bot/integration/shared'
include Rack::Test::Methods
let(:request_path) { raise '`let(:request_path) { path to bot }` is required' }
let(:app) { raise '`let(:app) { your rack app here }` is required' }
let(:request_headers) do
{
'ACCEPT' => 'application/json',
'CONTENT_TYPE' => 'application/json',
}
end
def dispatch(update)
post request_path, update.to_json, request_headers
end
end
Telegram::Bot::RSpec.with_include_context do |config|
config.include_context 'telegram/bot/integration/rack', telegram_bot: :rack
end

30
lib/telegram/bot/rspec/integration/rails.rb Обычный файл
Просмотреть файл

@@ -0,0 +1,30 @@
require 'telegram/bot/rspec/integration/shared'
#
RSpec.shared_context 'telegram/bot/integration/rails', type: :request do
include_context 'telegram/bot/integration/shared'
let(:controller_path) do
route_name = Telegram::Bot::RoutesHelper.route_name_for_bot(bot)
Rails.application.routes.url_helpers.public_send("#{route_name}_path")
end
let(:request_headers) do
{
'Accept' => 'application/json',
'Content-Type' => 'application/json',
}
end
def dispatch(update)
if ActionPack::VERSION::MAJOR >= 5
post(controller_path, params: update.to_json, headers: request_headers)
else
post(controller_path, update.to_json, request_headers)
end
end
end
Telegram::Bot::RSpec.with_include_context do |config|
config.include_context 'telegram/bot/integration/rails', :telegram_bot
config.include_context 'telegram/bot/integration/rails', telegram_bot: :rails
end

Просмотреть файл

@@ -0,0 +1,14 @@
require 'active_support/json'
require 'telegram/bot'
require 'telegram/bot/rspec/message_helpers'
require 'telegram/bot/rspec/callback_query_helpers'
RSpec.shared_context 'telegram/bot/integration/shared' do
include Telegram::Bot::RSpec::ClientMatchers
include_context 'telegram/bot/message_helpers'
include_context 'telegram/bot/callback_query', :callback_query
let(:bot) { Telegram.bot }
let(:clear_session?) { described_class.respond_to?(:session_store) }
before { described_class.session_store.try!(:clear) if clear_session? }
end

Просмотреть файл

@@ -1,9 +1,11 @@
require 'telegram/bot/updates_controller/testing'
require 'telegram/bot/rspec/message_helpers'
require 'telegram/bot/rspec/callback_query_helpers'
RSpec.shared_context 'telegram/bot/updates_controller' do
include Telegram::Bot::RSpec::ClientMatchers
include_context 'telegram/bot/message_helpers'
include_context 'telegram/bot/callback_query', :callback_query
let(:controller_class) { described_class }
let(:controller) do
@@ -34,8 +36,6 @@ RSpec.shared_context 'telegram/bot/updates_controller' do
end
end
RSpec.configure do |config|
if config.respond_to?(:include_context)
config.include_context 'telegram/bot/updates_controller', type: :telegram_bot_controller
end
Telegram::Bot::RSpec.with_include_context do |config|
config.include_context 'telegram/bot/updates_controller', type: :telegram_bot_controller
end