From 2fffdeb475150467e176d166f977c1c10eb2946c Mon Sep 17 00:00:00 2001 From: Max Melentiev Date: Mon, 15 May 2017 22:09:14 +0600 Subject: [PATCH] Integration test with rails app and two bots --- .gitignore | 1 + CHANGELOG.md | 4 ++ Gemfile | 25 +++++--- lib/telegram/bot/client_stub.rb | 1 + lib/telegram/bot/rspec/integration.rb | 2 +- spec/integration/requests/default_bot_spec.rb | 8 +++ spec/integration/requests/other_bot_spec.rb | 9 +++ spec/integration_helper.rb | 63 +++++++++++++++++++ spec/telegram/bot/client_stub_spec.rb | 2 +- spec/telegram/bot/config_methods_spec.rb | 1 + 10 files changed, 105 insertions(+), 11 deletions(-) create mode 100644 spec/integration/requests/default_bot_spec.rb create mode 100644 spec/integration/requests/other_bot_spec.rb create mode 100644 spec/integration_helper.rb diff --git a/.gitignore b/.gitignore index 0cb6eeb..f927afa 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ /doc/ /pkg/ /spec/reports/ +/log/ /tmp/ diff --git a/CHANGELOG.md b/CHANGELOG.md index f1f7553..9f5d2ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# Unreleased + +- ClientStub saves and returns token. Fixes testing multiple bots. + # 0.11.3 - Release dependencies for Rails 5.1. diff --git a/Gemfile b/Gemfile index 8479821..b2ef288 100644 --- a/Gemfile +++ b/Gemfile @@ -1,16 +1,22 @@ source 'https://rubygems.org' gemspec -case ENV['RAILS'] -when '5_1' - gem 'actionpack', '5.1.0' -when '5' - gem 'actionpack', '5.0.2' -when '4' - gem 'actionpack', '~> 4.2' -end - group :development do + case ENV['RAILS'] + when '5_1' + gem 'railties', '5.1.0' + gem 'actionpack', '5.1.0' + when '5' + gem 'railties', '5.0.2' + gem 'actionpack', '5.0.2' + when '4' + gem 'railties', '~> 4.2' + gem 'actionpack', '~> 4.2' + else + gem 'railties' + gem 'actionpack' + end + gem 'sdoc', '~> 0.4.1' gem 'pry', '~> 0.10.1' gem 'pry-byebug', '~> 3.2.0' @@ -19,6 +25,7 @@ group :development do gem 'rspec', '~> 3.5.0' gem 'rspec-its', '~> 1.1.0' + gem 'rspec-rails', '~> 3.5.0' gem 'rubocop', '~> 0.37.0' diff --git a/lib/telegram/bot/client_stub.rb b/lib/telegram/bot/client_stub.rb index f9dc75c..0f080fa 100644 --- a/lib/telegram/bot/client_stub.rb +++ b/lib/telegram/bot/client_stub.rb @@ -35,6 +35,7 @@ module Telegram end def initialize(token = nil, username = nil, **options) + @token = token @username = username || options[:username] || token reset end diff --git a/lib/telegram/bot/rspec/integration.rb b/lib/telegram/bot/rspec/integration.rb index aebcf6a..84d1a24 100644 --- a/lib/telegram/bot/rspec/integration.rb +++ b/lib/telegram/bot/rspec/integration.rb @@ -14,7 +14,7 @@ RSpec.shared_context 'telegram/bot/integration' do } end let(:clear_session?) { described_class.respond_to?(:session_store) } - before { described_class.session_store.clear if clear_session? } + before { described_class.session_store.try!(:clear) if clear_session? } include Telegram::Bot::RSpec::ClientMatchers diff --git a/spec/integration/requests/default_bot_spec.rb b/spec/integration/requests/default_bot_spec.rb new file mode 100644 index 0000000..5d6f40f --- /dev/null +++ b/spec/integration/requests/default_bot_spec.rb @@ -0,0 +1,8 @@ +require 'integration_helper' + +RSpec.describe DefaultBotController, :telegram_bot, type: :request do + describe '#start' do + subject { -> { dispatch_command :start } } + it { should respond_with_message 'from default' } + end +end diff --git a/spec/integration/requests/other_bot_spec.rb b/spec/integration/requests/other_bot_spec.rb new file mode 100644 index 0000000..7139dc4 --- /dev/null +++ b/spec/integration/requests/other_bot_spec.rb @@ -0,0 +1,9 @@ +require 'integration_helper' + +RSpec.describe OtherBotController, :telegram_bot, type: :request do + let(:bot) { Telegram.bots[:other] } + describe '#start' do + subject { -> { dispatch_command :start } } + it { should respond_with_message 'from other' } + end +end diff --git a/spec/integration_helper.rb b/spec/integration_helper.rb new file mode 100644 index 0000000..e00682f --- /dev/null +++ b/spec/integration_helper.rb @@ -0,0 +1,63 @@ +require 'telegram/bot/rspec/integration' +require 'action_controller' +require 'action_dispatch' +require 'action_dispatch/testing/integration' + +require 'rails' +require 'rspec/rails/adapters' +require 'rspec/rails/fixture_support' +require 'rspec/rails/example/rails_example_group' +require 'rspec/rails/example/request_example_group' + +ENV['RAILS_ENV'] = 'test' +class TestApplication < Rails::Application + config.eager_load = false + config.log_level = :debug + secrets[:secret_key_base] = 'test' + secrets[:telegram] = { + bot: 'default_token', + bots: { + other: {token: 'other_token'}, + }, + } +end +Rails.application.initialize! + +# # Controllers +class DefaultBotController < Telegram::Bot::UpdatesController + def start(*) + respond_with :message, text: 'from default' + end +end + +class OtherBotController < Telegram::Bot::UpdatesController + def start(*) + respond_with :message, text: 'from other' + end +end + +RSpec.configure do |config| + config.include RSpec::Rails::RequestExampleGroup, type: :request + + config.around type: :request do |ex| + begin + Telegram.reset_bots + Telegram::Bot::ClientStub.stub_all! + ex.run + ensure + Telegram.reset_bots + Telegram::Bot::ClientStub.stub_all!(false) + end + end + + config.before type: :request do + # Redefine routes before every example, so it does not depent on order. + Rails.application.routes.draw do + require 'telegram/bot/routes_helper' + extend Telegram::Bot::RoutesHelper + + telegram_webhooks default: DefaultBotController, + other: OtherBotController + end + end +end diff --git a/spec/telegram/bot/client_stub_spec.rb b/spec/telegram/bot/client_stub_spec.rb index 59390e2..56c4c8d 100644 --- a/spec/telegram/bot/client_stub_spec.rb +++ b/spec/telegram/bot/client_stub_spec.rb @@ -46,7 +46,7 @@ RSpec.describe Telegram::Bot::ClientStub do context 'when username and token are given' do let(:args) { %w(token superbot) } - its(:token) { should eq nil } + its(:token) { should eq args[0] } its(:username) { should eq args[1] } end end diff --git a/spec/telegram/bot/config_methods_spec.rb b/spec/telegram/bot/config_methods_spec.rb index b1c6a37..bdcfa9f 100644 --- a/spec/telegram/bot/config_methods_spec.rb +++ b/spec/telegram/bot/config_methods_spec.rb @@ -72,6 +72,7 @@ RSpec.describe Telegram::Bot::ConfigMethods do context 'when not configured' do let(:registry) { Object.new.tap { |x| x.extend described_class } } + before { hide_const('Rails') } it { should eq({}) } context 'in rails environment' do