117 lines
4.5 KiB
Ruby
117 lines
4.5 KiB
Ruby
# frozen_string_literal: true
|
|
require_relative '../../lib/pg_searchable_regex'
|
|
|
|
describe PgSearchable do
|
|
include_examples 'pg_search', VectorModel
|
|
include_examples 'pg_search', VectorWithCustomPrimaryKeyModel
|
|
include_examples 'pg_search', VectorWithCustomCallback
|
|
include_examples 'pg_search', SimpleVectorModel
|
|
include_examples 'pg_search', VectorWithoutWildcardModel
|
|
include_examples 'pg_search', VectorModelWithCustomSearchScope, 'fulltext'
|
|
include_examples 'pg_search', VectorModelWithTagValues
|
|
include_examples 'pg_search', DynamicModel
|
|
include_examples 'pg_search', DynamicModelWithTagValues
|
|
include_examples 'pg_search', DynamicModelWithCategory
|
|
include_examples 'pg_search', DynamicModelWithSectionsTrhough
|
|
|
|
describe 'pg_search' do
|
|
describe 'joins' do
|
|
it 'can dynamically query compound relation' do
|
|
record = DynamicModelWithCategory.create(name: 'something', value: 'amazing')
|
|
category = Category.create(name: 'searchable')
|
|
Tag.create(value: 'impressive', category: category, taggable: record)
|
|
expect(DynamicModelWithCategory.scope_search('searchable')).to include(record)
|
|
end
|
|
|
|
it 'can use has_many :through relation' do
|
|
record = DynamicModelWithSectionsTrhough.create(name: 'something', value: 'amazing')
|
|
tag = Tag.create(value: 'impressive', taggable: record)
|
|
Section.create(name: 'searchable', tag: tag)
|
|
expect(DynamicModelWithSectionsTrhough.scope_search('searchable')).to include(record)
|
|
end
|
|
end
|
|
|
|
describe 'properties' do
|
|
describe 'skip_callback' do
|
|
context 'when enabled' do
|
|
let(:record) { VectorModel.create(name: 'something', value: 'amazing') }
|
|
|
|
it 'can find the record after it updates' do
|
|
record.update(name: 'cookie')
|
|
expect(VectorModel.scope_search('cookie')).to include(record)
|
|
end
|
|
end
|
|
|
|
context 'when disabled' do
|
|
let(:record) { VectorModelWithoutCallback.create(name: 'something', value: 'amazing') }
|
|
|
|
it 'cannot find the record after it updates' do
|
|
record.update(name: 'cookie')
|
|
expect(VectorModelWithoutCallback.scope_search('cookie')).not_to include(record)
|
|
end
|
|
|
|
it 'can find the record after manually calling .update_pg_search_cache' do
|
|
record.update(name: 'cookie')
|
|
record.update_pg_search_cache
|
|
expect(VectorModelWithoutCallback.scope_search('cookie')).to include(record)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'scope' do
|
|
it 'defaults to "scope_search"' do
|
|
expect(VectorModel).to respond_to(:scope_search)
|
|
end
|
|
|
|
it 'can use a different scope name' do
|
|
expect(VectorModelWithCustomSearchScope).to respond_to(:fulltext)
|
|
end
|
|
|
|
it 'doesnt pollutes the default method name if customized' do
|
|
expect(VectorModelWithCustomSearchScope).not_to respond_to(:scope_search)
|
|
end
|
|
end
|
|
|
|
describe 'language' do
|
|
it 'defaults to english lexemes' do
|
|
record = VectorModel.create name: 'something', value: 'amazing'
|
|
expect(VectorModel.scope_search('amaz')).to include(record)
|
|
end
|
|
|
|
it 'can be changed to simple to avoid lexeme truncation' do
|
|
record = SimpleVectorModel.create name: 'something', value: 'amazing'
|
|
expect(SimpleVectorModel.scope_search('amazings')).not_to include(record)
|
|
end
|
|
end
|
|
|
|
describe 'wildcard' do
|
|
it 'by default uses it' do
|
|
record = VectorModel.create name: '12345', value: 'amazing'
|
|
expect(VectorModel.scope_search('123')).to include(record)
|
|
end
|
|
|
|
it 'can be set to false' do
|
|
record = VectorWithoutWildcardModel.create name: '12345', value: 'amazing'
|
|
expect(VectorWithoutWildcardModel.scope_search('123')).not_to include(record)
|
|
end
|
|
end
|
|
|
|
describe 'tags' do
|
|
it 'allow indexing fields of other associations' do
|
|
record = DynamicModelWithTagValues.create name: 'something', value: 'amazing'
|
|
Tag.create(taggable: record, value: 'red')
|
|
expect(DynamicModelWithTagValues.scope_search('red')).to include(record)
|
|
end
|
|
end
|
|
|
|
describe 'external_cache_data' do
|
|
it 'can index external data using a method' do
|
|
record = VectorModelWithTagValues.create name: 'something', value: 'amazing'
|
|
Tag.create(taggable: record, value: 'red')
|
|
expect(VectorModelWithTagValues.scope_search('red')).to include(record)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|