зеркало из
https://github.com/glebtv/telegram-bot.git
synced 2026-08-28 15:26:18 +03:00
Сравнить коммиты
19 Коммитов
| Автор | SHA1 | Дата | |
|---|---|---|---|
|
|
ca4ea9e6cb | ||
|
|
68ec0257bd | ||
|
|
b50bd30137 | ||
|
|
80362da270 | ||
|
|
294d762785 | ||
|
|
1cb3265371 | ||
|
|
c44529725f | ||
|
|
fa43561765 | ||
|
|
cea856c928 | ||
|
|
5a93c1efc6 | ||
|
|
38ee303912 | ||
|
|
380d13f65a | ||
|
|
20427499c3 | ||
|
|
8936a7a96c | ||
|
|
e2e32e041a | ||
|
|
543258fa11 | ||
|
|
4bf5956b41 | ||
|
|
8b6dc60aaa | ||
|
|
b6bef94081 |
@@ -25,10 +25,3 @@ matrix:
|
||||
gemfile: gemfiles/rails_60.gemfile
|
||||
notifications:
|
||||
email: false
|
||||
|
||||
# for 2.5.0 until 2.5.1 is released:
|
||||
# https://github.com/travis-ci/travis-ci/issues/8978
|
||||
# https://github.com/travis-ci/travis-ci/issues/8969#issuecomment-354135622
|
||||
before_install:
|
||||
- gem update --system
|
||||
- gem install bundler
|
||||
|
||||
12
CHANGELOG.md
12
CHANGELOG.md
@@ -1,5 +1,17 @@
|
||||
# Unreleased
|
||||
|
||||
# 0.14.2
|
||||
|
||||
- Add reply helpers: `answer_pre_checkout_query`, `answer_shipping_query`.
|
||||
- Update to Bot API 4.3.
|
||||
|
||||
# 0.14.1
|
||||
|
||||
- Read config from secrets when credentials don't provide it in rails >= 5.2.
|
||||
- Remove botan.io support. It's already shut down, so it should not be a braking change.
|
||||
https://github.com/botanio/sdk#this-service-will-be-shut-down-on-25th-may-2018
|
||||
- Update to Bot API 4.1.
|
||||
|
||||
# 0.14.0
|
||||
|
||||
- Make integration & controller specs consistent.
|
||||
|
||||
80
README.md
80
README.md
@@ -4,7 +4,7 @@
|
||||
[](https://codeclimate.com/github/telegram-bot-rb/telegram-bot)
|
||||
[](https://travis-ci.org/telegram-bot-rb/telegram-bot)
|
||||
|
||||
__Breaking changes in v0.14!__ See [upgrading guide](https://github.com/telegram-bot-rb/telegram-bot/wiki/Upgrading-to-0.14).
|
||||
__Breaking changes in v0.14!__ See [upgrade guide](https://github.com/telegram-bot-rb/telegram-bot/wiki/Upgrading-to-0.14).
|
||||
|
||||
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).
|
||||
@@ -19,7 +19,7 @@ Package contains:
|
||||
- Middleware and routes helpers for production env.
|
||||
- Poller with automatic source-reloader for development env.
|
||||
- Rake tasks to update webhook urls.
|
||||
- __[Async mode](#async-mode)__ for Telegram and/or Botan API.
|
||||
- __[Async mode](#async-mode)__.
|
||||
Let the queue adapter handle network errors!
|
||||
|
||||
Here is sample [telegram_bot_app](https://github.com/telegram-bot-rb/telegram_bot_app)
|
||||
@@ -55,9 +55,28 @@ require 'telegram/bot'
|
||||
|
||||
## Usage
|
||||
|
||||
### Configuration
|
||||
|
||||
While clients can be instantiated explicitly, there is `Telegram.bots_config=` method
|
||||
to configure app-wide clients, which are accessible via `Telegram.bots`.
|
||||
It accepts hash of `{bot_id: bot_config}`, and there is special id `:default`
|
||||
which is used for `Telegram.bot`.
|
||||
|
||||
```ruby
|
||||
Telegram.bots_config = {
|
||||
default: DEFAULT_BOT_TOKEN,
|
||||
chat: {token: CHAT_BOT_TOKEN, username: 'chatbot'},
|
||||
}
|
||||
|
||||
Telegram.bot.get_updates
|
||||
Telegram.bot == Telegram.bots[:default] # true
|
||||
Telegram.bots[:chat].send_message(...)
|
||||
```
|
||||
|
||||
### Configuration in Rails app
|
||||
|
||||
Add `telegram` section into `secrets.yml`:
|
||||
In Rails app `Telegram.bots_config` is read from `secrets.yml` automatically
|
||||
from `telegram` section:
|
||||
|
||||
```yml
|
||||
development:
|
||||
@@ -79,6 +98,17 @@ development:
|
||||
username: ChatBot
|
||||
```
|
||||
|
||||
For Rails >= 5.2 `Telegram::Bot` searches for config first in credentials and then in secrets.
|
||||
To use credentials as config store, add telegram section to credentials instead of secrets using
|
||||
`rails credentials:edit`. In this case be aware of that [Rails < 6.0 may not load
|
||||
credentials in dev environment by default](https://github.com/telegram-bot-rb/telegram-bot/issues/74#issuecomment-384205609).
|
||||
In Rails >= 6.0 run `rails credentials:edit --environment development` to configure bot
|
||||
in each environment.
|
||||
|
||||
I suggest not using Rails 5.2 credentials because it can lead to leakage of sensitive data
|
||||
and it's more difficult to use in multiple environments. See
|
||||
[secure_credentials](https://github.com/printercu/secure_credentials) gem for better option.
|
||||
|
||||
From now clients will be accessible with `Telegram.bots[:chat]` or `Telegram.bots[:auction]`.
|
||||
Single bot can be accessed with `Telegram.bot` or `Telegram.bots[:default]`.
|
||||
|
||||
@@ -201,12 +231,14 @@ def reply_with(type, params); end
|
||||
def answer_inline_query(results, params = {}); end
|
||||
def answer_callback_query(text, params = {}); end
|
||||
def edit_message(type, params = {}); end
|
||||
def answer_pre_checkout_query(ok, params = {}); end
|
||||
def answer_shipping_query(ok, params = {}); end
|
||||
```
|
||||
|
||||
#### Optional typecasting
|
||||
|
||||
You can enable typecasting of `update` with `telegram-bot-types` by including
|
||||
`Telegram::Bot::UpdatesPoller::TypedUpdate`:
|
||||
`Telegram::Bot::UpdatesController::TypedUpdate`:
|
||||
|
||||
```ruby
|
||||
class Telegram::WebhookController < Telegram::Bot::UpdatesController
|
||||
@@ -494,48 +526,12 @@ While webhooks-mode is prefered, poller still can be used in production.
|
||||
See [comparison and examples](https://github.com/telegram-bot-rb/telegram-bot/wiki/Deployment)
|
||||
for details.
|
||||
|
||||
### Botan.io metrics
|
||||
|
||||
Initialize with `bot = Telegram::Bot::Client.new(token, botan: 'botan token')`
|
||||
or just add `botan` key in `secrets.yml`:
|
||||
|
||||
```yml
|
||||
telegram:
|
||||
bot:
|
||||
token: bot_token
|
||||
botan: botan_token
|
||||
```
|
||||
|
||||
Access to Botan client with `bot.botan`.
|
||||
Use `bot.botan.track(event, uid, payload)` to track events.
|
||||
|
||||
There are some helpers for controllers in `Telegram::Bot::Botan::ControllerHelpers`:
|
||||
|
||||
```ruby
|
||||
class Telegram::WebhookController < Telegram::Bot::UpdatesController
|
||||
include Telegram::Bot::Botan::ControllerHelpers
|
||||
|
||||
# This will track with event: action_name & data: payload
|
||||
before_action :botan_track_action
|
||||
|
||||
def smth(*)
|
||||
# This will track event for current user only when botan is configured.
|
||||
botan_track :my_event, custom_data
|
||||
|
||||
# or get access directly to botan client:
|
||||
botan.track(...)
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
There is no stubbing for botan clients, so don't set botan token in tests.
|
||||
|
||||
### Async mode
|
||||
|
||||
There is built in support for async requests using ActiveJob. Without Rails
|
||||
you can implement your own worker class to handle such requests. This allows:
|
||||
|
||||
- Process updates very fast, without waiting for telegram and botan responses.
|
||||
- Process updates very fast, without waiting for telegram responses.
|
||||
- Handle and retry network and other errors with queue adapter.
|
||||
- ???
|
||||
|
||||
@@ -543,7 +539,7 @@ Instead of performing request instantly client serializes it, pushes to queue,
|
||||
and immediately return control back. The job is then fetched with a worker
|
||||
and real API request is performed. And this all is absolutely transparent for the app.
|
||||
|
||||
To enable this mode add `async: true` to bot's and botan's config.
|
||||
To enable this mode add `async: true` to bot's config.
|
||||
For more information and custom configuration check out
|
||||
[docs](http://www.rubydoc.info/github/telegram-bot-rb/telegram-bot/master/Telegram/Bot/Async) or
|
||||
[source](https://github.com/telegram-bot-rb/telegram-bot/blob/master/lib/telegram/bot/async.rb).
|
||||
|
||||
@@ -22,7 +22,6 @@ module Telegram
|
||||
end
|
||||
|
||||
autoload :Async, 'telegram/bot/async'
|
||||
autoload :Botan, 'telegram/bot/botan'
|
||||
autoload :Client, 'telegram/bot/client'
|
||||
autoload :ClientStub, 'telegram/bot/client_stub'
|
||||
autoload :DebugClient, 'telegram/bot/debug_client'
|
||||
|
||||
@@ -1,20 +1,15 @@
|
||||
module Telegram
|
||||
module Bot
|
||||
# Telegram & Botan clients can perform requests in async way with
|
||||
# Telegram clients can perform requests in async way with
|
||||
# any job adapter (ActiveJob by default). Using Rails you don't need any
|
||||
# additional configuration. However you may want to enable async requests
|
||||
# by default with `async: true` in `secrets.yml`. Botan client doesn't inherit
|
||||
# async setting from client and must be configured separately.
|
||||
# by default with `async: true` in `secrets.yml`.
|
||||
#
|
||||
# telegram:
|
||||
# bots:
|
||||
# chat_async:
|
||||
# token: secret
|
||||
# async: true # enable async mode for client
|
||||
# botan: botan_token # in this way botan will not be async
|
||||
# botan: # in this way - it's in async mode
|
||||
# token: botan_token
|
||||
# async: true
|
||||
#
|
||||
# Without Rails To start using async requests
|
||||
# initialize client with `id` kwarg and make sure the client is
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
module Telegram
|
||||
module Bot
|
||||
class Botan
|
||||
TRACK_URI = 'https://api.botan.io/track'.freeze
|
||||
|
||||
autoload :ClientHelpers, 'telegram/bot/botan/client_helpers'
|
||||
autoload :ControllerHelpers, 'telegram/bot/botan/controller_helpers'
|
||||
class Error < Bot::Error; end
|
||||
|
||||
extend Initializers
|
||||
prepend Async
|
||||
include DebugClient
|
||||
|
||||
class << self
|
||||
def by_id(id)
|
||||
Telegram.botans[id]
|
||||
end
|
||||
|
||||
def prepare_async_args(method, uri, query = {}, body = nil)
|
||||
[method.to_s, uri.to_s, Async.prepare_hash(query), body]
|
||||
end
|
||||
end
|
||||
|
||||
attr_reader :client, :token
|
||||
|
||||
def initialize(token = nil, **options)
|
||||
@client = HTTPClient.new
|
||||
@token = token || options[:token]
|
||||
end
|
||||
|
||||
def track(event, uid, payload = {})
|
||||
request(:post, TRACK_URI, {name: event, uid: uid}, payload.to_json)
|
||||
end
|
||||
|
||||
def request(method, uri, query = {}, body = nil)
|
||||
res = http_request(method, uri, query.merge(token: token), body)
|
||||
status = res.status
|
||||
return JSON.parse(res.body) if status < 300
|
||||
result = JSON.parse(res.body) rescue nil # rubocop:disable RescueModifier
|
||||
err_msg = "#{res.reason}: #{result && result['info'] || '-'}"
|
||||
raise Error, err_msg
|
||||
end
|
||||
|
||||
def http_request(method, uri, query, body)
|
||||
client.request(method, uri, query, body)
|
||||
end
|
||||
|
||||
def inspect
|
||||
"#<#{self.class.name}##{object_id}(#{@id})>"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,15 +0,0 @@
|
||||
module Telegram
|
||||
module Bot
|
||||
class Botan
|
||||
# Helpers for botan.io metrics.
|
||||
module ClientHelpers
|
||||
attr_reader :botan
|
||||
|
||||
def initialize(*, botan: nil, **options)
|
||||
super
|
||||
@botan = Botan.wrap(botan, id: id) if botan
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,33 +0,0 @@
|
||||
module Telegram
|
||||
module Bot
|
||||
class Botan
|
||||
# Helpers for botan.io metrics.
|
||||
module ControllerHelpers
|
||||
class MissingFrom < Error; end
|
||||
|
||||
protected
|
||||
|
||||
def botan
|
||||
@botan ||= bot.try!(:botan)
|
||||
end
|
||||
|
||||
# Track custom event for user taken from `from` field:
|
||||
#
|
||||
# botan_track :my_event, {data: :val}
|
||||
#
|
||||
def botan_track(event, data = {})
|
||||
raise MissingFrom, 'Can not track without user' unless from
|
||||
botan.try! { |x| x.track(event, from['id'], data) }
|
||||
end
|
||||
|
||||
# Track current action and payload for current user. Best used with `before_action`:
|
||||
#
|
||||
# before_action :botan_track_action
|
||||
#
|
||||
def botan_track_action
|
||||
botan_track(action_name, payload)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -9,7 +9,6 @@ module Telegram
|
||||
autoload :TypedResponse, 'telegram/bot/client/typed_response'
|
||||
extend Initializers
|
||||
prepend Async
|
||||
prepend Botan::ClientHelpers
|
||||
include DebugClient
|
||||
|
||||
require 'telegram/bot/client/api_helper'
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Generated with bin/fetch-telegram-methods
|
||||
# Bot API 3.5.
|
||||
# Bot API 4.3
|
||||
|
||||
getUpdates
|
||||
setWebhook
|
||||
@@ -13,6 +13,7 @@ sendPhoto
|
||||
sendAudio
|
||||
sendDocument
|
||||
sendVideo
|
||||
sendAnimation
|
||||
sendVoice
|
||||
sendVideoNote
|
||||
sendMediaGroup
|
||||
@@ -21,6 +22,7 @@ editMessageLiveLocation
|
||||
stopMessageLiveLocation
|
||||
sendVenue
|
||||
sendContact
|
||||
sendPoll
|
||||
sendChatAction
|
||||
getUserProfilePhotos
|
||||
getFile
|
||||
@@ -46,7 +48,9 @@ answerCallbackQuery
|
||||
|
||||
editMessageText
|
||||
editMessageCaption
|
||||
editMessageMedia
|
||||
editMessageReplyMarkup
|
||||
stopPoll
|
||||
deleteMessage
|
||||
|
||||
sendSticker
|
||||
@@ -63,6 +67,8 @@ sendInvoice
|
||||
answerShippingQuery
|
||||
answerPreCheckoutQuery
|
||||
|
||||
setPassportDataErrors
|
||||
|
||||
sendGame
|
||||
setGameScore
|
||||
getGameHighScores
|
||||
|
||||
@@ -40,11 +40,6 @@ module Telegram
|
||||
end
|
||||
end
|
||||
|
||||
# Hash of botan clients made from #bots.
|
||||
def botans
|
||||
@botans ||= bots.map { |k, v| [k, v.botan] }.to_h
|
||||
end
|
||||
|
||||
# Returns config for .bots method. By default uses `telegram['bots']` section
|
||||
# from `secrets.yml` merging `telegram['bot']` at `:default` key.
|
||||
#
|
||||
@@ -53,10 +48,12 @@ module Telegram
|
||||
@bots_config ||=
|
||||
if defined?(Rails.application)
|
||||
app = Rails.application
|
||||
store = app.respond_to?(:credentials) ? app.credentials : app.secrets
|
||||
secrets = store.fetch(:telegram, {}).with_indifferent_access
|
||||
secrets.fetch(:bots, {}).symbolize_keys.tap do |config|
|
||||
default = secrets[:bot]
|
||||
store = app.credentials[:telegram] if app.respond_to?(:credentials)
|
||||
store ||= app.secrets[:telegram] if app.respond_to?(:secrets)
|
||||
store ||= {}
|
||||
store = store.with_indifferent_access
|
||||
store.fetch(:bots, {}).symbolize_keys.tap do |config|
|
||||
default = store[:bot]
|
||||
config[:default] = default if default
|
||||
end
|
||||
else
|
||||
@@ -69,7 +66,6 @@ module Telegram
|
||||
@bots = nil
|
||||
@bot = nil
|
||||
@bots_config = nil
|
||||
@botans = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -7,13 +7,13 @@ module Telegram
|
||||
module Bot
|
||||
# Base class to create update processors. With callbacks, session and helpers.
|
||||
#
|
||||
# Define public methods for each command and they will be called when
|
||||
# update has this command. Message is automatically parsed and
|
||||
# words are passed as method arguments. Be sure to use default values and
|
||||
# Public methods ending with `!` handle messages with commands.
|
||||
# Message text is automatically parsed into method arguments.
|
||||
# Be sure to use default values and
|
||||
# splat arguments in every action method to not get errors, when user
|
||||
# sends command without necessary args / with extra args.
|
||||
#
|
||||
# def start(token = nil, *)
|
||||
# def start!(token = nil, *)
|
||||
# if token
|
||||
# # ...
|
||||
# else
|
||||
@@ -21,25 +21,21 @@ module Telegram
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# def help(*)
|
||||
# def help!(*)
|
||||
# respond_with :message, text:
|
||||
# end
|
||||
#
|
||||
# To process plain text messages (without commands) or other updates just
|
||||
# define public method with name of payload type. They will receive payload
|
||||
# as an argument.
|
||||
# define public method with name of payload type.
|
||||
# By default they receive payload as an argument, but some of them are called
|
||||
# with more usefuk args:
|
||||
#
|
||||
# def message(message)
|
||||
# respond_with :message, text: "Echo: #{message['text']}"
|
||||
# end
|
||||
#
|
||||
# def inline_query(query)
|
||||
# answer_inline_query results_for_query(query), is_personal: true
|
||||
# end
|
||||
#
|
||||
# # To process conflicting commands (`/message args`) just use `on_` prefix:
|
||||
# def on_message(*args)
|
||||
# # ...
|
||||
# def inline_query(query, offset)
|
||||
# answer_inline_query results_for_query(query, offset), is_personal: true
|
||||
# end
|
||||
#
|
||||
# To process update run:
|
||||
|
||||
@@ -21,7 +21,7 @@ module Telegram
|
||||
respond_with(type, params)
|
||||
end
|
||||
|
||||
# Same as reply_with, but for inline queries.
|
||||
# Same as respond_with, but for inline queries.
|
||||
def answer_inline_query(results, params = {})
|
||||
params = params.merge(
|
||||
inline_query_id: payload['id'],
|
||||
@@ -30,7 +30,7 @@ module Telegram
|
||||
bot.answer_inline_query(params)
|
||||
end
|
||||
|
||||
# Same as reply_with, but for callback queries.
|
||||
# Same as respond_with, but for callback queries.
|
||||
def answer_callback_query(text, params = {})
|
||||
params = params.merge(
|
||||
callback_query_id: payload['id'],
|
||||
@@ -39,6 +39,23 @@ module Telegram
|
||||
bot.answer_callback_query(params)
|
||||
end
|
||||
|
||||
# Same as respond_with, but for pre checkout queries.
|
||||
def answer_pre_checkout_query(ok, params = {})
|
||||
params = params.merge(
|
||||
pre_checkout_query_id: payload['id'],
|
||||
ok: ok,
|
||||
)
|
||||
bot.answer_pre_checkout_query(params)
|
||||
end
|
||||
|
||||
def answer_shipping_query(ok, params = {})
|
||||
params = params.merge(
|
||||
shipping_query_id: payload['id'],
|
||||
ok: ok,
|
||||
)
|
||||
bot.answer_shipping_query(params)
|
||||
end
|
||||
|
||||
# Edit message from callback query.
|
||||
def edit_message(type, params = {})
|
||||
params =
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
module Telegram
|
||||
module Bot
|
||||
VERSION = '0.14.0'.freeze
|
||||
VERSION = '0.14.2'.freeze
|
||||
|
||||
def self.gem_version
|
||||
Gem::Version.new VERSION
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
RSpec.describe Telegram::Bot::Client do
|
||||
let(:instance) { described_class.new(*client_args) }
|
||||
let(:token) { 'token' }
|
||||
let(:botan_token) { double(:botan_token) }
|
||||
let(:client_id) { 'client_id' }
|
||||
let(:client_args) { [token] }
|
||||
|
||||
describe '#botan' do
|
||||
subject { instance.botan }
|
||||
it { should eq nil }
|
||||
|
||||
context 'when botan token is set' do
|
||||
let(:client_args) { [token, id: client_id, async: Class.new, botan: botan_token] }
|
||||
it { should be_instance_of Telegram::Bot::Botan }
|
||||
its(:token) { should eq botan_token }
|
||||
its(:id) { should eq client_id }
|
||||
|
||||
it 'doesnt inherit async from client' do
|
||||
expect(instance.async).to be
|
||||
expect(subject.async).to_not be
|
||||
end
|
||||
end
|
||||
|
||||
context 'when botan is configured with hash' do
|
||||
let(:client_args) { [token, id: client_id, async: Class.new, botan: botan_config] }
|
||||
let(:botan_config) { {token: botan_token, async: Class.new} }
|
||||
it { should be_instance_of Telegram::Bot::Botan }
|
||||
its(:token) { should eq botan_token }
|
||||
its(:id) { should eq client_id }
|
||||
its(:async) { should eq botan_config[:async] }
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,54 +0,0 @@
|
||||
RSpec.describe Telegram::Bot::Botan::ControllerHelpers do
|
||||
include_context 'telegram/bot/updates_controller'
|
||||
let(:controller_class) do
|
||||
described_class = self.described_class
|
||||
Class.new(Telegram::Bot::UpdatesController) do
|
||||
include described_class
|
||||
end
|
||||
end
|
||||
let(:botan) { double(:botan) }
|
||||
let(:result) { double(:result) }
|
||||
let(:payload) { {from: {id: user_id}} }
|
||||
let(:payload_type) { :message }
|
||||
let(:user_id) { double(:user_id) }
|
||||
before { allow(bot).to receive(:botan) { botan } }
|
||||
|
||||
shared_examples 'basic tracking' do
|
||||
context 'when botan is not configured' do
|
||||
let(:botan) {}
|
||||
it { should eq nil }
|
||||
end
|
||||
|
||||
context 'when `from` is empty' do
|
||||
let(:payload) { {text: 'test'} }
|
||||
it { expect { subject }.to raise_error described_class::MissingFrom }
|
||||
end
|
||||
end
|
||||
|
||||
describe '#botan_track' do
|
||||
subject { controller.send(:botan_track, event, data) }
|
||||
let(:event) { double(:event) }
|
||||
let(:data) { double(:data) }
|
||||
|
||||
it 'calls botan#track' do
|
||||
expect(botan).to receive(:track).with(event, user_id, data) { result }
|
||||
should eq result
|
||||
end
|
||||
|
||||
include_examples 'basic tracking'
|
||||
end
|
||||
|
||||
describe '#botan_track_action' do
|
||||
subject { controller.send(:botan_track_action) }
|
||||
let(:action_name) { double(:action_name) }
|
||||
|
||||
it 'calls botan#track with current action and payload' do
|
||||
expect(controller).to receive(:action_name) { action_name }
|
||||
expect(botan).to receive(:track).
|
||||
with(action_name, user_id, deep_stringify(payload)) { result }
|
||||
should eq result
|
||||
end
|
||||
|
||||
include_examples 'basic tracking'
|
||||
end
|
||||
end
|
||||
@@ -1,27 +0,0 @@
|
||||
RSpec.describe Telegram::Bot::Botan do
|
||||
let(:instance) { described_class.new 'token' }
|
||||
let(:token) { 'token' }
|
||||
|
||||
include_examples 'initializers', :botans
|
||||
it_behaves_like 'async', request_args: -> { [double(:method), double(:url)] }
|
||||
|
||||
describe '.new' do
|
||||
subject { described_class.new(*args) }
|
||||
|
||||
context 'when usual args are given' do
|
||||
let(:args) { ['secret'] }
|
||||
its(:token) { should eq args[0] }
|
||||
end
|
||||
|
||||
context 'when options are given' do
|
||||
let(:args) { [token: 'secret'] }
|
||||
its(:token) { should eq args[0][:token] }
|
||||
end
|
||||
end
|
||||
|
||||
describe '.prepare_async_args' do
|
||||
subject { described_class.prepare_async_args(*input) }
|
||||
let(:input) { [:post, :uri, {a: 1, b: :sym, 'd' => 'str'}, 'body'] }
|
||||
it { should eq ['post', 'uri', {a: 1, b: 'sym', 'd' => 'str'}, 'body'] }
|
||||
end
|
||||
end
|
||||
@@ -1,7 +1,6 @@
|
||||
RSpec.describe Telegram::Bot::Client do
|
||||
let(:instance) { described_class.new 'token' }
|
||||
let(:token) { 'token' }
|
||||
let(:botan_token) { double(:botan_token) }
|
||||
|
||||
include_examples 'initializers'
|
||||
it_behaves_like 'async', request_args: -> { [double(:action), {body: :content}] }
|
||||
|
||||
@@ -11,12 +11,10 @@ RSpec.describe Telegram::Bot::ConfigMethods do
|
||||
chat: {
|
||||
token: 'chat_token',
|
||||
username: 'Chat',
|
||||
botan: 'chat_botan_token',
|
||||
},
|
||||
other_chat: {
|
||||
'token' => 'other_chat_token',
|
||||
'username' => 'OtherChat',
|
||||
'botan' => 'other_chat_botan_token',
|
||||
},
|
||||
}
|
||||
end
|
||||
@@ -43,7 +41,6 @@ RSpec.describe Telegram::Bot::ConfigMethods do
|
||||
its(:id) { should eq :chat }
|
||||
its(:token) { should eq config[:chat][:token] }
|
||||
its(:username) { should eq config[:chat][:username] }
|
||||
its('botan.token') { should eq config[:chat][:botan] }
|
||||
end
|
||||
|
||||
context 'configured by hash with stringified keys' do
|
||||
@@ -51,18 +48,6 @@ RSpec.describe Telegram::Bot::ConfigMethods do
|
||||
its(:id) { should eq :other_chat }
|
||||
its(:token) { should eq config[:other_chat]['token'] }
|
||||
its(:username) { should eq config[:other_chat]['username'] }
|
||||
its('botan.token') { should eq config[:other_chat]['botan'] }
|
||||
end
|
||||
end
|
||||
|
||||
describe '#botans' do
|
||||
subject { registry.botans }
|
||||
it do
|
||||
should eq(
|
||||
default: nil,
|
||||
chat: registry.bots[:chat].botan,
|
||||
other_chat: registry.bots[:other_chat].botan,
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -76,13 +61,14 @@ RSpec.describe Telegram::Bot::ConfigMethods do
|
||||
it { should eq({}) }
|
||||
|
||||
context 'in rails environment' do
|
||||
before { stub_const('Rails', double(application: double(secrets: secrets))) }
|
||||
before { stub_const('Rails', double(application: double(app_stub))) }
|
||||
let(:app_stub) { {secrets: secrets} }
|
||||
let(:secrets) { {} }
|
||||
it { should eq({}) }
|
||||
|
||||
context 'when there is telegram section in secrets' do
|
||||
let(:secrets) { {telegram: config.stringify_keys} }
|
||||
let(:config) do
|
||||
let(:secrets) { {telegram: secrets_config} }
|
||||
let(:secrets_config) do
|
||||
{
|
||||
bot: double(:bot_config),
|
||||
bots: {
|
||||
@@ -91,13 +77,21 @@ RSpec.describe Telegram::Bot::ConfigMethods do
|
||||
},
|
||||
}
|
||||
end
|
||||
it { should include default: config[:bot] }
|
||||
it { should include config[:bots] }
|
||||
it { should include default: secrets_config[:bot] }
|
||||
it { should include secrets_config[:bots] }
|
||||
|
||||
context 'on rails >5.1 (deep symbolized keys)' do
|
||||
let(:secrets) { {telegram: config.deep_symbolize_keys} }
|
||||
it { should include default: config[:bot] }
|
||||
it { should include config[:bots] }
|
||||
let(:secrets) { super().deep_symbolize_keys }
|
||||
it { should include default: secrets_config[:bot] }
|
||||
it { should include secrets_config[:bots] }
|
||||
end
|
||||
|
||||
context 'and credentials (>= 5.2)' do
|
||||
let(:app_stub) { super().merge(credentials: credentials) }
|
||||
let(:credentials) { {telegram: credentials_config} }
|
||||
let(:credentials_config) { {bot: double(:credentials_bot_config)} }
|
||||
it { should include default: credentials_config[:bot] }
|
||||
it { should_not include secrets[:bots] }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -26,6 +26,6 @@ Gem::Specification.new do |spec|
|
||||
spec.add_dependency 'activesupport', '>= 4.0', '< 6.0'
|
||||
spec.add_dependency 'httpclient', '~> 2.7'
|
||||
|
||||
spec.add_development_dependency 'bundler', '~> 1.16'
|
||||
spec.add_development_dependency 'bundler', '> 1.16'
|
||||
spec.add_development_dependency 'rake', '~> 10.0'
|
||||
end
|
||||
|
||||
Ссылка в новой задаче
Block a user