зеркало из
https://github.com/glebtv/telegram-bot.git
synced 2026-09-07 11:25:52 +03:00
Merge pull request #147 from telegram-bot-rb/update_api
Update to Bot API 5.0
Этот коммит содержится в:
@@ -40,6 +40,7 @@ Style/IfUnlessModifier: {Enabled: false}
|
|||||||
# Consistent to other definitions.
|
# Consistent to other definitions.
|
||||||
Style/EmptyMethod: {EnforcedStyle: expanded}
|
Style/EmptyMethod: {EnforcedStyle: expanded}
|
||||||
|
|
||||||
|
Style/Lambda: {EnforcedStyle: literal}
|
||||||
Style/ModuleFunction: {Enabled: false}
|
Style/ModuleFunction: {Enabled: false}
|
||||||
Style/NestedParenthesizedCalls: {Enabled: false}
|
Style/NestedParenthesizedCalls: {Enabled: false}
|
||||||
Style/SignalException: {EnforcedStyle: only_raise}
|
Style/SignalException: {EnforcedStyle: only_raise}
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
- Add `:path` option to `telegram_webhook` route helper.
|
- Add `:path` option to `telegram_webhook` route helper.
|
||||||
- __Breaking change!__ Default route is generated using hashed bot token.
|
- __Breaking change!__ Default route is generated using hashed bot token.
|
||||||
Please reconfigure webhook after update (`rake telegram:bot:set_webhook`).
|
Please reconfigure webhook after update (`rake telegram:bot:set_webhook`).
|
||||||
|
- Update to Bot API 5.0, add rake tasks for `deleteWebhook`, `close` & `logOut`.
|
||||||
|
- Add `server` option for client to support local bot API servers.
|
||||||
|
|
||||||
# 0.14.4
|
# 0.14.4
|
||||||
|
|
||||||
|
|||||||
@@ -65,7 +65,11 @@ which is used for `Telegram.bot`.
|
|||||||
```ruby
|
```ruby
|
||||||
Telegram.bots_config = {
|
Telegram.bots_config = {
|
||||||
default: DEFAULT_BOT_TOKEN,
|
default: DEFAULT_BOT_TOKEN,
|
||||||
chat: {token: CHAT_BOT_TOKEN, username: 'chatbot'},
|
chat: {
|
||||||
|
token: CHAT_BOT_TOKEN,
|
||||||
|
username: 'ChatBot', # to support commands with mentions (/help@ChatBot)
|
||||||
|
server: 'http://local.bot.api.server', # for Local Bot API Server
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
Telegram.bot.get_updates
|
Telegram.bot.get_updates
|
||||||
@@ -87,6 +91,7 @@ development:
|
|||||||
bot:
|
bot:
|
||||||
token: TOKEN
|
token: TOKEN
|
||||||
username: SomeBot
|
username: SomeBot
|
||||||
|
server: http://local.bot.api.server
|
||||||
|
|
||||||
# For multiple bots in single app use hash of `internal_bot_id => settings`
|
# For multiple bots in single app use hash of `internal_bot_id => settings`
|
||||||
bots:
|
bots:
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ method_list = headers.
|
|||||||
map { |g| g.reject { |x| x.match?(NOT_METHOD_REGEXP) } }.
|
map { |g| g.reject { |x| x.match?(NOT_METHOD_REGEXP) } }.
|
||||||
reject(&:empty?)
|
reject(&:empty?)
|
||||||
|
|
||||||
api_version = doc.text.match(/^(Bot API ([\d\.]+))\.?$/)
|
api_version = doc.text.match(/^(?:Introducing )?(Bot API ([\d\.]+))\.?$/)
|
||||||
|
|
||||||
result = ['# Generated with bin/fetch-telegram-methods']
|
result = ['# Generated with bin/fetch-telegram-methods']
|
||||||
result << "# #{api_version[1]}" if api_version
|
result << "# #{api_version[1]}" if api_version
|
||||||
|
|||||||
@@ -14,15 +14,22 @@ namespace :telegram do
|
|||||||
|
|
||||||
desc 'Set webhook urls for all bots'
|
desc 'Set webhook urls for all bots'
|
||||||
task set_webhook: :environment do
|
task set_webhook: :environment do
|
||||||
routes = Rails.application.routes.url_helpers
|
Telegram::Bot::Tasks.set_webhook
|
||||||
cert_file = ENV['CERT']
|
end
|
||||||
cert = File.open(cert_file) if cert_file
|
|
||||||
Telegram.bots.each do |key, bot|
|
desc 'Delete webhooks for all or specific BOT'
|
||||||
route_name = Telegram::Bot::RoutesHelper.route_name_for_bot(bot)
|
task :delete_webhook do
|
||||||
url = routes.send("#{route_name}_url")
|
Telegram::Bot::Tasks.delete_webhook
|
||||||
puts "Setting webhook for #{key}..."
|
end
|
||||||
bot.async(false) { bot.set_webhook(url: url, certificate: cert) }
|
|
||||||
end
|
desc 'Perform logOut command for all or specific BOT'
|
||||||
|
task :log_out do
|
||||||
|
Telegram::Bot::Tasks.log_out
|
||||||
|
end
|
||||||
|
|
||||||
|
desc 'Perform `close` command for all or specific BOT'
|
||||||
|
task :close do
|
||||||
|
Telegram::Bot::Tasks.close
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -25,9 +25,9 @@ module Telegram
|
|||||||
autoload :Client, 'telegram/bot/client'
|
autoload :Client, 'telegram/bot/client'
|
||||||
autoload :ClientStub, 'telegram/bot/client_stub'
|
autoload :ClientStub, 'telegram/bot/client_stub'
|
||||||
autoload :DebugClient, 'telegram/bot/debug_client'
|
autoload :DebugClient, 'telegram/bot/debug_client'
|
||||||
autoload :Initializers, 'telegram/bot/initializers'
|
|
||||||
autoload :Middleware, 'telegram/bot/middleware'
|
autoload :Middleware, 'telegram/bot/middleware'
|
||||||
autoload :RSpec, 'telegram/bot/rspec'
|
autoload :RSpec, 'telegram/bot/rspec'
|
||||||
|
autoload :Tasks, 'telegram/bot/tasks'
|
||||||
autoload :UpdatesController, 'telegram/bot/updates_controller'
|
autoload :UpdatesController, 'telegram/bot/updates_controller'
|
||||||
autoload :UpdatesPoller, 'telegram/bot/updates_poller'
|
autoload :UpdatesPoller, 'telegram/bot/updates_poller'
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
|
require 'active_support/core_ext/hash/keys'
|
||||||
require 'json'
|
require 'json'
|
||||||
require 'httpclient'
|
require 'httpclient'
|
||||||
|
|
||||||
module Telegram
|
module Telegram
|
||||||
module Bot
|
module Bot
|
||||||
class Client
|
class Client
|
||||||
URL_TEMPLATE = 'https://api.telegram.org/bot%<token>s/'.freeze
|
SERVER = 'https://api.telegram.org'.freeze
|
||||||
|
URL_TEMPLATE = '%<server>s/bot%<token>s/'.freeze
|
||||||
|
|
||||||
autoload :TypedResponse, 'telegram/bot/client/typed_response'
|
autoload :TypedResponse, 'telegram/bot/client/typed_response'
|
||||||
extend Initializers
|
|
||||||
prepend Async
|
prepend Async
|
||||||
include DebugClient
|
include DebugClient
|
||||||
|
|
||||||
@@ -15,6 +16,16 @@ module Telegram
|
|||||||
include ApiHelper
|
include ApiHelper
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
|
# Accepts different options to initialize bot.
|
||||||
|
def wrap(input, **options)
|
||||||
|
case input
|
||||||
|
when Symbol then by_id(input) or raise "#{name} #{input.inspect} not configured"
|
||||||
|
when self then input
|
||||||
|
when Hash then new(**input.symbolize_keys, **options)
|
||||||
|
else new(input, **options)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def by_id(id)
|
def by_id(id)
|
||||||
Telegram.bots[id]
|
Telegram.bots[id]
|
||||||
end
|
end
|
||||||
@@ -51,11 +62,11 @@ module Telegram
|
|||||||
|
|
||||||
attr_reader :client, :token, :username, :base_uri
|
attr_reader :client, :token, :username, :base_uri
|
||||||
|
|
||||||
def initialize(token = nil, username = nil, **options)
|
def initialize(token = nil, username = nil, server: SERVER, **options)
|
||||||
@client = HTTPClient.new
|
@client = HTTPClient.new
|
||||||
@token = token || options[:token]
|
@token = token || options[:token]
|
||||||
@username = username || options[:username]
|
@username = username || options[:username]
|
||||||
@base_uri = format(URL_TEMPLATE, token: self.token)
|
@base_uri = format(URL_TEMPLATE, server: server, token: self.token)
|
||||||
end
|
end
|
||||||
|
|
||||||
def request(action, body = {})
|
def request(action, body = {})
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Generated with bin/fetch-telegram-methods
|
# Generated with bin/fetch-telegram-methods
|
||||||
# Bot API 4.7
|
# Bot API 5.0
|
||||||
|
|
||||||
getUpdates
|
getUpdates
|
||||||
setWebhook
|
setWebhook
|
||||||
@@ -7,8 +7,11 @@ deleteWebhook
|
|||||||
getWebhookInfo
|
getWebhookInfo
|
||||||
|
|
||||||
getMe
|
getMe
|
||||||
|
logOut
|
||||||
|
close
|
||||||
sendMessage
|
sendMessage
|
||||||
forwardMessage
|
forwardMessage
|
||||||
|
copyMessage
|
||||||
sendPhoto
|
sendPhoto
|
||||||
sendAudio
|
sendAudio
|
||||||
sendDocument
|
sendDocument
|
||||||
@@ -40,6 +43,7 @@ setChatTitle
|
|||||||
setChatDescription
|
setChatDescription
|
||||||
pinChatMessage
|
pinChatMessage
|
||||||
unpinChatMessage
|
unpinChatMessage
|
||||||
|
unpinAllChatMessages
|
||||||
leaveChat
|
leaveChat
|
||||||
getChat
|
getChat
|
||||||
getChatAdministrators
|
getChatAdministrators
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
require 'active_support/core_ext/hash/keys'
|
|
||||||
|
|
||||||
module Telegram
|
|
||||||
module Bot
|
|
||||||
module Initializers
|
|
||||||
# Accepts different options to initialize bot.
|
|
||||||
def wrap(input, **options)
|
|
||||||
case input
|
|
||||||
when Symbol then by_id(input) or raise "#{name} #{input.inspect} not configured"
|
|
||||||
when self then input
|
|
||||||
when Hash then new(**input.symbolize_keys, **options)
|
|
||||||
else new(input, **options)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def by_id(_id)
|
|
||||||
raise 'Not implemented'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
63
lib/telegram/bot/tasks.rb
Обычный файл
63
lib/telegram/bot/tasks.rb
Обычный файл
@@ -0,0 +1,63 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Telegram
|
||||||
|
module Bot
|
||||||
|
module Tasks
|
||||||
|
extend self
|
||||||
|
|
||||||
|
def set_webhook
|
||||||
|
routes = Rails.application.routes.url_helpers
|
||||||
|
cert_file = ENV['CERT']
|
||||||
|
cert = File.open(cert_file) if cert_file
|
||||||
|
each_bot do |key, bot|
|
||||||
|
route_name = RoutesHelper.route_name_for_bot(bot)
|
||||||
|
url = routes.send("#{route_name}_url")
|
||||||
|
say("Setting webhook for #{key}...")
|
||||||
|
bot.set_webhook(
|
||||||
|
url: url,
|
||||||
|
certificate: cert,
|
||||||
|
ip_address: ENV['IP_ADDRESS'],
|
||||||
|
drop_pending_updates: drop_pending_updates,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_webhook
|
||||||
|
each_bot do |key, bot|
|
||||||
|
say("Deleting webhook for #{key}...")
|
||||||
|
bot.delete_webhook(drop_pending_updates: drop_pending_updates)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def log_out
|
||||||
|
each_bot do |key, bot|
|
||||||
|
say("Logging out #{key}...")
|
||||||
|
bot.log_out
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def close
|
||||||
|
each_bot do |key, bot|
|
||||||
|
say("Closing #{key}...")
|
||||||
|
bot.close
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def say(text)
|
||||||
|
puts(text) unless Rails.env.test? # rubocop:disable Rails/Output
|
||||||
|
end
|
||||||
|
|
||||||
|
def each_bot(&block)
|
||||||
|
id = ENV['BOT'].try!(:to_sym)
|
||||||
|
bots = id ? {id => Client.by_id(id)} : Telegram.bots
|
||||||
|
bots.each { |key, bot| bot.async(false) { block[key, bot] } }
|
||||||
|
end
|
||||||
|
|
||||||
|
def drop_pending_updates
|
||||||
|
ENV['DROP_PENDING_UPDATES'].try!(:downcase) == 'true'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
74
spec/integration/tasks_spec.rb
Обычный файл
74
spec/integration/tasks_spec.rb
Обычный файл
@@ -0,0 +1,74 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'integration_helper'
|
||||||
|
|
||||||
|
RSpec.describe Telegram::Bot::Tasks, type: :request do
|
||||||
|
include Telegram::Bot::RSpec::ClientMatchers
|
||||||
|
|
||||||
|
def stub_env(new_values)
|
||||||
|
new_values.stringify_keys!
|
||||||
|
old_values = ENV.to_h.slice(new_values.keys)
|
||||||
|
new_values.each { |k, v| ENV[k] = v.to_s }
|
||||||
|
yield
|
||||||
|
ensure
|
||||||
|
new_values.each_key { |k| ENV[k] = old_values[k] }
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'uses BOT envar' do |bot_matcher|
|
||||||
|
it 'runs for all bots by default' do
|
||||||
|
matcher = Telegram.bots.values.map { |x| instance_exec(x, &bot_matcher) }.reduce(&:and)
|
||||||
|
expect(subject).to matcher
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when BOT specified' do
|
||||||
|
around { |ex| stub_env(BOT: :other) { ex.run } }
|
||||||
|
|
||||||
|
it 'runs for this bot only' do
|
||||||
|
expect(subject).to instance_exec(Telegram.bots[:other], &bot_matcher)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#log_out' do
|
||||||
|
subject { -> { described_class.log_out } }
|
||||||
|
include_examples 'uses BOT envar', ->(bot) { make_telegram_request(bot, :logOut) }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#close' do
|
||||||
|
subject { -> { described_class.close } }
|
||||||
|
include_examples 'uses BOT envar', ->(bot) { make_telegram_request(bot, :close) }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#set_webhook' do
|
||||||
|
subject { -> { described_class.set_webhook } }
|
||||||
|
include_examples 'uses BOT envar', ->(bot) { make_telegram_request(bot, :setWebhook) }
|
||||||
|
|
||||||
|
context 'with options in env' do
|
||||||
|
around do |ex|
|
||||||
|
stub_env(IP_ADDRESS: '1.2.3.4', DROP_PENDING_UPDATES: 'TrUe') do
|
||||||
|
ex.run
|
||||||
|
end
|
||||||
|
end
|
||||||
|
include_examples 'uses BOT envar', ->(bot) {
|
||||||
|
make_telegram_request(bot, :setWebhook).with(hash_including(
|
||||||
|
ip_address: '1.2.3.4',
|
||||||
|
drop_pending_updates: true,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#delete_webhook' do
|
||||||
|
subject { -> { described_class.delete_webhook } }
|
||||||
|
include_examples 'uses BOT envar', ->(bot) { make_telegram_request(bot, :deleteWebhook) }
|
||||||
|
|
||||||
|
context 'with options in env' do
|
||||||
|
around { |ex| stub_env(DROP_PENDING_UPDATES: 'TrUe') { ex.run } }
|
||||||
|
include_examples 'uses BOT envar', ->(bot) {
|
||||||
|
make_telegram_request(bot, :deleteWebhook).with(hash_including(
|
||||||
|
drop_pending_updates: true,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -14,6 +14,7 @@ class TestApplication < Rails::Application
|
|||||||
config.eager_load = false
|
config.eager_load = false
|
||||||
config.log_level = :debug
|
config.log_level = :debug
|
||||||
config.action_dispatch.show_exceptions = false
|
config.action_dispatch.show_exceptions = false
|
||||||
|
routes.default_url_options = {host: 'test.rpsec'}
|
||||||
|
|
||||||
telegram_config = {
|
telegram_config = {
|
||||||
bot: 'default_token',
|
bot: 'default_token',
|
||||||
|
|||||||
@@ -1,65 +0,0 @@
|
|||||||
RSpec.shared_examples 'initializers' do |config_method = :bots|
|
|
||||||
describe '.wrap' do
|
|
||||||
subject { described_class.wrap(input, **options) }
|
|
||||||
let(:options) { {} }
|
|
||||||
let(:result) { double(:result) }
|
|
||||||
let(:username) { 'username' }
|
|
||||||
|
|
||||||
context 'when input is a string' do
|
|
||||||
let(:input) { token }
|
|
||||||
|
|
||||||
it 'treats string as token' do
|
|
||||||
expect(described_class).to receive(:new).with(token, {}) { result }
|
|
||||||
should eq result
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'and additional options are given' do
|
|
||||||
let(:options) { {id: :test} }
|
|
||||||
|
|
||||||
it 'passes them to initializer' do
|
|
||||||
expect(described_class).to receive(:new).with(input, **options) { result }
|
|
||||||
should eq result
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when input is a hash' do
|
|
||||||
let(:input) { {token: token, 'username' => username, other: :options} }
|
|
||||||
|
|
||||||
it 'passes it with symbolized keys' do
|
|
||||||
expect(described_class).to receive(:new).with(**input.symbolize_keys) { result }
|
|
||||||
should eq result
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'and additional options are given' do
|
|
||||||
let(:options) { {id: :test} }
|
|
||||||
|
|
||||||
it 'passes them to initializer' do
|
|
||||||
expect(described_class).to receive(:new).
|
|
||||||
with(**input.symbolize_keys, **options) { result }
|
|
||||||
should eq result
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when input is an instance of described_class' do
|
|
||||||
let!(:input) { instance }
|
|
||||||
|
|
||||||
it 'returns input' do
|
|
||||||
expect(described_class).to_not receive(:new)
|
|
||||||
should eq input
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when input is a Symbol' do
|
|
||||||
let(:input) { :client_1 }
|
|
||||||
before { allow(Telegram).to receive(config_method) { {client_1: instance} } }
|
|
||||||
it { should eq Telegram.send(config_method)[:client_1] }
|
|
||||||
|
|
||||||
context 'and there is no such bot' do
|
|
||||||
let(:input) { :invalid }
|
|
||||||
it { expect { subject }.to raise_error(/not configured/) }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -2,9 +2,72 @@ RSpec.describe Telegram::Bot::Client do
|
|||||||
let(:instance) { described_class.new 'token' }
|
let(:instance) { described_class.new 'token' }
|
||||||
let(:token) { 'token' }
|
let(:token) { 'token' }
|
||||||
|
|
||||||
include_examples 'initializers'
|
|
||||||
it_behaves_like 'async', request_args: -> { [double(:action), {body: :content}] }
|
it_behaves_like 'async', request_args: -> { [double(:action), {body: :content}] }
|
||||||
|
|
||||||
|
describe '.wrap' do
|
||||||
|
subject { described_class.wrap(input, **options) }
|
||||||
|
let(:options) { {} }
|
||||||
|
let(:result) { double(:result) }
|
||||||
|
let(:username) { 'username' }
|
||||||
|
|
||||||
|
context 'when input is a string' do
|
||||||
|
let(:input) { token }
|
||||||
|
|
||||||
|
it 'treats string as token' do
|
||||||
|
expect(described_class).to receive(:new).with(token, {}) { result }
|
||||||
|
should eq result
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'and additional options are given' do
|
||||||
|
let(:options) { {id: :test} }
|
||||||
|
|
||||||
|
it 'passes them to initializer' do
|
||||||
|
expect(described_class).to receive(:new).with(input, **options) { result }
|
||||||
|
should eq result
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when input is a hash' do
|
||||||
|
let(:input) { {token: token, 'username' => username, other: :options} }
|
||||||
|
|
||||||
|
it 'passes it with symbolized keys' do
|
||||||
|
expect(described_class).to receive(:new).with(**input.symbolize_keys) { result }
|
||||||
|
should eq result
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'and additional options are given' do
|
||||||
|
let(:options) { {id: :test} }
|
||||||
|
|
||||||
|
it 'passes them to initializer' do
|
||||||
|
expect(described_class).to receive(:new).
|
||||||
|
with(**input.symbolize_keys, **options) { result }
|
||||||
|
should eq result
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when input is an instance of described_class' do
|
||||||
|
let!(:input) { instance }
|
||||||
|
|
||||||
|
it 'returns input' do
|
||||||
|
expect(described_class).to_not receive(:new)
|
||||||
|
should eq input
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when input is a Symbol' do
|
||||||
|
let(:input) { :client_1 }
|
||||||
|
before { allow(Telegram).to receive(:bots) { {client_1: instance} } }
|
||||||
|
it { should eq Telegram.bots[:client_1] }
|
||||||
|
|
||||||
|
context 'and there is no such bot' do
|
||||||
|
let(:input) { :invalid }
|
||||||
|
it { expect { subject }.to raise_error(/not configured/) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '.prepare_body' do
|
describe '.prepare_body' do
|
||||||
subject { described_class.prepare_body(input) }
|
subject { described_class.prepare_body(input) }
|
||||||
|
|
||||||
@@ -32,26 +95,45 @@ RSpec.describe Telegram::Bot::Client do
|
|||||||
|
|
||||||
describe '.new' do
|
describe '.new' do
|
||||||
subject { described_class.new(*args) }
|
subject { described_class.new(*args) }
|
||||||
|
let(:token) { 'secret' }
|
||||||
|
let(:username) { 'superbot' }
|
||||||
|
|
||||||
context 'when multiple args are given' do
|
context 'when multiple args are given' do
|
||||||
let(:args) { %w[secret superbot] }
|
let(:args) { [token, username] }
|
||||||
its(:token) { should eq args[0] }
|
its(:token) { should eq token }
|
||||||
its(:username) { should eq args[1] }
|
its(:username) { should eq username }
|
||||||
its(:base_uri) { should include args[0] }
|
its(:base_uri) { should eq "#{described_class::SERVER}/bot#{token}/" }
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when hash is given' do
|
context 'when hash is given' do
|
||||||
let(:args) { [token: 'secret', username: 'superbot'] }
|
let(:args) { [token: 'secret', username: 'superbot'] }
|
||||||
its(:token) { should eq args[0][:token] }
|
its(:token) { should eq token }
|
||||||
its(:username) { should eq args[0][:username] }
|
its(:username) { should eq username }
|
||||||
its(:base_uri) { should include args[0][:token] }
|
its(:base_uri) { should eq "#{described_class::SERVER}/bot#{token}/" }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with custom server' do
|
||||||
|
let(:server) { 'http://my.server' }
|
||||||
|
let(:args) { [token, username, server: server] }
|
||||||
|
its(:base_uri) { should eq "#{server}/bot#{token}/" }
|
||||||
|
|
||||||
|
context 'and hash options' do
|
||||||
|
let(:args) { [token: token, username: username, server: server] }
|
||||||
|
its(:base_uri) { should eq "#{server}/bot#{token}/" }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#request' do
|
describe '#request' do
|
||||||
subject { -> { instance.request(action, request_body) } }
|
subject { -> { instance.request(action, request_body) } }
|
||||||
let(:action) { :some_action }
|
let(:action) { :some_action }
|
||||||
let(:url) { "#{format(described_class::URL_TEMPLATE, token: token)}#{action}" }
|
let(:url) do
|
||||||
|
base_uri = format(described_class::URL_TEMPLATE,
|
||||||
|
server: described_class::SERVER,
|
||||||
|
token: token,
|
||||||
|
)
|
||||||
|
"#{base_uri}#{action}"
|
||||||
|
end
|
||||||
let(:request_body) { double(:body) }
|
let(:request_body) { double(:body) }
|
||||||
let(:prepared_body) { double(:prepared_body) }
|
let(:prepared_body) { double(:prepared_body) }
|
||||||
let(:response) { HTTP::Message.new_response(body).tap { |x| x.status = status } }
|
let(:response) { HTTP::Message.new_response(body).tap { |x| x.status = status } }
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user