From b341c109d94336ba74794bb0369d881378bddc39 Mon Sep 17 00:00:00 2001 From: Emily Stolfo Date: Fri, 21 Sep 2018 17:53:32 +0200 Subject: [PATCH] [RAILS] Convert tests to rspec --- elasticsearch-rails/Gemfile | 14 ++-- elasticsearch-rails/Rakefile | 20 ++--- .../spec/instrumentation_spec.rb | 81 +++++++++++++++++++ elasticsearch-rails/spec/lograge_spec.rb | 17 ++++ elasticsearch-rails/spec/spec_helper.rb | 45 +++++++++++ elasticsearch-rails/test/test_helper.rb | 67 --------------- .../instrumentation/instrumentation_test.rb | 61 -------------- .../test/unit/instrumentation/lograge_test.rb | 21 ----- 8 files changed, 156 insertions(+), 170 deletions(-) create mode 100644 elasticsearch-rails/spec/instrumentation_spec.rb create mode 100644 elasticsearch-rails/spec/lograge_spec.rb create mode 100644 elasticsearch-rails/spec/spec_helper.rb delete mode 100644 elasticsearch-rails/test/test_helper.rb delete mode 100644 elasticsearch-rails/test/unit/instrumentation/instrumentation_test.rb delete mode 100644 elasticsearch-rails/test/unit/instrumentation/lograge_test.rb diff --git a/elasticsearch-rails/Gemfile b/elasticsearch-rails/Gemfile index 81fc68ac4..407f94341 100644 --- a/elasticsearch-rails/Gemfile +++ b/elasticsearch-rails/Gemfile @@ -3,12 +3,12 @@ source 'https://rubygems.org' # Specify your gem's dependencies in elasticsearch-rails.gemspec gemspec -# TODO: Figure out how to specify dependency on local elasticsearch-model without endless "Resolving dependencies" -# if File.exists? File.expand_path("../../elasticsearch-model", __FILE__) -# gem 'elasticsearch-model', :path => File.expand_path("../../elasticsearch-model", __FILE__), :require => true -# end - - - gem 'elasticsearch-model', :path => File.expand_path("../../elasticsearch-model", __FILE__), :require => false gem 'elasticsearch-persistence', :path => File.expand_path("../../elasticsearch-persistence", __FILE__), :require => false + + +group :development, :testing do + gem 'rspec' + gem 'pry-nav' + gem 'sqlite3' unless defined?(JRUBY_VERSION) +end diff --git a/elasticsearch-rails/Rakefile b/elasticsearch-rails/Rakefile index f555aaf42..0d87185d4 100644 --- a/elasticsearch-rails/Rakefile +++ b/elasticsearch-rails/Rakefile @@ -7,24 +7,16 @@ task :test => 'test:unit' # ----- Test tasks ------------------------------------------------------------ require 'rake/testtask' +require 'rspec/core/rake_task' + namespace :test do - Rake::TestTask.new(:unit) do |test| - test.libs << 'lib' << 'test' - test.test_files = FileList["test/unit/**/*_test.rb"] - test.verbose = false - test.warning = false - end - Rake::TestTask.new(:integration) do |test| - test.libs << 'lib' << 'test' - test.test_files = FileList["test/integration/**/*_test.rb"] - test.verbose = false - test.warning = false - end + RSpec::Core::RakeTask.new(:spec) Rake::TestTask.new(:all) do |test| - test.libs << 'lib' << 'test' - test.test_files = FileList["test/unit/**/*_test.rb", "test/integration/**/*_test.rb"] + test.verbose = false + test.warning = false + test.deps = [ :spec ] unless defined?(JRUBY_VERSION) end end diff --git a/elasticsearch-rails/spec/instrumentation_spec.rb b/elasticsearch-rails/spec/instrumentation_spec.rb new file mode 100644 index 000000000..2327800d1 --- /dev/null +++ b/elasticsearch-rails/spec/instrumentation_spec.rb @@ -0,0 +1,81 @@ +require 'spec_helper' + +describe 'ActiveSupport::Instrumentation integration' do + + before(:all) do + class DummyInstrumentationModel + extend Elasticsearch::Model::Searching::ClassMethods + + def self.index_name; 'foo'; end + def self.document_type; 'bar'; end + end + end + + after(:all) do + remove_classes(DummyInstrumentationModel) + end + + let(:response_document) do + { 'took' => '5ms', + 'hits' => { 'total' => 123, + 'max_score' => 456, + 'hits' => [] } } + end + + let(:search) do + Elasticsearch::Model::Searching::SearchRequest.new(DummyInstrumentationModel, 'foo') + end + + let(:client) do + double('client', search: response_document) + end + + before do + allow(DummyInstrumentationModel).to receive(:client).and_return(client) + Elasticsearch::Rails::Instrumentation::Railtie.run_initializers + end + + context 'SearchRequest#execute!' do + + it 'wraps the method with instrumentation' do + expect(search).to respond_to(:execute_without_instrumentation!) + expect(search).to respond_to(:execute_with_instrumentation!) + end + end + + context 'Model#search' do + + before do + expect(ActiveSupport::Notifications).to receive(:instrument).with('search.elasticsearch', + { klass: 'DummyInstrumentationModel', + name: 'Search', + search: { body: query, + index: 'foo', + type: 'bar' } }).and_return({}) + end + + let(:query) do + { query: { match: { foo: 'bar' } } } + end + + let(:logged_message) do + @logger.logged(:debug).first + end + + it 'publishes a notification' do + expect(DummyInstrumentationModel.search(query).response).to eq({}) + end + + context 'when a message is logged', unless: defined?(RUBY_VERSION) && RUBY_VERSION > '2.2' do + + let(:query) do + { query: { match: { moo: 'bam' } } } + end + + it 'prints the debug information to the log' do + expect(logged_message).to match(/DummyInstrumentationModel Search \(\d+\.\d+ms\)/) + expect(logged_message).to match(/body\: \{query\: \{match\: \{moo\: "bam"\}\}\}\}/) + end + end + end +end diff --git a/elasticsearch-rails/spec/lograge_spec.rb b/elasticsearch-rails/spec/lograge_spec.rb new file mode 100644 index 000000000..3192d4089 --- /dev/null +++ b/elasticsearch-rails/spec/lograge_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' +require 'action_pack' +require 'lograge' +require 'elasticsearch/rails/lograge' + +describe 'ActiveSupport::Instrumentation integration' do + + before do + Elasticsearch::Rails::Lograge::Railtie.run_initializers + end + + it 'customizes the Lograge configuration' do + expect(Elasticsearch::Rails::Lograge::Railtie.initializers + .select { |i| i.name == 'elasticsearch.lograge' } + .first).not_to be_nil + end +end diff --git a/elasticsearch-rails/spec/spec_helper.rb b/elasticsearch-rails/spec/spec_helper.rb new file mode 100644 index 000000000..d92dc5233 --- /dev/null +++ b/elasticsearch-rails/spec/spec_helper.rb @@ -0,0 +1,45 @@ +require 'pry-nav' +require 'active_record' +require 'elasticsearch/model' +require 'elasticsearch/rails' +require 'rails/railtie' +require 'elasticsearch/rails/instrumentation' + + +unless defined?(ELASTICSEARCH_URL) + ELASTICSEARCH_URL = ENV['ELASTICSEARCH_URL'] || "localhost:#{(ENV['TEST_CLUSTER_PORT'] || 9200)}" +end + +RSpec.configure do |config| + config.formatter = 'documentation' + config.color = true + + config.before(:suite) do + require 'ansi' + tracer = ::Logger.new(STDERR) + tracer.formatter = lambda { |s, d, p, m| "#{m.gsub(/^.*$/) { |n| ' ' + n }.ansi(:faint)}\n" } + Elasticsearch::Model.client = Elasticsearch::Client.new host: ELASTICSEARCH_URL, + tracer: (ENV['QUIET'] ? nil : tracer) + + unless ActiveRecord::Base.connected? + ActiveRecord::Base.establish_connection( :adapter => 'sqlite3', :database => ":memory:" ) + end + + if ::ActiveRecord::Base.respond_to?(:raise_in_transactional_callbacks) && ::ActiveRecord::VERSION::MAJOR.to_s < '5' + ::ActiveRecord::Base.raise_in_transactional_callbacks = true + end + end +end + +# Remove all classes. +# +# @param [ Array ] classes The list of classes to remove. +# +# @return [ true ] +# +# @since 6.0.1 +def remove_classes(*classes) + classes.each do |_class| + Object.send(:remove_const, _class.name.to_sym) if defined?(_class) + end and true +end diff --git a/elasticsearch-rails/test/test_helper.rb b/elasticsearch-rails/test/test_helper.rb deleted file mode 100644 index bc96002c5..000000000 --- a/elasticsearch-rails/test/test_helper.rb +++ /dev/null @@ -1,67 +0,0 @@ -RUBY_1_8 = defined?(RUBY_VERSION) && RUBY_VERSION < '1.9' -unless defined?(ELASTICSEARCH_URL) - ELASTICSEARCH_URL = ENV['ELASTICSEARCH_URL'] || "localhost:#{(ENV['TEST_CLUSTER_PORT'] || 9200)}" -end - -exit(0) if RUBY_1_8 - -require 'simplecov' and SimpleCov.start { add_filter "/test|test_/" } if ENV["COVERAGE"] - -# Register `at_exit` handler for integration tests shutdown. -# MUST be called before requiring `test/unit`. -at_exit { Elasticsearch::Test::IntegrationTestCase.__run_at_exit_hooks } - -puts '-'*80 - -if defined?(RUBY_VERSION) && RUBY_VERSION > '2.2' - require 'test-unit' - require 'mocha/test_unit' -else - require 'minitest/autorun' - require 'mocha/mini_test' -end - -require 'shoulda-context' - -require 'turn' unless ENV["TM_FILEPATH"] || ENV["NOTURN"] || defined?(RUBY_VERSION) && RUBY_VERSION > '2.2' - -require 'ansi' -require 'oj' unless defined?(JRUBY_VERSION) - -require 'rails/version' -require 'active_record' -require 'active_model' - -require 'elasticsearch/model' -require 'elasticsearch/rails' - -require 'elasticsearch/extensions/test/cluster' -require 'elasticsearch/extensions/test/startup_shutdown' - -module Elasticsearch - module Test - class IntegrationTestCase < ::Test::Unit::TestCase - extend Elasticsearch::Extensions::Test::StartupShutdown - - startup { Elasticsearch::Extensions::Test::Cluster.start(nodes: 1) if ENV['SERVER'] and not Elasticsearch::Extensions::Test::Cluster.running? } - shutdown { Elasticsearch::Extensions::Test::Cluster.stop if ENV['SERVER'] && started? } - context "IntegrationTest" do; should "noop on Ruby 1.8" do; end; end if RUBY_1_8 - - def setup - ActiveRecord::Base.establish_connection( :adapter => 'sqlite3', :database => ":memory:" ) - logger = ::Logger.new(STDERR) - logger.formatter = lambda { |s, d, p, m| "#{m.ansi(:faint, :cyan)}\n" } - ActiveRecord::Base.logger = logger unless ENV['QUIET'] - - ActiveRecord::LogSubscriber.colorize_logging = false - ActiveRecord::Migration.verbose = false - - tracer = ::Logger.new(STDERR) - tracer.formatter = lambda { |s, d, p, m| "#{m.gsub(/^.*$/) { |n| ' ' + n }.ansi(:faint)}\n" } - - Elasticsearch::Model.client = Elasticsearch::Client.new host: ELASTICSEARCH_URL, - tracer: (ENV['QUIET'] ? nil : tracer) - end - end - end -end diff --git a/elasticsearch-rails/test/unit/instrumentation/instrumentation_test.rb b/elasticsearch-rails/test/unit/instrumentation/instrumentation_test.rb deleted file mode 100644 index 51cd3c669..000000000 --- a/elasticsearch-rails/test/unit/instrumentation/instrumentation_test.rb +++ /dev/null @@ -1,61 +0,0 @@ -require 'test_helper' - -require 'rails/railtie' -require 'active_support/log_subscriber/test_helper' - -require 'elasticsearch/rails/instrumentation' - -class Elasticsearch::Rails::InstrumentationTest < Test::Unit::TestCase - include ActiveSupport::LogSubscriber::TestHelper - - context "ActiveSupport::Instrumentation integration" do - class ::DummyInstrumentationModel - extend Elasticsearch::Model::Searching::ClassMethods - - def self.index_name; 'foo'; end - def self.document_type; 'bar'; end - end - - RESPONSE = { 'took' => '5ms', 'hits' => { 'total' => 123, 'max_score' => 456, 'hits' => [] } } - - setup do - @search = Elasticsearch::Model::Searching::SearchRequest.new ::DummyInstrumentationModel, '*' - - @client = stub('client', search: RESPONSE) - DummyInstrumentationModel.stubs(:client).returns(@client) - - Elasticsearch::Rails::Instrumentation::Railtie.run_initializers - end - - should "wrap SearchRequest#execute! with instrumentation" do - s = Elasticsearch::Model::Searching::SearchRequest.new ::DummyInstrumentationModel, 'foo' - assert_respond_to s, :execute_without_instrumentation! - assert_respond_to s, :execute_with_instrumentation! - end - - should "publish the notification" do - @query = { query: { match: { foo: 'bar' } } } - - ActiveSupport::Notifications.expects(:instrument).with do |name, payload| - assert_equal "search.elasticsearch", name - assert_equal 'DummyInstrumentationModel', payload[:klass] - assert_equal @query, payload[:search][:body] - true - end - - s = ::DummyInstrumentationModel.search @query - s.response - end - - should "print the debug information to the Rails log" do - s = ::DummyInstrumentationModel.search query: { match: { moo: 'bam' } } - s.response - - logged = @logger.logged(:debug).first - - assert_not_nil logged - assert_match /DummyInstrumentationModel Search \(\d+\.\d+ms\)/, logged - assert_match /body\: \{query\: \{match\: \{moo\: "bam"\}\}\}\}/, logged - end unless defined?(RUBY_VERSION) && RUBY_VERSION > '2.2' - end -end diff --git a/elasticsearch-rails/test/unit/instrumentation/lograge_test.rb b/elasticsearch-rails/test/unit/instrumentation/lograge_test.rb deleted file mode 100644 index f7984daef..000000000 --- a/elasticsearch-rails/test/unit/instrumentation/lograge_test.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'test_helper' - -require 'rails/railtie' -require 'action_pack' -require 'lograge' - -require 'elasticsearch/rails/lograge' - -class Elasticsearch::Rails::LogrageTest < Test::Unit::TestCase - context "Lograge integration" do - setup do - Elasticsearch::Rails::Lograge::Railtie.run_initializers - end - - should "customize the Lograge configuration" do - assert_not_nil Elasticsearch::Rails::Lograge::Railtie.initializers - .select { |i| i.name == 'elasticsearch.lograge' } - .first - end - end -end