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

Сравнить коммиты

...

10 Коммитов

Автор SHA1 Сообщение Дата
Max Melentiev
17260cb5a9 v0.11.0 2017-02-10 09:34:15 +03:00
Max Melentiev
817af95369 Remove Bot::StaleChat in favor of Bot::Forbidden 2017-02-10 09:33:41 +03:00
Max Melentiev
99fbe41b16 Fixed support for *channel_post updates 2016-12-09 13:33:55 +03:00
Max Melentiev
88178113d7 Support (edited_)channel_post updates, add api methods from 2.3, 2.3.1 2016-12-09 13:23:58 +03:00
printercu
1a2ac0dd83 Update README.md 2016-11-16 21:31:02 +03:00
Max Melentiev
fa6e385ca1 v0.10.0 2016-11-16 20:51:41 +03:00
Max Melentiev
1098118826 Fix integration spec for Rails 4 2016-11-16 14:34:42 +03:00
Max Melentiev
0c9a4a5fa0 Inegration context for RSpec
ActionDispatch::Testing::Integration requires smth else and
defines Rails, so had to change `defined?(Rails)` all over the code.
2016-11-16 14:18:45 +03:00
printercu
5c299887bb Merge pull request #18 from bob-frost/ruby2.2.0
Error "can't dup Fixnum (TypeError)"
2016-11-13 19:16:59 +03:00
bob-frost
9f2234c132 Fix "can't dup Fixnum (TypeError)" for Ruby 2.2.0 2016-11-13 09:47:01 +06:00
19 изменённых файлов: 301 добавлений и 119 удалений

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

@@ -1,3 +1,19 @@
# 0.11.0
- Remove Bot::StaleChat in favor of Bot::Forbidden, as Telegram adds more
and more new descriptions.
Please open an issue if you face a problem.
# 0.10.2
- Support `(edited_)channel_post` updates.
- New methods from 2.3, 2.3.1 API updates.
# 0.10.0
- Integration helpers for RSpec.
- Fix for ruby 2.2.0 bug by @bob-frost.
# 0.9.0 # 0.9.0
- Async API requests. - Async API requests.

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

@@ -13,9 +13,9 @@ group :development do
gem 'pry', '~> 0.10.1' gem 'pry', '~> 0.10.1'
gem 'pry-byebug', '~> 3.2.0' gem 'pry-byebug', '~> 3.2.0'
gem 'telegram-bot-types', '~> 0.2.0' gem 'telegram-bot-types', '~> 0.3.0'
gem 'rspec', '~> 3.3.0' gem 'rspec', '~> 3.5.0'
gem 'rspec-its', '~> 1.1.0' gem 'rspec-its', '~> 1.1.0'
gem 'rubocop', '~> 0.37.0' gem 'rubocop', '~> 0.37.0'

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

@@ -24,6 +24,9 @@ Here is sample [telegram_bot_app](https://github.com/telegram-bot-rb/telegram_bo
with session, keyboards and inline queries. with session, keyboards and inline queries.
Run it on your local machine in 1 minute! Run it on your local machine in 1 minute!
And here is [app teamplate](https://github.com/telegram-bot-rb/rails_template)
to generate clean app in seconds.
## Installation ## Installation
Add this line to your application's Gemfile: Add this line to your application's Gemfile:
@@ -97,7 +100,7 @@ bot.get_me.class # => Telegram::Bot::Types::User
``` ```
Any API request error will raise `Telegram::Bot::Error` with description in its message. Any API request error will raise `Telegram::Bot::Error` with description in its message.
Special `Telegram::Bot::StaleChat` is raised when bot can't post messages to the chat anymore. Special `Telegram::Bot::Forbidden` is raised when bot can't post messages to the chat anymore.
### Controller ### Controller
@@ -323,36 +326,52 @@ To stub all possible clients use `Telegram::Bot::ClientStub.stub_all!` before
initializing clients. Most likely you'll want something like this: initializing clients. Most likely you'll want something like this:
```ruby ```ruby
# environments/test.rb
# Make sure to run it before defining routes or storing bot to some place in app!
Telegram.reset_bots
Telegram::Bot::ClientStub.stub_all!
# rails_helper.rb
RSpec.configure do |config| RSpec.configure do |config|
# ... # ...
Telegram.reset_bots
Telegram::Bot::ClientStub.stub_all!
config.after { Telegram.bot.reset } config.after { Telegram.bot.reset }
# ... # ...
end end
``` ```
There are also some helpers for controller tests. There are integration and controller contexts for RSpec and some built-in matchers:
Check out `telegram/bot/updates_controller/rspec_helpers` and
`telegram/bot/updates_controller/testing`.
Built-in RSpec matchers will help you to write tests fast:
```ruby ```ruby
include Telegram::Bot::RSpec::ClientMatchers # no need if you already use controller herlpers # spec/requests/telegram_webhooks_spec.rb
require 'telegram/bot/rspec/integration'
RSpec.describe TelegramWebhooksController, :telegram_bot do
# for old rspec add:
# include_context 'telegram/bot/integration'
describe '#start' do
subject { -> { dispatch_command :start } }
it { should respond_with_message 'Hi there!' }
end
end
# For controller specs use
require 'telegram/bot/updates_controller/rspec_helpers'
RSpec.describe TelegramWebhooksController, type: :telegram_bot_controller do
# for old rspec add:
# include_context 'telegram/bot/updates_controller'
end
# Matchers are available for custom specs:
include Telegram::Bot::RSpec::ClientMatchers
expect(&process_update).to send_telegram_message(bot, /msg regexp/, some: :option) expect(&process_update).to send_telegram_message(bot, /msg regexp/, some: :option)
expect(&process_update). expect(&process_update).
to make_telegram_request(bot, :sendMessage, hash_including(text: 'msg text')) to make_telegram_request(bot, :sendMessage, hash_including(text: 'msg text'))
# controller specs are even simplier:
describe '#start' do
subject { -> { dispatch_message '/start' } }
it { should respond_with_message(/Hello/) }
end
# See sample app for more examples.
``` ```
See sample app for more examples.
### Deploying ### Deploying
Use `rake telegram:bot:set_webhook` to update webhook url for all configured bots. Use `rake telegram:bot:set_webhook` to update webhook url for all configured bots.

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

@@ -6,26 +6,7 @@ module Telegram
module Bot module Bot
class Error < StandardError; end class Error < StandardError; end
class NotFound < Error; end class NotFound < Error; end
class Forbidden < Error; end
# Error class for events when chat is not available anymore for bot.
# While Telegram has same error codes for different messages and there is no
# official docs for this error codes it uses `description` to
# check response.
class StaleChat < Error
DESCRIPTIONS = [
'Bot was blocked',
'bot was kicked',
"can't write to",
'group chat is deactivated',
].freeze
class << self
def match_response?(response)
description = response['description'].to_s
DESCRIPTIONS.any? { |x| description[x] }
end
end
end
autoload :Async, 'telegram/bot/async' autoload :Async, 'telegram/bot/async'
autoload :Botan, 'telegram/bot/botan' autoload :Botan, 'telegram/bot/botan'

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

@@ -116,7 +116,7 @@ module Telegram
attr_reader :id attr_reader :id
def initialize(*, id: nil, async: nil, **) def initialize(*, id: nil, async: nil, **options)
@id = id @id = id
self.async = async self.async = async
super super

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

@@ -5,7 +5,7 @@ module Telegram
module ClientHelpers module ClientHelpers
attr_reader :botan attr_reader :botan
def initialize(*, botan: nil, **) def initialize(*, botan: nil, **options)
super super
@botan = Botan.wrap(botan, id: id) if botan @botan = Botan.wrap(botan, id: id) if botan
end end

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

@@ -46,44 +46,44 @@ module Telegram
@base_uri = format URL_TEMPLATE, self.token @base_uri = format URL_TEMPLATE, self.token
end end
def request(action, body = {}) # rubocop:disable PerceivedComplexity def request(action, body = {})
res = http_request("#{base_uri}#{action}", self.class.prepare_body(body)) res = http_request("#{base_uri}#{action}", self.class.prepare_body(body))
status = res.status status = res.status
return JSON.parse(res.body) if 300 > status return JSON.parse(res.body) if 300 > status
result = JSON.parse(res.body) rescue nil # rubocop:disable RescueModifier result = JSON.parse(res.body) rescue nil # rubocop:disable RescueModifier
err_msg = "#{res.reason}: #{result && result['description'] || '-'}" err_msg = result && result['description'] || '-'
if result if result
# NotFound is raised only for valid responses from Telegram # This errors are raised only for valid responses from Telegram
raise NotFound, err_msg if 404 == status case status
raise StaleChat, err_msg if StaleChat.match_response?(result) when 403 then raise Forbidden, err_msg
when 404 then raise NotFound, err_msg
end
end end
raise Error, err_msg raise Error, "#{res.reason}: #{err_msg}"
end end
# Splited to the sections similar to API docs.
%w( %w(
deleteWebhook
getUpdates
getWebhookInfo
setWebhook
answerCallbackQuery answerCallbackQuery
answerInlineQuery
editMessageCaption
editMessageReplyMarkup
editMessageText
forwardMessage forwardMessage
getChat getChat
getChatAdministrators getChatAdministrators
getChatMember getChatMember
getChatMembersCount getChatMembersCount
getFile getFile
getGameHighScores
getMe getMe
getUpdates
getUserProfilePhotos getUserProfilePhotos
getWebhookInfo
kickChatMember kickChatMember
leaveChat leaveChat
sendAudio sendAudio
sendChatAction sendChatAction
sendContact sendContact
sendDocument sendDocument
sendGame
sendLocation sendLocation
sendMessage sendMessage
sendPhoto sendPhoto
@@ -91,9 +91,17 @@ module Telegram
sendVenue sendVenue
sendVideo sendVideo
sendVoice sendVoice
setGameScore
setWebhook
unbanChatMember unbanChatMember
editMessageCaption
editMessageReplyMarkup
editMessageText
answerInlineQuery
getGameHighScores
sendGame
setGameScore
).each do |method| ).each do |method|
define_method(method.underscore) { |*args| request(method, *args) } define_method(method.underscore) { |*args| request(method, *args) }
end end

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

@@ -20,7 +20,7 @@ module Telegram
def bot_poller_mode? def bot_poller_mode?
return @bot_poller_mode if defined?(@bot_poller_mode) return @bot_poller_mode if defined?(@bot_poller_mode)
@bot_poller_mode = ENV.fetch('BOT_POLLER_MODE') do @bot_poller_mode = ENV.fetch('BOT_POLLER_MODE') do
Rails.env.development? if defined?(Rails) Rails.env.development? if defined?(Rails.env)
end end
end end
@@ -47,7 +47,7 @@ module Telegram
# Can be overwritten with .bots_config= # Can be overwritten with .bots_config=
def bots_config def bots_config
@bots_config ||= @bots_config ||=
if defined?(Rails) if defined?(Rails.application)
telegram_config = Rails.application.secrets[:telegram] || {} telegram_config = Rails.application.secrets[:telegram] || {}
(telegram_config['bots'] || {}).symbolize_keys.tap do |config| (telegram_config['bots'] || {}).symbolize_keys.tap do |config|
default = telegram_config['bot'] default = telegram_config['bot']

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

@@ -139,9 +139,9 @@ module Telegram
# Helper for asserting message is sent. Note that options are checked # Helper for asserting message is sent. Note that options are checked
# with `hash_including`. For strict checks use #make_telegram_request. # with `hash_including`. For strict checks use #make_telegram_request.
def send_telegram_message(bot, text = nil, options = {}) def send_telegram_message(bot, text = nil, options = {})
description = "send telegram message #{text.inspect}"
text = a_string_matching(text) if text.is_a?(Regexp) text = a_string_matching(text) if text.is_a?(Regexp)
options = options.merge(text: text) if text options = options.merge(text: text) if text
description = "send telegram message #{text.inspect}"
MakeTelegramRequest.new(bot, :sendMessage, description: description). MakeTelegramRequest.new(bot, :sendMessage, description: description).
with(hash_including(options)) with(hash_including(options))
end end

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

@@ -0,0 +1,49 @@
RSpec.shared_context 'telegram/bot/integration' do
let(:bot) { Telegram.bot }
let(:from_id) { 123 }
let(:chat_id) { 456 }
let(:default_message_options) { {from: {id: from_id}, chat: {id: chat_id}} }
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.clear if clear_session? }
include Telegram::Bot::RSpec::ClientMatchers
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
def dispatch_message(text, options = {})
dispatch message: default_message_options.merge(options).merge(text: text)
end
def dispatch_command(*args)
options = args.last.is_a?(Hash) ? args.pop : {}
dispatch_message("/#{args.join ' '}", options)
end
# Matcher to check response. Make sure to define `let(:chat_id)`.
def respond_with_message(expected)
raise 'Define chat_id to use respond_with_message' unless defined?(chat_id)
send_telegram_message(bot, expected, chat_id: chat_id)
end
end
RSpec.configure do |config|
if config.respond_to?(:include_context)
config.include_context 'telegram/bot/integration', :telegram_bot
end
end

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

@@ -50,7 +50,7 @@ module Telegram
# ControllerClass.new(bot, from: telegram_user, chat: telegram_chat). # ControllerClass.new(bot, from: telegram_user, chat: telegram_chat).
# process(:help, *args) # process(:help, *args)
# #
class UpdatesController < AbstractController::Base class UpdatesController < AbstractController::Base # rubocop:disable ClassLength
abstract! abstract!
require 'telegram/bot/updates_controller/session' require 'telegram/bot/updates_controller/session'
@@ -80,10 +80,12 @@ module Telegram
PAYLOAD_TYPES = %w( PAYLOAD_TYPES = %w(
message message
edited_message
channel_post
edited_channel_post
inline_query inline_query
chosen_inline_result chosen_inline_result
callback_query callback_query
edited_message
).freeze ).freeze
CMD_REGEX = %r{\A/([a-z\d_]{,31})(@(\S+))?(\s|$)}i CMD_REGEX = %r{\A/([a-z\d_]{,31})(@(\S+))?(\s|$)}i
CONFLICT_CMD_REGEX = Regexp.new("^(#{PAYLOAD_TYPES.join('|')}|\\d)") CONFLICT_CMD_REGEX = Regexp.new("^(#{PAYLOAD_TYPES.join('|')}|\\d)")
@@ -181,11 +183,13 @@ module Telegram
cmd &&= self.class.action_for_command(cmd) cmd &&= self.class.action_for_command(cmd)
[true, cmd, args] if cmd [true, cmd, args] if cmd
end end
alias_method :action_for_channel_post, :action_for_message
# It doesn't extract commands from edited messages. Just process # It doesn't extract commands from edited messages. Just process
# them as usual ones. # them as usual ones.
def action_for_edited_message def action_for_edited_message
end end
alias_method :action_for_edited_channel_post, :action_for_edited_message
def action_for_inline_query def action_for_inline_query
[false, payload_type, [payload['query'], payload['offset']]] [false, payload_type, [payload['query'], payload['offset']]]

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

@@ -13,6 +13,9 @@ RSpec.shared_context 'telegram/bot/updates_controller' do
let(:bot) { Telegram::Bot::ClientStub.new(bot_name) } let(:bot) { Telegram::Bot::ClientStub.new(bot_name) }
let(:bot_name) { 'bot' } let(:bot_name) { 'bot' }
let(:session) { controller.send(:session) } let(:session) { controller.send(:session) }
let(:from_id) { 123 }
let(:chat_id) { 456 }
let(:default_message_options) { {from: {id: from_id}, chat: {id: chat_id}} }
include Telegram::Bot::RSpec::ClientMatchers include Telegram::Bot::RSpec::ClientMatchers
@@ -20,9 +23,8 @@ RSpec.shared_context 'telegram/bot/updates_controller' do
controller.dispatch_again(bot, update) controller.dispatch_again(bot, update)
end end
def dispatch_message(text, options = nil) def dispatch_message(text, options = {})
options ||= respond_to?(:default_message_options) ? default_message_options : {} update = build_update :message, default_message_options.merge(options).merge(text: text)
update = build_update :message, options.merge(text: text)
dispatch bot, update dispatch bot, update
end end
@@ -43,3 +45,9 @@ RSpec.shared_context 'telegram/bot/updates_controller' do
send_telegram_message(bot, expected, chat_id: chat_id) send_telegram_message(bot, expected, chat_id: chat_id)
end end
end end
RSpec.configure do |config|
if config.respond_to?(:include_context)
config.include_context 'telegram/bot/updates_controller', type: :telegram_bot_controller
end
end

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

@@ -27,12 +27,12 @@ module Telegram
attr_reader :bot, :controller, :timeout, :offset, :logger, :running, :reload attr_reader :bot, :controller, :timeout, :offset, :logger, :running, :reload
def initialize(bot, controller, **options) def initialize(bot, controller, **options)
@logger = options.fetch(:logger) { defined?(Rails) && Rails.logger } @logger = options.fetch(:logger) { defined?(Rails.logger) && Rails.logger }
@bot = bot @bot = bot
@controller = controller @controller = controller
@timeout = options.fetch(:timeout) { DEFAULT_TIMEOUT } @timeout = options.fetch(:timeout) { DEFAULT_TIMEOUT }
@offset = options[:offset] @offset = options[:offset]
@reload = options.fetch(:reload) { defined?(Rails) && Rails.env.development? } @reload = options.fetch(:reload) { defined?(Rails.env) && Rails.env.development? }
end end
def log(&block) def log(&block)
@@ -85,7 +85,7 @@ module Telegram
end end
end end
if defined?(Rails) && Rails.application.respond_to?(:reloader) if defined?(Rails.application) && Rails.application.respond_to?(:reloader)
def reloading_code def reloading_code
Rails.application.reloader.wrap do Rails.application.reloader.wrap do
yield yield

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

@@ -1,6 +1,6 @@
module Telegram module Telegram
module Bot module Bot
VERSION = '0.9.0'.freeze VERSION = '0.11.0'.freeze
def self.gem_version def self.gem_version
Gem::Version.new VERSION Gem::Version.new VERSION

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

@@ -3,7 +3,7 @@ RSpec.describe Telegram::Bot::Botan do
let(:token) { 'token' } let(:token) { 'token' }
include_examples 'initializers', :botans include_examples 'initializers', :botans
include_examples 'async', request_args: -> { [double(:method), double(:url)] } it_behaves_like 'async', request_args: -> { [double(:method), double(:url)] }
describe '.new' do describe '.new' do
subject { described_class.new(*args) } subject { described_class.new(*args) }

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

@@ -4,7 +4,7 @@ RSpec.describe Telegram::Bot::Client do
let(:botan_token) { double(:botan_token) } let(:botan_token) { double(:botan_token) }
include_examples 'initializers' include_examples 'initializers'
include_examples 'async', request_args: -> { [double(:action), {body: :content}] } it_behaves_like 'async', request_args: -> { [double(:action), {body: :content}] }
describe '.prepare_body' do describe '.prepare_body' do
subject { described_class.prepare_body(input) } subject { described_class.prepare_body(input) }
@@ -48,4 +48,49 @@ RSpec.describe Telegram::Bot::Client do
its(:base_uri) { should include args[0][:token] } its(:base_uri) { should include args[0][:token] }
end end
end end
describe '#request' do
subject { -> { instance.request(action, request_body) } }
let(:action) { :some_action }
let(:url) { "#{format described_class::URL_TEMPLATE, token}#{action}" }
let(:request_body) { double(:body) }
let(:prepared_body) { double(:prepared_body) }
let(:response) { HTTP::Message.new_response(body).tap { |x| x.status = status } }
let(:status) { 200 }
let(:body) { body_json.to_json }
let(:body_json) { {'param' => 'val', 'description' => 'some description'} }
before do
expect(described_class).to receive(:prepare_body).with(request_body) { prepared_body }
expect(instance).to receive(:http_request).with(url, prepared_body) { response }
end
around { |ex| Telegram::Bot::ClientStub.stub_all!(false) { ex.run } }
shared_examples 'invalid body' do |error = Telegram::Bot::Error|
context 'when body is not json' do
let(:body) { '{' }
it { should raise_error error }
end
end
its(:call) { should eq body_json }
include_examples 'invalid body', JSON::ParserError
context 'when status is 403' do
let(:status) { 403 }
it { should raise_error Telegram::Bot::Forbidden, body_json['description'] }
include_examples 'invalid body'
end
context 'when status is 404' do
let(:status) { 404 }
it { should raise_error Telegram::Bot::NotFound, body_json['description'] }
include_examples 'invalid body'
end
context 'when status is other' do
let(:status) { 500 }
it { should raise_error Telegram::Bot::Error, /#{body_json['description']}/ }
end
end
end end

71
spec/telegram/bot/rspec/integration_spec.rb Обычный файл
Просмотреть файл

@@ -0,0 +1,71 @@
require 'telegram/bot/rspec/integration'
require 'action_controller'
require 'action_dispatch'
require 'action_dispatch/testing/integration'
RSpec.describe 'Integrations helper', :telegram_bot do
include ActionDispatch::Integration::Runner
def reset_template_assertion; end
let(:app) do
app = Telegram::Bot::Middleware.new(bot, controller)
if ActionPack::VERSION::MAJOR >= 5
app
else
require 'action_dispatch/middleware/params_parser'
ActionDispatch::ParamsParser.new(app)
end
end
let(:bot) { Telegram::Bot::ClientStub.new('token') }
let(:controller_path) { '/' }
let(:controller) do
Class.new(Telegram::Bot::UpdatesController) do
def start(*args)
respond_with :message, text: "Start: #{args.inspect}, option: #{payload[:option]}"
end
end
end
describe '#default_message_options' do
subject { default_message_options }
it { should eq from: {id: from_id}, chat: {id: chat_id} }
end
describe '#dispatch' do
subject { -> { dispatch message: {text: '/start', **default_message_options} } }
it { should respond_with_message 'Start: [], option: ' }
end
describe '#dispatch_message' do
subject { -> { dispatch_message "/start #{args.join ' '}", options } }
let(:args) { %w(asd qwe) }
let(:options) { {} }
it { should respond_with_message "Start: #{args.inspect}, option: " }
context 'with options' do
let(:options) { {option: 1} }
it { should respond_with_message "Start: #{args.inspect}, option: 1" }
context 'and chat_id is not set' do
let(:options) { super().merge(chat: nil) }
it { should raise_error(/chat is not present/) }
end
end
end
describe '#dispatch_command' do
subject { -> { dispatch_command :start, *args } }
let(:args) { [] }
it { should respond_with_message "Start: #{args.inspect}, option: " }
context 'with args' do
let(:args) { %w(asd qwe) }
it { should respond_with_message "Start: #{args.inspect}, option: " }
end
context 'with options' do
let(:args) { ['asd', 'qwe', option: 1] }
it { should respond_with_message "Start: #{args[0...-1].inspect}, option: 1" }
end
end
end

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

@@ -102,42 +102,44 @@ RSpec.describe Telegram::Bot::UpdatesController do
it { should eq [false, payload_type, payload.values_at(:data)] } it { should eq [false, payload_type, payload.values_at(:data)] }
end end
context 'when payload is edited_message' do
let(:payload_type) { 'edited_message' }
it { should eq [false, payload_type, [payload]] }
end
context 'when payload is not supported' do context 'when payload is not supported' do
let(:payload_type) { '_unsupported_' } let(:payload_type) { '_unsupported_' }
it { should eq [false, :unsupported_payload_type, []] } it { should eq [false, :unsupported_payload_type, []] }
end end
context 'when payload is message' do %w(message channel_post).each do |type|
let(:payload_type) { 'message' } context 'when payload is edited_message' do
let(:payload) { {'text' => text} } let(:payload_type) { "edited_#{type}" }
let(:text) { 'test' } it { should eq [false, payload_type, [payload]] }
it { should eq [false, payload_type, [payload]] }
context 'with command' do
let(:text) { "/test#{"@#{mention}" if mention} arg 1 2" }
let(:mention) {}
it { should eq [true, 'test', %w(arg 1 2)] }
context 'with mention' do
let(:mention) { bot.username }
it { should eq [true, 'test', %w(arg 1 2)] }
end
context 'with mention for other bot' do
let(:mention) { other_bot_name }
it { should eq [false, 'message', [payload]] }
end
end end
context 'without text' do context 'when payload is message' do
let(:payload) { {'audio' => {'file_id' => 123}} } let(:payload_type) { type }
let(:payload) { {'text' => text} }
let(:text) { 'test' }
it { should eq [false, payload_type, [payload]] } it { should eq [false, payload_type, [payload]] }
context 'with command' do
let(:text) { "/test#{"@#{mention}" if mention} arg 1 2" }
let(:mention) {}
it { should eq [true, 'test', %w(arg 1 2)] }
context 'with mention' do
let(:mention) { bot.username }
it { should eq [true, 'test', %w(arg 1 2)] }
end
context 'with mention for other bot' do
let(:mention) { other_bot_name }
it { should eq [false, payload_type, [payload]] }
end
end
context 'without text' do
let(:payload) { {'audio' => {'file_id' => 123}} }
it { should eq [false, payload_type, [payload]] }
end
end end
end end
end end

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

@@ -2,25 +2,4 @@ RSpec.describe Telegram::Bot do
it 'has a version number' do it 'has a version number' do
expect(described_class::VERSION).not_to be nil expect(described_class::VERSION).not_to be nil
end end
describe described_class::StaleChat do
describe '.match_response?' do
subject { ->(val) { described_class.match_response?(val) } }
it 'returns true for specific errors' do
expect(subject.call({})).to eq false
expect(subject.call('description' => 'test')).to eq false
expect(subject.call('description' => 'Error: bot was kicked from')).to eq true
expect(subject.call(
'description' => "Forbidden: can't write to private chat with deleted user"
)).to eq true
expect(subject.call(
'description' => 'Bad request: group chat is deactivated'
)).to eq true
expect(subject.call(
'description' => 'Forbidden: Bot was blocked by the user'
)).to eq true
end
end
end
end end