require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe HighlightHelper do include HighlightHelper describe :highlight_and_excerpt do it 'excerpts text and highlights phrases' do text = "Quentin Nobble-Boston, Permanent Under-Secretary, Department for Humpadinking" phrases = ['humpadinking'] expected = '...Department for Humpadinking' highlight_and_excerpt(text, phrases, 15).should == expected end it 'excerpts text and highlights matches' do text = "Quentin Nobble-Boston, Permanent Under-Secretary, Department for Humpadinking" matches = [/\bhumpadink\w*\b/iu] expected = '...Department for Humpadinking' highlight_and_excerpt(text, matches, 15).should == expected end context 'multiple matches' do it 'highlights multiple matches' do text = <<-EOF Quentin Nobble-Boston, Permanent Under-Secretary, Department for Humpadinking decided to visit Humpadink so that he could be with the Humpadinks EOF expected = <<-EOF Quentin Nobble-Boston, Permanent Under-Secretary, Department for Humpadinking decided to visit Humpadink so that he could be with the Humpadinks EOF text.chomp! expected.chomp! matches = [/\b(humpadink\w*)\b/iu] highlight_and_excerpt(text, matches, 1000).should == expected end it 'bases the split on the first match' do text = "Quentin Nobble-Boston, Permanent Under-Secretary," \ "Department for Humpadinking decided to visit Humpadink" \ "so that he could be with the Humpadinks" expected = "...Department for " \ "Humpadinking decided to vis..." matches = [/\b(humpadink\w*)\b/iu] highlight_and_excerpt(text, matches, 15).should == expected end end end describe :highlight_matches do it 'highlights' do assert_equal( "This is a beautiful morning", highlight_matches("This is a beautiful morning", "beautiful") ) assert_equal( "This is a beautiful morning, but also a beautiful day", highlight_matches("This is a beautiful morning, but also a beautiful day", "beautiful") ) assert_equal( "This is a beautiful morning, but also a beautiful day", highlight_matches("This is a beautiful morning, but also a beautiful day", "beautiful", :highlighter => '\1') ) assert_equal( "This text is not changed because we supplied an empty phrase", highlight_matches("This text is not changed because we supplied an empty phrase", nil) ) assert_equal ' ', highlight_matches(' ', 'blank text is returned verbatim') end it 'sanitizes input' do assert_equal( "This is a beautiful morning", highlight_matches("This is a beautiful morning", "beautiful") ) end it 'doesnt sanitize when the sanitize option is false' do assert_equal( "This is a beautiful morning", highlight_matches("This is a beautiful morning", "beautiful", :sanitize => false) ) end it 'highlights using regexp' do assert_equal( "This is a beautiful! morning", highlight_matches("This is a beautiful! morning", "beautiful!") ) assert_equal( "This is a beautiful! morning", highlight_matches("This is a beautiful! morning", "beautiful! morning") ) assert_equal( "This is a beautiful? morning", highlight_matches("This is a beautiful? morning", "beautiful? morning") ) end it 'accepts regex' do assert_equal("This day was challenging for judge Allen and his colleagues.", highlight_matches("This day was challenging for judge Allen and his colleagues.", /\ballen\b/i)) end it 'highlights multiple phrases in one pass' do assert_equal %(wow em), highlight_matches('wow em', %w(wow em), :highlighter => '\1') end it 'highlights with html' do assert_equal( "

This is a beautiful morning, but also a beautiful day

", highlight_matches("

This is a beautiful morning, but also a beautiful day

", "beautiful") ) assert_equal( "

This is a beautiful morning, but also a beautiful day

", highlight_matches("

This is a beautiful morning, but also a beautiful day

", "beautiful") ) assert_equal( "

This is a beautiful morning, but also a beautiful day

", highlight_matches("

This is a beautiful morning, but also a beautiful day

", "beautiful") ) assert_equal( "

This is a beautiful morning, but also a beautiful day

", highlight_matches("

This is a beautiful morning, but also a beautiful day

", "beautiful") ) assert_equal( "

This is a beautiful morning, but also a beautiful day

", highlight_matches("

This is a beautiful morning, but also a beautiful day

", "beautiful") ) assert_equal( "
abc div
", highlight_matches("
abc div
", "div", :highlighter => '\1') ) end it 'doesnt modify the options hash' do options = { :highlighter => '\1', :sanitize => false } passed_options = options.dup highlight_matches("
abc div
", "div", passed_options) assert_equal options, passed_options end it 'highlights with a block' do assert_equal( "one two three", highlight_matches("one two three", ["one", "two", "three"]) { |word| "#{word}" } ) end end describe :excerpt do it 'excerpts' do assert_equal("...is a beautiful morn...", excerpt("This is a beautiful morning", "beautiful", :radius => 5)) assert_equal("This is a...", excerpt("This is a beautiful morning", "this", :radius => 5)) assert_equal("...iful morning", excerpt("This is a beautiful morning", "morning", :radius => 5)) assert_nil excerpt("This is a beautiful morning", "day") end it 'is not html safe' do assert !excerpt('This is a beautiful! morning', 'beautiful', :radius => 5).html_safe? end it 'excerpts borderline cases' do assert_equal("", excerpt("", "", :radius => 0)) assert_equal("a", excerpt("a", "a", :radius => 0)) assert_equal("...b...", excerpt("abc", "b", :radius => 0)) assert_equal("abc", excerpt("abc", "b", :radius => 1)) assert_equal("abc...", excerpt("abcd", "b", :radius => 1)) assert_equal("...abc", excerpt("zabc", "b", :radius => 1)) assert_equal("...abc...", excerpt("zabcd", "b", :radius => 1)) assert_equal("zabcd", excerpt("zabcd", "b", :radius => 2)) # excerpt strips the resulting string before ap-/prepending excerpt_string. # whether this behavior is meaningful when excerpt_string is not to be # appended is questionable. assert_equal("zabcd", excerpt(" zabcd ", "b", :radius => 4)) assert_equal("...abc...", excerpt("z abc d", "b", :radius => 1)) end it 'excerpts with regex' do assert_equal('...is a beautiful! mor...', excerpt('This is a beautiful! morning', 'beautiful', :radius => 5)) assert_equal('...is a beautiful? mor...', excerpt('This is a beautiful? morning', 'beautiful', :radius => 5)) assert_equal('...is a beautiful? mor...', excerpt('This is a beautiful? morning', /\bbeau\w*\b/i, :radius => 5)) assert_equal('...is a beautiful? mor...', excerpt('This is a beautiful? morning', /\b(beau\w*)\b/i, :radius => 5)) assert_equal("...udge Allen and...", excerpt("This day was challenging for judge Allen and his colleagues.", /\ballen\b/i, :radius => 5)) assert_equal("...judge Allen and...", excerpt("This day was challenging for judge Allen and his colleagues.", /\ballen\b/i, :radius => 1, :separator => ' ')) assert_equal("...was challenging for...", excerpt("This day was challenging for judge Allen and his colleagues.", /\b(\w*allen\w*)\b/i, :radius => 5)) end it 'excerpts with omission' do assert_equal("[...]is a beautiful morn[...]", excerpt("This is a beautiful morning", "beautiful", :omission => "[...]",:radius => 5)) assert_equal( "This is the ultimate supercalifragilisticexpialidoceous very looooooooooooooooooong looooooooooooong beautiful morning with amazing sunshine and awesome tempera[...]", excerpt("This is the ultimate supercalifragilisticexpialidoceous very looooooooooooooooooong looooooooooooong beautiful morning with amazing sunshine and awesome temperatures. So what are you gonna do about it?", "very", :omission => "[...]") ) end it 'excerpts with utf8' do if RUBY_VERSION.to_f >= 1.9 assert_equal("...\357\254\203ciency could not be...".force_encoding(Encoding::UTF_8), excerpt("That's why e\357\254\203ciency could not be helped".force_encoding(Encoding::UTF_8), 'could', :radius => 8)) else assert_equal("...\357\254\203ciency could not be...", excerpt("That's why e\357\254\203ciency could not be helped", 'could', :radius => 8)) end end it 'doesnt modify the options hash' do options = { :omission => "[...]",:radius => 5 } passed_options = options.dup excerpt("This is a beautiful morning", "beautiful", passed_options) assert_equal options, passed_options end it 'excerpts with separator' do options = { :separator => ' ', :radius => 1 } assert_equal('...a very beautiful...', excerpt('This is a very beautiful morning', 'very', options)) assert_equal('This is...', excerpt('This is a very beautiful morning', 'this', options)) assert_equal('...beautiful morning', excerpt('This is a very beautiful morning', 'morning', options)) options = { :separator => "\n", :radius => 0 } assert_equal("...very long...", excerpt("my very\nvery\nvery long\nstring", 'long', options)) options = { :separator => "\n", :radius => 1 } assert_equal("...very\nvery long\nstring", excerpt("my very\nvery\nvery long\nstring", 'long', options)) assert_equal excerpt('This is a beautiful morning', 'a'), excerpt('This is a beautiful morning', 'a', :separator => nil) end end end