# Licensed to Elasticsearch B.V. under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

require 'spec_helper'

describe 'Elasticsearch::Model::Adapter::ActiveRecord Multimodel', if: test_mongoid? do

  before(:all) do
    connect_mongoid('mongoid_test')

    begin
      ActiveRecord::Schema.define(:version => 1) do
        create_table Episode.table_name do |t|
          t.string :name
          t.datetime :created_at, :default => 'NOW()'
        end
      end
    rescue
    end
  end

  before do
    clear_tables(Episode, Image)
    Episode.__elasticsearch__.create_index! force: true
    Episode.create name: 'TheEpisode'
    Episode.create name: 'A great Episode'
    Episode.create name: 'The greatest Episode'
    Episode.__elasticsearch__.refresh_index!

    Image.__elasticsearch__.create_index! force: true
    Image.create! name: 'The Image'
    Image.create! name: 'A great Image'
    Image.create! name: 'The greatest Image'
    Image.__elasticsearch__.refresh_index!
    Image.__elasticsearch__.client.cluster.health wait_for_status: 'yellow'
  end

  after do
    [Episode, Image].each do |model|
      model.__elasticsearch__.client.delete_by_query(index: model.index_name, q: '*', body: {})
      model.delete_all
      model.__elasticsearch__.refresh_index!
    end
  end

  context 'when the search is across multimodels with different adapters' do

    let(:search_result) do
      Elasticsearch::Model.search(%q<"greatest Episode" OR "greatest Image"^2>, [Episode, Image])
    end

    it 'executes the search across models' do
      expect(search_result.results.size).to eq(2)
      expect(search_result.records.size).to eq(2)
    end

    it 'returns the correct type of model instance' do
      expect(search_result.records[0]).to be_a(Image)
      expect(search_result.records[1]).to be_a(Episode)
    end

    it 'creates the model instances with the correct attributes' do
      expect(search_result.results[0].name).to eq('The greatest Image')
      expect(search_result.records[0].name).to eq('The greatest Image')
      expect(search_result.results[1].name).to eq('The greatest Episode')
      expect(search_result.records[1].name).to eq('The greatest Episode')
    end
  end
end
