require "rails_helper"

describe Searchable do
  context "has search data" do
    before do
      Topic.exec_sql("create temporary table searchable_records(id SERIAL primary key)")
      Topic.exec_sql("create temporary table searchable_record_search_data(searchable_record_id int primary key, search_data tsvector, raw_data text, locale text)")

      class SearchableRecord < ActiveRecord::Base
        include Searchable
      end

      class SearchableRecordSearchData < ActiveRecord::Base
        self.primary_key = 'searchable_record_id'
        belongs_to :test_item
      end
    end

    after do
      Topic.exec_sql("drop table searchable_records")
      Topic.exec_sql("drop table searchable_record_search_data")

      # import is making my life hard, we need to nuke this out of orbit
      des = ActiveSupport::DescendantsTracker.class_variable_get :@@direct_descendants
      des[ActiveRecord::Base].delete(SearchableRecord)
      des[ActiveRecord::Base].delete(SearchableRecordSearchData)
    end

    let(:item) { SearchableRecord.create! }

    it 'can build the data' do
      expect(item.build_searchable_record_search_data).to be_truthy
    end

    it 'can save the data' do
      item.build_searchable_record_search_data(
        search_data: '',
        raw_data: 'a',
        locale: 'en')
      item.save

      loaded = SearchableRecord.find(item.id)
      expect(loaded.searchable_record_search_data.raw_data).to eq 'a'
    end

    it 'destroy the search data when the item is deprived' do
      item.build_searchable_record_search_data(
        search_data: '',
        raw_data: 'a',
        locale: 'en')
      item.save
      item_id = item.id
      item.destroy
      expect(SearchableRecordSearchData.find_by(searchable_record_id: item_id)).to be_nil
    end
  end
end
