# frozen_string_literal: true

RSpec.describe Searchable do
  describe "has search data" do
    before do
      DB.exec("create temporary table searchable_records(id SERIAL primary key)")
      DB.exec(
        "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
      DB.exec("drop table searchable_records")
      DB.exec("drop table searchable_record_search_data")

      # this weakref in the descendant tracker should clean up the two tests
      # if this becomes an issue we can revisit (watch out for erratic tests)
      Object.send(:remove_const, :SearchableRecord)
      Object.send(:remove_const, :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