Skip to content

Commit

Permalink
Silo more classes from each other so extending doesn't get confused.
Browse files Browse the repository at this point in the history
  • Loading branch information
Ben Hamill committed Jul 8, 2012
1 parent 983ba0f commit adbeff2
Showing 1 changed file with 49 additions and 28 deletions.
77 changes: 49 additions & 28 deletions spec/texticle/searchable_spec.rb
Expand Up @@ -3,80 +3,101 @@

class SearchableTest < Test::Unit::TestCase
context "when extending an ActiveRecord::Base subclass" do
setup do
@qcont = WebComic.create :name => "Questionable Content", :author => "Jeph Jaques"
@jhony = WebComic.create :name => "Johnny Wander", :author => "Ananth & Yuko"
@ddeeg = WebComic.create :name => "Dominic Deegan", :author => "Mookie"
@penny = WebComic.create :name => "Penny Arcade", :author => "Tycho & Gabe"
end

teardown do
WebComic.delete_all
#Object.send(:remove_const, :WebComic) if defined?(WebComic)
end

context "with no parameters" do
class WebComicWithSearchable < WebComic
extend Searchable
end

setup do
WebComic.extend Searchable
@qcont = WebComicWithSearchable.create :name => "Questionable Content", :author => "Jeph Jaques"
@jhony = WebComicWithSearchable.create :name => "Johnny Wander", :author => "Ananth & Yuko"
@ddeeg = WebComicWithSearchable.create :name => "Dominic Deegan", :author => "Mookie"
@penny = WebComicWithSearchable.create :name => "Penny Arcade", :author => "Tycho & Gabe"
end

teardown do
WebComicWithSearchable.delete_all
end

should "search across all columns" do
assert_equal [@penny], WebComic.advanced_search("Penny")
assert_equal [@ddeeg], WebComic.advanced_search("Dominic")
assert_equal [@penny], WebComicWithSearchable.advanced_search("Penny")
assert_equal [@ddeeg], WebComicWithSearchable.advanced_search("Dominic")
end
end

context "with one column as parameter" do
class WebComicWithSearchableName < WebComic
extend Searchable(:name)
end

setup do
WebComic.extend Searchable(:name)
@qcont = WebComicWithSearchableName.create :name => "Questionable Content", :author => "Jeph Jaques"
@jhony = WebComicWithSearchableName.create :name => "Johnny Wander", :author => "Ananth & Yuko"
@ddeeg = WebComicWithSearchableName.create :name => "Dominic Deegan", :author => "Mookie"
@penny = WebComicWithSearchableName.create :name => "Penny Arcade", :author => "Tycho & Gabe"
end

teardown do
WebComicWithSearchableName.delete_all
end

should "only search across the given column" do
assert_equal [@penny], WebComic.advanced_search("Penny")
assert_empty WebComic.advanced_search("Tycho")
assert_equal [@penny], WebComicWithSearchableName.advanced_search("Penny")
assert_empty WebComicWithSearchableName.advanced_search("Tycho")
end

["hello \\", "tebow!" , "food &"].each do |search_term|
should "be fine with searching for crazy character #{search_term} with plain search" do
# Uses plainto_tsquery
assert_equal [], WebComic.basic_search(search_term)
assert_equal [], WebComicWithSearchableName.basic_search(search_term)
end

should "be not fine with searching for crazy character #{search_term} with advanced search" do
# Uses to_tsquery
assert_raise(ActiveRecord::StatementInvalid) do
WebComic.advanced_search(search_term).all
WebComicWithSearchableName.advanced_search(search_term).all
end
end
end

should "fuzzy search stuff" do
assert_equal [@qcont], WebComic.fuzzy_search('Questio')
assert_equal [@qcont], WebComicWithSearchableName.fuzzy_search('Questio')
end

should "define :searchable_columns as private" do
assert_raise(NoMethodError) { WebComic.searchable_columns }
assert_raise(NoMethodError) { WebComicWithSearchableName.searchable_columns }
begin
WebComic.searchable_columns
WebComicWithSearchableName.searchable_columns
rescue NoMethodError => error
assert_match error.message, /private method/
end
end

should "define #indexable_columns which returns a write-proof Enumerable" do
assert_equal(Enumerator, WebComic.indexable_columns.class)
assert_raise(NoMethodError) { WebComic.indexable_columns[0] = 'foo' }
assert_equal(Enumerator, WebComicWithSearchableName.indexable_columns.class)
assert_raise(NoMethodError) { WebComicWithSearchableName.indexable_columns[0] = 'foo' }
end
end

context "with two columns as parameters" do
class WebComicWithSearchableNameAndAuthor < WebComic
extend Searchable(:name, :author)
end

setup do
WebComic.extend Searchable(:name, :author)
@qcont = WebComicWithSearchableNameAndAuthor.create :name => "Questionable Content", :author => "Jeph Jaques"
@jhony = WebComicWithSearchableNameAndAuthor.create :name => "Johnny Wander", :author => "Ananth & Yuko"
@ddeeg = WebComicWithSearchableNameAndAuthor.create :name => "Dominic Deegan", :author => "Mookie"
@penny = WebComicWithSearchableNameAndAuthor.create :name => "Penny Arcade", :author => "Tycho & Gabe"
end

teardown do
WebComicWithSearchableNameAndAuthor.delete_all
end

should "only search across the given column" do
assert_equal [@penny], WebComic.advanced_search("Penny")
assert_equal [@penny], WebComic.advanced_search("Tycho")
assert_equal [@penny], WebComicWithSearchableNameAndAuthor.advanced_search("Penny")
assert_equal [@penny], WebComicWithSearchableNameAndAuthor.advanced_search("Tycho")
end
end
end
Expand Down

0 comments on commit adbeff2

Please sign in to comment.