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

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

...

12 Коммитов

Автор SHA1 Сообщение Дата
Max Melentiev
07faf87ed7 Merge pull request #163 from telegram-bot-rb/update_api
Update to Bot API 5.3
2021-06-25 19:43:17 +01:00
Max Melentiev
ac45940937 Switch from travis-ci.org to travis-ci.com 2021-06-25 19:42:59 +01:00
Max Melentiev
a49ef51da9 Update to Bot API 5.3 2021-06-25 19:31:28 +01:00
Max Melentiev
4f669fccc4 Merge pull request #157 from AlexVPopov/table-of-contents
Add a table of contents to README
2021-03-31 20:56:59 +01:00
Alexander Popov
e06252907a Add a table of contents to README 2021-03-31 21:11:08 +03:00
Max Melentiev
af229c8bcc Fix typos in readme, make some points more clear 2021-02-19 09:38:54 +00:00
Max Melentiev
a7cf3754be v0.15.3 2021-02-15 13:54:10 +00:00
Max Melentiev
783d9c13e9 Merge pull request #156 from telegram-bot-rb/ruby-3
Fix translation helpers to support ruby 3
2021-02-15 13:52:09 +00:00
Max Melentiev
5417511f06 Fix translation helpers to support ruby 3 2021-02-15 09:44:19 +00:00
Max Melentiev
a0ca383bab v0.15.2 2021-01-26 08:37:02 +00:00
Max Melentiev
1c141f782e Merge pull request #153 from telegram-bot-rb/ruby-3.0
Ruby 3.0 support
2021-01-26 08:30:24 +00:00
Max Melentiev
791c4233ca Ruby 3.0 support, drop support for Ruby < 2.4 2021-01-09 11:35:13 +00:00
22 изменённых файлов: 226 добавлений и 110 удалений

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

@@ -1,3 +1,5 @@
os: linux
dist: xenial
language: ruby language: ruby
cache: bundler cache: bundler
rvm: rvm:
@@ -7,8 +9,13 @@ gemfile:
- gemfiles/rails_61.gemfile - gemfiles/rails_61.gemfile
- gemfiles/rails_60.gemfile - gemfiles/rails_60.gemfile
- gemfiles/rails_52.gemfile - gemfiles/rails_52.gemfile
matrix: jobs:
include: include:
# ruby 3.x
- rvm: 3.0
gemfile: gemfiles/rails_61.gemfile
- rvm: 3.0
gemfile: gemfiles/rails_60.gemfile
# old rails # old rails
- rvm: 2.5 - rvm: 2.5
gemfile: gemfiles/rails_51.gemfile gemfile: gemfiles/rails_51.gemfile
@@ -19,7 +26,5 @@ matrix:
# old rubies # old rubies
- rvm: 2.4 - rvm: 2.4
gemfile: gemfiles/rails_52.gemfile gemfile: gemfiles/rails_52.gemfile
- rvm: 2.3
gemfile: gemfiles/rails_52.gemfile
notifications: notifications:
email: false email: false

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

@@ -1,5 +1,17 @@
# Unreleased # Unreleased
# 0.15.4
- Update to Bot API 5.3
# 0.15.3
- Ruby 3.0 support: fix translation helpers.
# 0.15.2
- Ruby 3.0 support. Drop support for Ruby < 2.4.
# 0.15.1 # 0.15.1
- Rails 6.1 support. - Rails 6.1 support.

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

@@ -4,17 +4,17 @@ gemspec
group :development do group :development do
gem 'appraisal', '~> 2.2' gem 'appraisal', '~> 2.2'
gem 'pry', '~> 0.10.1' gem 'pry', '~> 0.13.1'
gem 'pry-byebug', '~> 3.2.0' gem 'pry-byebug', '~> 3.9.0'
gem 'sdoc', '~> 0.4.1' gem 'sdoc', '~> 2.0.3'
gem 'telegram-bot-types', '~> 0.6.2' gem 'telegram-bot-types', '~> 0.6.3'
gem 'rspec', '~> 3.5.0' gem 'rspec', '~> 3.10.0'
gem 'rspec-its', '~> 1.1.0' gem 'rspec-its', '~> 1.3.0'
gem 'rspec-rails', '~> 3.5.0' gem 'rspec-rails', '~> 4.0.2'
gem 'rubocop', '~> 0.52.1' gem 'rubocop', '~> 0.52.1'
gem 'coveralls', '~> 0.8.2', require: false gem 'coveralls', '~> 0.8.23', require: false
end end

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

@@ -2,7 +2,7 @@
[![Gem Version](https://badge.fury.io/rb/telegram-bot.svg)](http://badge.fury.io/rb/telegram-bot) [![Gem Version](https://badge.fury.io/rb/telegram-bot.svg)](http://badge.fury.io/rb/telegram-bot)
[![Code Climate](https://codeclimate.com/github/telegram-bot-rb/telegram-bot/badges/gpa.svg)](https://codeclimate.com/github/telegram-bot-rb/telegram-bot) [![Code Climate](https://codeclimate.com/github/telegram-bot-rb/telegram-bot/badges/gpa.svg)](https://codeclimate.com/github/telegram-bot-rb/telegram-bot)
[![Build Status](https://travis-ci.org/telegram-bot-rb/telegram-bot.svg)](https://travis-ci.org/telegram-bot-rb/telegram-bot) [![Build Status](https://travis-ci.com/telegram-bot-rb/telegram-bot.svg)](https://travis-ci.com/telegram-bot-rb/telegram-bot)
Tools for developing Telegram bots. Best used with Rails, but can be used in Tools for developing Telegram bots. Best used with Rails, but can be used in
[standalone app](https://github.com/telegram-bot-rb/telegram-bot/wiki/Not-rails-application). [standalone app](https://github.com/telegram-bot-rb/telegram-bot/wiki/Not-rails-application).
@@ -25,9 +25,33 @@ 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 template](https://github.com/telegram-bot-rb/rails_template) And here is [app template](https://github.com/telegram-bot-rb/rails_template)
to generate clean app in seconds. to generate new rails app in seconds.
Examples and cookbook in [wiki](https://github.com/telegram-bot-rb/telegram-bot/wiki). See examples and cookbook in [the wiki](https://github.com/telegram-bot-rb/telegram-bot/wiki).
## Table of Contents
* [Installation](#installation)
* [Usage](#usage)
* [Configuration](#configuration)
* [Configuration in Rails app](#configuration-in-rails-app)
* [Client](#client)
* [Typed responses](#typed-responses)
* [Controller](#controller)
* [Reply helpers](#reply-helpers)
* [Optional typecasting](#optional-typecasting)
* [Session](#session)
* [Message context](#message-context)
* [Callback queries](#callback-queries)
* [Routes in Rails app](#routes-in-rails-app)
* [Processing updates](#processing-updates)
* [Development & Debugging](#development--debugging)
* [Testing](#testing)
* [Deployment](#deployment)
* [Async mode](#async-mode)
* [Limitations](#limitations)
* [Development](#development)
* [Contributing](#contributing)
## Installation ## Installation
@@ -39,11 +63,15 @@ gem 'telegram-bot'
And then execute: And then execute:
$ bundle ```
bundle
```
Or install it yourself as: Or install it yourself as:
$ gem install telegram-bot ```
gem install telegram-bot
```
Require if necessary: Require if necessary:
@@ -131,9 +159,9 @@ bot.send_message(chat_id: chat_id, text: 'Test')
``` ```
There is no magic, they just pass params as is and set `path_suffix`. There is no magic, they just pass params as is and set `path_suffix`.
See [`Client`](https://github.com/telegram-bot-rb/telegram-bot/blob/master/lib/telegram/bot/client.rb) See [list of available methods](https://github.com/telegram-bot-rb/telegram-bot/blob/master/lib/telegram/bot/client/api_methods.txt)
class for list of available methods. Please open PR or issue if it misses methods from fetched from [API docs](https://core.telegram.org/bots/api).
new API versions. Please open PR or issue if it misses methods from new API versions.
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::Forbidden` 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.
@@ -170,19 +198,18 @@ Bot controllers like usual rails controllers provides features like callbacks,
```ruby ```ruby
class Telegram::WebhookController < Telegram::Bot::UpdatesController class Telegram::WebhookController < Telegram::Bot::UpdatesController
# use callbacks like in any other controllers # use callbacks like in any other controller
around_action :with_locale around_action :with_locale
# Every update can have one of: message, inline_query, chosen_inline_result, # Every update has one of: message, inline_query, chosen_inline_result,
# callback_query, etc. # callback_query, etc.
# Define method with same name to respond to this updates. # Define method with the same name to handle this type of update.
def message(message) def message(message)
# message can be also accessed via instance method
message == self.payload # true
# store_message(message['text']) # store_message(message['text'])
end end
# This basic methods receives commonly used params: # For the following types of updates commonly used params are passed as arguments,
# full payload object is available with `payload` instance method.
# #
# message(payload) # message(payload)
# inline_query(query, offset) # inline_query(query, offset)
@@ -193,14 +220,19 @@ class Telegram::WebhookController < Telegram::Bot::UpdatesController
# Command arguments will be parsed and passed to the method. # Command arguments will be parsed and passed to the method.
# Be sure to use splat args and default values to not get errors when # Be sure to use splat args and default values to not get errors when
# someone passed more or less arguments in the message. # someone passed more or less arguments in the message.
def start!(data = nil, *) def start!(word = nil, *other_words)
# do_smth_with(data) # do_smth_with(word)
# full message object is also available via `payload` instance method:
# process_raw_message(payload['text'])
# There are `chat` & `from` shortcut methods. # There are `chat` & `from` shortcut methods.
# For callback queries `chat` if taken from `message` when it's available. # For callback queries `chat` is taken from `message` when it's available.
response = from ? "Hello #{from['username']}!" : 'Hi there!' response = from ? "Hello #{from['username']}!" : 'Hi there!'
# There is `respond_with` helper to set `chat_id` from received message: # There is `respond_with` helper to set `chat_id` from received message:
respond_with :message, text: response respond_with :message, text: response
# `reply_with` also sets `reply_to_message_id`: # `reply_with` also sets `reply_to_message_id`:
reply_with :photo, photo: File.open('party.jpg') reply_with :photo, photo: File.open('party.jpg')
end end
@@ -223,10 +255,10 @@ end
#### Reply helpers #### Reply helpers
There are helpers to respond for basic actions. They just set chat/message/query There are helpers for basic responses. They just set chat/message/query
identifiers from update. See identifiers from the update. See
[`ReplyHelpers`](https://github.com/telegram-bot-rb/telegram-bot/blob/master/lib/telegram/bot/updates_controller/reply_helpers.rb) [`ReplyHelpers`](https://github.com/telegram-bot-rb/telegram-bot/blob/master/lib/telegram/bot/updates_controller/reply_helpers.rb)
module for more information. Here are this methods signatures: module for more information. Here are these methods signatures:
```ruby ```ruby
def respond_with(type, params); end def respond_with(type, params); end
@@ -389,7 +421,7 @@ telegram_webhook TelegramAuctionController, :auction
telegram_webhook TelegramController, as: :custom_telegram_webhook telegram_webhook TelegramController, as: :custom_telegram_webhook
``` ```
#### Processesing updates #### Processing updates
To process update with controller call `.dispatch(bot, update)` on it. To process update with controller call `.dispatch(bot, update)` on it.
There are several options to run it automatically: There are several options to run it automatically:

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

@@ -7,15 +7,15 @@ gem "railties", "~> 4.2.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "pry", "~> 0.10.1" gem "pry", "~> 0.13.1"
gem "pry-byebug", "~> 3.2.0" gem "pry-byebug", "~> 3.9.0"
gem "sdoc", "~> 0.4.1" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.2" gem "telegram-bot-types", "~> 0.6.2"
gem "rspec", "~> 3.5.0" gem "rspec", "~> 3.10.0"
gem "rspec-its", "~> 1.1.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 3.5.0" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 0.52.1" gem "rubocop", "~> 0.52.1"
gem "coveralls", "~> 0.8.2", require: false gem "coveralls", "~> 0.8.23", require: false
end end
gemspec path: "../" gemspec path: "../"

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

@@ -7,15 +7,15 @@ gem "railties", "~> 5.0.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "pry", "~> 0.10.1" gem "pry", "~> 0.13.1"
gem "pry-byebug", "~> 3.2.0" gem "pry-byebug", "~> 3.9.0"
gem "sdoc", "~> 0.4.1" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.2" gem "telegram-bot-types", "~> 0.6.2"
gem "rspec", "~> 3.5.0" gem "rspec", "~> 3.10.0"
gem "rspec-its", "~> 1.1.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 3.5.0" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 0.52.1" gem "rubocop", "~> 0.52.1"
gem "coveralls", "~> 0.8.2", require: false gem "coveralls", "~> 0.8.23", require: false
end end
gemspec path: "../" gemspec path: "../"

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

@@ -7,15 +7,15 @@ gem "railties", "~> 5.1.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "pry", "~> 0.10.1" gem "pry", "~> 0.13.1"
gem "pry-byebug", "~> 3.2.0" gem "pry-byebug", "~> 3.9.0"
gem "sdoc", "~> 0.4.1" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.2" gem "telegram-bot-types", "~> 0.6.2"
gem "rspec", "~> 3.5.0" gem "rspec", "~> 3.10.0"
gem "rspec-its", "~> 1.1.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 3.5.0" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 0.52.1" gem "rubocop", "~> 0.52.1"
gem "coveralls", "~> 0.8.2", require: false gem "coveralls", "~> 0.8.23", require: false
end end
gemspec path: "../" gemspec path: "../"

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

@@ -7,15 +7,15 @@ gem "railties", "~> 5.2.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "pry", "~> 0.10.1" gem "pry", "~> 0.13.1"
gem "pry-byebug", "~> 3.2.0" gem "pry-byebug", "~> 3.9.0"
gem "sdoc", "~> 0.4.1" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.2" gem "telegram-bot-types", "~> 0.6.2"
gem "rspec", "~> 3.5.0" gem "rspec", "~> 3.10.0"
gem "rspec-its", "~> 1.1.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 3.5.0" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 0.52.1" gem "rubocop", "~> 0.52.1"
gem "coveralls", "~> 0.8.2", require: false gem "coveralls", "~> 0.8.23", require: false
end end
gemspec path: "../" gemspec path: "../"

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

@@ -7,15 +7,15 @@ gem "railties", "~> 6.0.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "pry", "~> 0.10.1" gem "pry", "~> 0.13.1"
gem "pry-byebug", "~> 3.2.0" gem "pry-byebug", "~> 3.9.0"
gem "sdoc", "~> 0.4.1" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.2" gem "telegram-bot-types", "~> 0.6.2"
gem "rspec", "~> 3.5.0" gem "rspec", "~> 3.10.0"
gem "rspec-its", "~> 1.1.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 3.5.0" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 0.52.1" gem "rubocop", "~> 0.52.1"
gem "coveralls", "~> 0.8.2", require: false gem "coveralls", "~> 0.8.23", require: false
end end
gemspec path: "../" gemspec path: "../"

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

@@ -7,15 +7,15 @@ gem "railties", "~> 6.1.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "pry", "~> 0.10.1" gem "pry", "~> 0.13.1"
gem "pry-byebug", "~> 3.2.0" gem "pry-byebug", "~> 3.9.0"
gem "sdoc", "~> 0.4.1" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.2" gem "telegram-bot-types", "~> 0.6.2"
gem "rspec", "~> 3.5.0" gem "rspec", "~> 3.10.0"
gem "rspec-its", "~> 1.1.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 3.5.0" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 0.52.1" gem "rubocop", "~> 0.52.1"
gem "coveralls", "~> 0.8.2", require: false gem "coveralls", "~> 0.8.23", require: false
end end
gemspec path: "../" gemspec path: "../"

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

@@ -1,5 +1,5 @@
# Generated with bin/fetch-telegram-methods # Generated with bin/fetch-telegram-methods
# Bot API 5.0 # Bot API 5.3
getUpdates getUpdates
setWebhook setWebhook
@@ -30,13 +30,16 @@ sendDice
sendChatAction sendChatAction
getUserProfilePhotos getUserProfilePhotos
getFile getFile
kickChatMember banChatMember
unbanChatMember unbanChatMember
restrictChatMember restrictChatMember
promoteChatMember promoteChatMember
setChatAdministratorCustomTitle setChatAdministratorCustomTitle
setChatPermissions setChatPermissions
exportChatInviteLink exportChatInviteLink
createChatInviteLink
editChatInviteLink
revokeChatInviteLink
setChatPhoto setChatPhoto
deleteChatPhoto deleteChatPhoto
setChatTitle setChatTitle
@@ -47,12 +50,13 @@ unpinAllChatMessages
leaveChat leaveChat
getChat getChat
getChatAdministrators getChatAdministrators
getChatMembersCount getChatMemberCount
getChatMember getChatMember
setChatStickerSet setChatStickerSet
deleteChatStickerSet deleteChatStickerSet
answerCallbackQuery answerCallbackQuery
setMyCommands setMyCommands
deleteMyCommands
getMyCommands getMyCommands
editMessageText editMessageText

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

@@ -5,11 +5,11 @@ module Telegram
attr_reader :requests attr_reader :requests
module StubbedConstructor module StubbedConstructor
def new(*args) def new(*args, **kwargs)
if self == ClientStub || !ClientStub.stub_all? if self == ClientStub || !ClientStub.stub_all?
super super
else else
ClientStub.new(*args) ClientStub.new(*args, **kwargs)
end end
end end
end end

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

@@ -99,6 +99,8 @@ module Telegram
pre_checkout_query pre_checkout_query
poll poll
poll_answer poll_answer
my_chat_member
chat_member
].freeze ].freeze
class << self class << self

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

@@ -12,15 +12,15 @@ module Telegram
module ClassMethods module ClassMethods
# Class-level helper for lazy translations. # Class-level helper for lazy translations.
def translate(key, options = {}) def translate(key, **options)
key = "#{controller_path.tr('/', '.')}#{key}" if key.to_s.start_with?('.') key = "#{controller_path.tr('/', '.')}#{key}" if key.to_s.start_with?('.')
I18n.translate(key, options) I18n.translate(key, **options)
end end
alias :t :translate alias :t :translate
end end
# See toplevel description. # See toplevel description.
def translate(key, options = {}) def translate(key, **options)
if key.to_s.start_with?('.') if key.to_s.start_with?('.')
path = controller_path.tr('/', '.') path = controller_path.tr('/', '.')
defaults = [:"#{path}#{key}"] defaults = [:"#{path}#{key}"]
@@ -28,7 +28,7 @@ module Telegram
options[:default] = defaults.flatten options[:default] = defaults.flatten
key = "#{path}.#{action_name_i18n_key}#{key}" key = "#{path}.#{action_name_i18n_key}#{key}"
end end
I18n.translate(key, options) I18n.translate(key, **options)
end end
alias :t :translate alias :t :translate

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

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

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

@@ -1,4 +1,4 @@
RSpec.shared_examples 'async' do |request_args: -> {}| RSpec.shared_examples 'async' do |request_args:|
let(:instance) { described_class.new(token: token, id: id, async: async) } let(:instance) { described_class.new(token: token, id: id, async: async) }
let(:id) { :default_bot } let(:id) { :default_bot }
let(:async) { true } let(:async) { true }
@@ -103,7 +103,7 @@ RSpec.shared_examples 'async' do |request_args: -> {}|
end end
describe '#request' do describe '#request' do
subject { ->(*args) { instance.request(*(args.empty? ? self.args : args)) } } subject { ->(*args) { instance.request(*args) } }
let(:args, &request_args) let(:args, &request_args)
let(:result) { double(:result) } let(:result) { double(:result) }
@@ -112,7 +112,7 @@ RSpec.shared_examples 'async' do |request_args: -> {}|
expect(instance).to_not receive(:http_request) expect(instance).to_not receive(:http_request)
expect(described_class).to receive(:prepare_async_args).with(*args) { args } expect(described_class).to receive(:prepare_async_args).with(*args) { args }
expect(instance.async).to receive(:perform_later).with(id.to_s, *args) { result } expect(instance.async).to receive(:perform_later).with(id.to_s, *args) { result }
expect(subject.call).to eq result expect(subject.call(*args)).to eq result
end end
end end
@@ -131,12 +131,11 @@ RSpec.shared_examples 'async' do |request_args: -> {}|
context 'when async is disabled' do context 'when async is disabled' do
let(:async) { false } let(:async) { false }
let(:result) { double(status: 200, body: '{"test":"ok"}') } let(:result) { double(status: 200, body: '{"test":"ok"}') }
let(:args, &request_args)
it 'performs request immediately' do it 'performs request immediately' do
expect(instance).to receive(:request).with(*args).and_call_original expect(instance).to receive(:request).with(*args).and_call_original
expect(instance).to receive(:http_request) { result } expect(instance).to receive(:http_request) { result }
expect(subject[]).to eq 'test' => 'ok' expect(subject.call(*args)).to eq 'test' => 'ok'
end end
end end
end end

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

@@ -14,7 +14,10 @@ RSpec.describe Telegram::Bot::Client do
let(:input) { token } let(:input) { token }
it 'treats string as token' do it 'treats string as token' do
expect(described_class).to receive(:new).with(token, {}) { result } expect(described_class).to receive(:new) do |*args, **kwargs|
expect([*args, kwargs]).to eq([token, {}]) # not using .with to support ruby 2.x and 3.x
result
end
should eq result should eq result
end end
@@ -94,7 +97,9 @@ RSpec.describe Telegram::Bot::Client do
end end
describe '.new' do describe '.new' do
subject { described_class.new(*args) } subject { described_class.new(*args, **kwargs) }
let(:args) { [] }
let(:kwargs) { {} }
let(:token) { 'secret' } let(:token) { 'secret' }
let(:username) { 'superbot' } let(:username) { 'superbot' }
@@ -106,7 +111,7 @@ RSpec.describe Telegram::Bot::Client do
end end
context 'when hash is given' do context 'when hash is given' do
let(:args) { [token: 'secret', username: 'superbot'] } let(:kwargs) { {token: 'secret', username: 'superbot'} }
its(:token) { should eq token } its(:token) { should eq token }
its(:username) { should eq username } its(:username) { should eq username }
its(:base_uri) { should eq "#{described_class::SERVER}/bot#{token}/" } its(:base_uri) { should eq "#{described_class::SERVER}/bot#{token}/" }
@@ -114,11 +119,12 @@ RSpec.describe Telegram::Bot::Client do
context 'with custom server' do context 'with custom server' do
let(:server) { 'http://my.server' } let(:server) { 'http://my.server' }
let(:args) { [token, username, server: server] } let(:args) { [token, username] }
let(:kwargs) { {server: server} }
its(:base_uri) { should eq "#{server}/bot#{token}/" } its(:base_uri) { should eq "#{server}/bot#{token}/" }
context 'and hash options' do context 'and hash options' do
let(:args) { [token: token, username: username, server: server] } let(:kwargs) { {token: token, username: username, server: server} }
its(:base_uri) { should eq "#{server}/bot#{token}/" } its(:base_uri) { should eq "#{server}/bot#{token}/" }
end end
end end

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

@@ -37,11 +37,13 @@ RSpec.describe Telegram::Bot::ClientStub do
end end
describe '#new' do describe '#new' do
subject { described_class.new(*args) } subject { described_class.new(*args, **kwargs) }
let(:args) { [] }
let(:kwargs) { {} }
context 'when only username is given' do context 'when only username is given' do
let(:args) { 'superbot' } let(:args) { ['superbot'] }
its(:username) { should eq args } its(:username) { should eq args[0] }
end end
context 'when username and token are given' do context 'when username and token are given' do
@@ -51,9 +53,9 @@ RSpec.describe Telegram::Bot::ClientStub do
end end
context 'when hash config is given' do context 'when hash config is given' do
let(:args) { [token: 'token', username: 'superbot'] } let(:kwargs) { {token: 'token', username: 'superbot'} }
its(:token) { should eq args[0][:token] } its(:token) { should eq kwargs[:token] }
its(:username) { should eq args[0][:username] } its(:username) { should eq kwargs[:username] }
end end
end end
end end

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

@@ -41,7 +41,7 @@ RSpec.describe Telegram::Bot::RoutesHelper do
end end
describe '#telegram_webhook' do describe '#telegram_webhook' do
subject { ->(*args) { mapper.telegram_webhook(*args) } } subject { ->(*args, **kwargs) { mapper.telegram_webhook(*args, **kwargs) } }
let(:mapper) { double(:mapper).tap { |x| x.extend described_class } } let(:mapper) { double(:mapper).tap { |x| x.extend described_class } }
let(:controller) { double(:controller, name: :controller) } let(:controller) { double(:controller, name: :controller) }
before { allow(Telegram).to receive(:bots) { bots } } before { allow(Telegram).to receive(:bots) { bots } }

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

@@ -1,5 +1,26 @@
RSpec.describe Telegram::Bot::UpdatesController::Translation do RSpec.describe Telegram::Bot::UpdatesController::Translation do
def self.stub_translations(translations)
around do |ex|
backend = I18n.backend
I18n.backend = I18n::Backend::Simple.new
begin
I18n.backend.store_translations 'en', telegram: {webhooks: translations}
ex.run
ensure
I18n.backend = backend
end
end
end
let(:result) { double(:result) }
describe '#translate' do describe '#translate' do
stub_translations(
start: {
hello: 'Hello from start!',
hi: 'Hi %{name} from start', # rubocop:disable Style/FormatStringToken
},
)
let(:controller) do let(:controller) do
double( double(
controller_path: 'telegram/webhooks', controller_path: 'telegram/webhooks',
@@ -10,12 +31,28 @@ RSpec.describe Telegram::Bot::UpdatesController::Translation do
it 'uses action_name without ! for lazy translations' do it 'uses action_name without ! for lazy translations' do
expect(I18n).to receive(:translate).with('telegram.webhooks.start.hello', expect(I18n).to receive(:translate).with('telegram.webhooks.start.hello',
default: [:'telegram.webhooks.hello'], default: [:'telegram.webhooks.hello'],
) ) { result }
controller.t('.hello') expect(controller.t('.hello')).to eq(result)
expect(I18n).to receive(:translate).with('telegram.webhooks.start.hi',
default: [:'telegram.webhooks.hi'],
name: 'Dude',
) { result }
expect(controller.t('.hi', name: 'Dude')).to eq(result)
end
it 'translates' do
expect(controller.t('.hello')).to eq('Hello from start!')
expect(controller.t('.hi', name: 'Dude')).to eq('Hi Dude from start')
end end
end end
describe described_class::ClassMethods do describe described_class::ClassMethods do
stub_translations(
hello: 'Hello!',
hi: 'Hi %{name}', # rubocop:disable Style/FormatStringToken
)
describe '#translate' do describe '#translate' do
let(:controller_class) do let(:controller_class) do
double(controller_path: 'telegram/webhooks'). double(controller_path: 'telegram/webhooks').
@@ -23,8 +60,20 @@ RSpec.describe Telegram::Bot::UpdatesController::Translation do
end end
it 'uses controller_path for lazy translations' do it 'uses controller_path for lazy translations' do
expect(I18n).to receive(:translate).with('telegram.webhooks.hello', {}) expect(I18n).to receive(:translate) do |*args, **kwargs|
controller_class.t('.hello') # not using .with to support ruby 2.x and 3.x
expect([*args, kwargs]).to eq(['telegram.webhooks.hello', {}])
result
end
expect(controller_class.t('.hello')).to eq(result)
expect(I18n).to receive(:translate).with('telegram.webhooks.hi', name: 'Dude') { result }
expect(controller_class.t('.hi', name: 'Dude')).to eq(result)
end
it 'translates' do
expect(controller_class.t('.hello')).to eq('Hello!')
expect(controller_class.t('.hi', name: 'Dude')).to eq('Hi Dude')
end end
end end
end end

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

@@ -9,14 +9,19 @@ RSpec.describe Telegram::Bot::UpdatesController::TypedUpdate do
context 'when `update` is a virtus model' do context 'when `update` is a virtus model' do
subject { controller } subject { controller }
unique_types = Telegram::Bot::UpdatesController::PAYLOAD_TYPES - %w[ unique_types = (Telegram::Bot::UpdatesController::PAYLOAD_TYPES - %w[
edited_message edited_message
channel_post channel_post
edited_channel_post edited_channel_post
] my_chat_member
unique_types.each do |type| chat_member
]).
map { |x| [x, Telegram::Bot::Types.const_get(type.camelize)] }.to_h.
merge(
'chat_member' => Telegram::Bot::Types::ChatMemberUpdated
)
unique_types.each do |type, type_class|
context "with #{type}" do context "with #{type}" do
type_class = Telegram::Bot::Types.const_get(type.camelize)
let(:payload_type) { type } let(:payload_type) { type }
let(:payload) do let(:payload) do
{}.tap do |result| {}.tap do |result|

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

@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.require_paths = ['lib'] spec.require_paths = ['lib']
spec.required_ruby_version = '~> 2.0' spec.required_ruby_version = '>= 2.4'
spec.add_dependency 'actionpack', '>= 4.0', '< 6.2' spec.add_dependency 'actionpack', '>= 4.0', '< 6.2'
spec.add_dependency 'activesupport', '>= 4.0', '< 6.2' spec.add_dependency 'activesupport', '>= 4.0', '< 6.2'