2013-02-28 23:52:35 +04:00
# encoding: utf-8
2015-10-11 10:41:23 +01:00
require 'rails_helper'
2013-08-02 10:31:36 +10:00
require_dependency 'search'
2013-02-05 14:16:51 -05:00
describe Search do
2014-04-11 15:07:39 -05:00
class TextHelper
extend ActionView :: Helpers :: TextHelper
end
2013-05-14 11:59:55 +10:00
before do
ActiveRecord :: Base . observers . enable :search_observer
end
2013-02-25 19:42:20 +03:00
context 'post indexing observer' do
before do
2013-02-05 14:16:51 -05:00
@category = Fabricate ( :category , name : 'america' )
2013-03-11 14:51:24 +01:00
@topic = Fabricate ( :topic , title : 'sam saffron test topic' , category : @category )
2013-02-05 14:16:51 -05:00
@post = Fabricate ( :post , topic : @topic , raw : 'this <b>fun test</b> <img src="bla" title="my image">' )
2013-05-22 15:33:33 -04:00
@indexed = @post . post_search_data . search_data
2013-02-05 14:16:51 -05:00
end
2014-09-01 17:04:40 +10:00
it " should index correctly " do
2015-04-25 11:18:35 -04:00
expect ( @indexed ) . to match ( / fun / )
expect ( @indexed ) . to match ( / sam / )
expect ( @indexed ) . to match ( / america / )
2013-02-05 14:16:51 -05:00
2013-02-06 20:09:31 -05:00
@topic . title = " harpi is the new title "
2013-02-05 14:16:51 -05:00
@topic . save!
2013-05-22 15:33:33 -04:00
@post . post_search_data . reload
@indexed = @post . post_search_data . search_data
2013-02-05 14:16:51 -05:00
2015-04-25 11:18:35 -04:00
expect ( @indexed ) . to match ( / harpi / )
2013-02-05 14:16:51 -05:00
end
end
2013-02-25 19:42:20 +03:00
context 'user indexing observer' do
before do
2013-02-05 14:16:51 -05:00
@user = Fabricate ( :user , username : 'fred' , name : 'bob jones' )
2013-05-22 15:33:33 -04:00
@indexed = @user . user_search_data . search_data
2013-02-05 14:16:51 -05:00
end
2014-09-02 19:15:08 +10:00
it " should pick up on data " do
2015-04-25 11:18:35 -04:00
expect ( @indexed ) . to match ( / fred / )
expect ( @indexed ) . to match ( / jone / )
2013-02-05 14:16:51 -05:00
end
end
2013-02-25 19:42:20 +03:00
context 'category indexing observer' do
before do
2013-02-05 14:16:51 -05:00
@category = Fabricate ( :category , name : 'america' )
2013-05-22 15:33:33 -04:00
@indexed = @category . category_search_data . search_data
2013-02-05 14:16:51 -05:00
end
2013-02-25 19:42:20 +03:00
it " should pick up on name " do
2015-04-25 11:18:35 -04:00
expect ( @indexed ) . to match ( / america / )
2013-02-05 14:16:51 -05:00
end
end
2013-03-07 16:52:01 +01:00
it 'does not search when the search term is too small' do
ActiveRecord :: Base . expects ( :exec_sql ) . never
2014-09-02 19:15:08 +10:00
Search . execute ( 'evil' , min_search_term_length : 5 )
2013-03-07 16:52:01 +01:00
end
2013-02-05 14:16:51 -05:00
it 'escapes non alphanumeric characters' do
2015-04-25 11:18:35 -04:00
expect ( Search . execute ( 'foo :!$);}]>@\#\"\'' ) . posts . length ) . to eq ( 0 ) # There are at least three levels of sanitation for Search.query!
2013-08-26 16:25:02 -04:00
end
it " doesn't raise an error when single quotes are present " do
2015-04-25 11:18:35 -04:00
expect ( Search . execute ( " 'hello' world " ) . posts . length ) . to eq ( 0 ) # There are at least three levels of sanitation for Search.query!
2013-02-05 14:16:51 -05:00
end
it 'works when given two terms with spaces' do
2015-04-25 11:18:35 -04:00
expect { Search . execute ( 'evil trout' ) } . not_to raise_error
2013-02-05 14:16:51 -05:00
end
context 'users' do
let! ( :user ) { Fabricate ( :user ) }
2014-09-02 19:15:08 +10:00
let ( :result ) { Search . execute ( 'bruce' , type_filter : 'user' ) }
2013-02-05 14:16:51 -05:00
it 'returns a result' do
2015-04-25 11:18:35 -04:00
expect ( result . users . length ) . to eq ( 1 )
expect ( result . users [ 0 ] . id ) . to eq ( user . id )
2013-02-05 14:16:51 -05:00
end
2015-10-28 19:56:08 +01:00
context 'hiding user profiles' do
before { SiteSetting . stubs ( :hide_user_profiles_from_public ) . returns ( true ) }
it 'returns no result for anon' do
expect ( result . users . length ) . to eq ( 0 )
end
it 'returns a result for logged in users' do
result = Search . execute ( 'bruce' , type_filter : 'user' , guardian : Guardian . new ( user ) )
expect ( result . users . length ) . to eq ( 1 )
end
end
2013-02-05 14:16:51 -05:00
end
2014-10-24 19:20:41 -04:00
context 'inactive users' do
let! ( :inactive_user ) { Fabricate ( :inactive_user , active : false ) }
let ( :result ) { Search . execute ( 'bruce' ) }
it 'does not return a result' do
2015-04-25 11:18:35 -04:00
expect ( result . users . length ) . to eq ( 0 )
2014-10-24 19:20:41 -04:00
end
end
2015-11-18 21:06:59 +01:00
context 'staged users' do
let ( :staged ) { Fabricate ( :staged ) }
let ( :result ) { Search . execute ( staged . username ) }
it 'does not return a result' do
expect ( result . users . length ) . to eq ( 0 )
end
end
2014-12-04 13:46:52 +11:00
context 'private messages' do
let ( :topic ) {
Fabricate ( :topic ,
category_id : nil ,
archetype : 'private_message' )
}
let ( :post ) { Fabricate ( :post , topic : topic ) }
let ( :reply ) { Fabricate ( :post , topic : topic ,
raw : 'hello from mars, we just landed' ) }
it 'searches correctly' do
expect do
Search . execute ( 'mars' , type_filter : 'private_messages' )
end . to raise_error ( Discourse :: InvalidAccess )
TopicAllowedUser . create! ( user_id : reply . user_id , topic_id : topic . id )
TopicAllowedUser . create! ( user_id : post . user_id , topic_id : topic . id )
results = Search . execute ( 'mars' ,
type_filter : 'private_messages' ,
guardian : Guardian . new ( reply . user ) )
2015-04-25 11:18:35 -04:00
expect ( results . posts . length ) . to eq ( 1 )
2014-12-04 13:46:52 +11:00
2015-02-19 12:56:49 +11:00
results = Search . execute ( 'mars' ,
search_context : topic ,
guardian : Guardian . new ( reply . user ) )
2015-04-25 11:18:35 -04:00
expect ( results . posts . length ) . to eq ( 1 )
2015-02-19 12:56:49 +11:00
2014-12-04 13:46:52 +11:00
# does not leak out
results = Search . execute ( 'mars' ,
type_filter : 'private_messages' ,
guardian : Guardian . new ( Fabricate ( :user ) ) )
2015-04-25 11:18:35 -04:00
expect ( results . posts . length ) . to eq ( 0 )
2014-12-04 13:46:52 +11:00
Fabricate ( :topic , category_id : nil , archetype : 'private_message' )
Fabricate ( :post , topic : topic , raw : 'another secret pm from mars, testing' )
# admin can search everything with correct context
results = Search . execute ( 'mars' ,
type_filter : 'private_messages' ,
search_context : post . user ,
guardian : Guardian . new ( Fabricate ( :admin ) ) )
2015-04-25 11:18:35 -04:00
expect ( results . posts . length ) . to eq ( 1 )
2014-12-04 13:46:52 +11:00
end
end
2013-02-05 14:16:51 -05:00
context 'topics' do
2014-09-02 19:15:08 +10:00
let ( :post ) { Fabricate ( :post ) }
let ( :topic ) { post . topic }
2013-02-05 14:16:51 -05:00
2014-02-17 13:54:51 +11:00
context 'search within topic' do
def new_post ( raw , topic )
Fabricate ( :post , topic : topic , topic_id : topic . id , user : topic . user , raw : raw )
end
it 'displays multiple results within a topic' do
2014-02-19 08:59:18 +11:00
2014-02-17 13:54:51 +11:00
topic = Fabricate ( :topic )
topic2 = Fabricate ( :topic )
new_post ( 'this is the other post I am posting' , topic2 )
2014-06-20 15:48:34 +10:00
new_post ( 'this is my fifth post I am posting' , topic2 )
2014-02-17 13:54:51 +11:00
post1 = new_post ( 'this is the other post I am posting' , topic )
post2 = new_post ( 'this is my first post I am posting' , topic )
post3 = new_post ( ' this is a real long and complicated bla this is my second post I am Posting birds
with more stuff bla bla ' , topic )
post4 = new_post ( 'this is my fourth post I am posting' , topic )
2014-02-19 08:59:18 +11:00
# update posts_count
topic . reload
2014-09-02 19:15:08 +10:00
results = Search . execute ( 'posting' , search_context : post1 . topic )
2015-04-25 11:18:35 -04:00
expect ( results . posts . map ( & :id ) ) . to eq ( [ post1 . id , post2 . id , post3 . id , post4 . id ] )
2014-02-17 13:54:51 +11:00
2014-06-20 15:48:34 +10:00
# stop words should work
2014-09-02 19:15:08 +10:00
results = Search . execute ( 'this' , search_context : post1 . topic )
2015-04-25 11:18:35 -04:00
expect ( results . posts . length ) . to eq ( 4 )
2014-02-17 13:54:51 +11:00
end
end
2013-02-25 19:42:20 +03:00
context 'searching the OP' do
2014-09-02 19:15:08 +10:00
let! ( :post ) { Fabricate ( :post_with_long_raw_content ) }
let ( :result ) { Search . execute ( 'hundred' , type_filter : 'topic' , include_blurbs : true ) }
2013-02-05 14:16:51 -05:00
2013-05-13 10:48:32 +10:00
it 'returns a result correctly' do
2015-04-25 11:18:35 -04:00
expect ( result . posts . length ) . to eq ( 1 )
expect ( result . posts [ 0 ] . id ) . to eq ( post . id )
2013-02-05 14:16:51 -05:00
end
2013-05-13 17:04:41 -04:00
end
2013-06-29 03:22:17 +02:00
context 'searching for a post' do
let! ( :reply ) { Fabricate ( :basic_reply , topic : topic , user : topic . user ) }
2014-09-02 19:15:08 +10:00
let ( :result ) { Search . execute ( 'quotes' , type_filter : 'topic' , include_blurbs : true ) }
2013-06-29 03:22:17 +02:00
it 'returns the post' do
2015-04-25 11:18:35 -04:00
expect ( result ) . to be_present
expect ( result . posts . length ) . to eq ( 1 )
2014-09-02 19:15:08 +10:00
p = result . posts [ 0 ]
2015-04-25 11:18:35 -04:00
expect ( p . topic . id ) . to eq ( topic . id )
expect ( p . id ) . to eq ( reply . id )
expect ( result . blurb ( p ) ) . to eq ( " this reply has no quotes " )
2013-06-29 03:22:17 +02:00
end
end
2014-08-28 15:42:29 -04:00
context " search for a topic by id " do
2014-09-02 19:15:08 +10:00
let ( :result ) { Search . execute ( topic . id , type_filter : 'topic' , search_for_id : true , min_search_term_length : 1 ) }
2014-08-28 15:42:29 -04:00
it 'returns the topic' do
2015-04-25 11:18:35 -04:00
expect ( result . posts . length ) . to eq ( 1 )
expect ( result . posts . first . id ) . to eq ( post . id )
2014-08-28 15:42:29 -04:00
end
end
2013-05-13 17:04:41 -04:00
context " search for a topic by url " do
2014-09-02 19:15:08 +10:00
let ( :result ) { Search . execute ( topic . relative_url , search_for_id : true , type_filter : 'topic' ) }
2013-05-13 17:04:41 -04:00
it 'returns the topic' do
2015-04-25 11:18:35 -04:00
expect ( result . posts . length ) . to eq ( 1 )
expect ( result . posts . first . id ) . to eq ( post . id )
2013-05-13 17:04:41 -04:00
end
2013-05-13 10:48:32 +10:00
end
context 'security' do
2013-06-29 03:22:17 +02:00
2013-05-13 10:48:32 +10:00
def result ( current_user )
2014-10-18 15:19:08 +11:00
Search . execute ( 'hello' , guardian : Guardian . new ( current_user ) )
2013-02-05 14:16:51 -05:00
end
2013-05-13 10:48:32 +10:00
it 'secures results correctly' do
category = Fabricate ( :category )
topic . category_id = category . id
topic . save
2013-07-14 11:24:16 +10:00
category . set_permissions ( :staff = > :full )
2013-05-13 10:48:32 +10:00
category . save
2015-04-25 11:18:35 -04:00
expect ( result ( nil ) . posts ) . not_to be_present
expect ( result ( Fabricate ( :user ) ) . posts ) . not_to be_present
expect ( result ( Fabricate ( :admin ) ) . posts ) . to be_present
2013-05-13 10:48:32 +10:00
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
end
end
2013-02-28 23:52:35 +04:00
context 'cyrillic topic' do
let! ( :cyrillic_topic ) { Fabricate ( :topic ) do
user
title { sequence ( :title ) { | i | " Тестовая запись #{ i } " } }
end
}
let! ( :post ) { Fabricate ( :post , topic : cyrillic_topic , user : cyrillic_topic . user ) }
2014-09-02 19:15:08 +10:00
let ( :result ) { Search . execute ( 'запись' ) }
2013-02-28 23:52:35 +04:00
it 'finds something when given cyrillic query' do
2015-04-25 11:18:35 -04:00
expect ( result . posts ) . to be_present
2013-02-28 23:52:35 +04:00
end
end
2013-02-05 14:16:51 -05:00
context 'categories' do
let! ( :category ) { Fabricate ( :category ) }
2014-09-02 19:15:08 +10:00
def search
Search . execute ( category . name )
2013-05-13 18:04:03 +10:00
end
2013-02-05 14:16:51 -05:00
2013-05-13 10:48:32 +10:00
it 'returns the correct result' do
2015-04-25 11:18:35 -04:00
expect ( search . categories ) . to be_present
2013-05-13 18:04:03 +10:00
2013-07-14 11:24:16 +10:00
category . set_permissions ( { } )
2013-05-13 18:04:03 +10:00
category . save
2015-04-25 11:18:35 -04:00
expect ( search . categories ) . not_to be_present
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
end
context 'type_filter' do
let! ( :user ) { Fabricate ( :user , username : 'amazing' , email : 'amazing@amazing.com' ) }
let! ( :category ) { Fabricate ( :category , name : 'amazing category' , user : user ) }
2013-02-25 19:42:20 +03:00
2013-02-05 14:16:51 -05:00
context 'user filter' do
2014-09-02 19:15:08 +10:00
let ( :results ) { Search . execute ( 'amazing' , type_filter : 'user' ) }
2013-02-05 14:16:51 -05:00
it " returns a user result " do
2015-04-25 11:18:35 -04:00
expect ( results . categories . length ) . to eq ( 0 )
expect ( results . posts . length ) . to eq ( 0 )
expect ( results . users . length ) . to eq ( 1 )
2013-02-05 14:16:51 -05:00
end
end
context 'category filter' do
2014-09-02 19:15:08 +10:00
let ( :results ) { Search . execute ( 'amazing' , type_filter : 'category' ) }
2013-02-05 14:16:51 -05:00
2013-05-21 05:56:04 -03:00
it " returns a category result " do
2015-04-25 11:18:35 -04:00
expect ( results . categories . length ) . to eq ( 1 )
expect ( results . posts . length ) . to eq ( 0 )
expect ( results . users . length ) . to eq ( 0 )
2013-02-05 14:16:51 -05:00
end
end
2013-05-24 14:03:45 -04:00
end
context 'search_context' do
2014-09-02 19:15:08 +10:00
it 'can find a user when using search context' do
coding_horror = Fabricate ( :coding_horror )
post = Fabricate ( :post )
2013-05-24 14:03:45 -04:00
2014-09-02 19:15:08 +10:00
Fabricate ( :post , user : coding_horror )
2013-05-24 16:17:09 -04:00
2014-09-02 19:15:08 +10:00
result = Search . execute ( 'hello' , search_context : post . user )
result . posts . first . topic_id = post . topic_id
2015-04-25 11:18:35 -04:00
expect ( result . posts . length ) . to eq ( 1 )
2013-05-24 14:03:45 -04:00
end
2014-09-02 19:15:08 +10:00
it 'can use category as a search context' do
category = Fabricate ( :category )
topic = Fabricate ( :topic , category : category )
topic_no_cat = Fabricate ( :topic )
post = Fabricate ( :post , topic : topic , user : topic . user )
_another_post = Fabricate ( :post , topic : topic_no_cat , user : topic . user )
2013-05-24 14:03:45 -04:00
2014-09-02 19:15:08 +10:00
search = Search . execute ( 'hello' , search_context : category )
2015-04-25 11:18:35 -04:00
expect ( search . posts . length ) . to eq ( 1 )
expect ( search . posts . first . id ) . to eq ( post . id )
2013-05-24 14:03:45 -04:00
end
2013-02-05 14:16:51 -05:00
end
2014-06-26 09:58:49 +10:00
describe 'Chinese search' do
it 'splits English / Chinese' do
SiteSetting . default_locale = 'zh_CN'
data = Search . prepare_data ( 'Discourse社区指南' ) . split ( ' ' )
2015-04-25 11:18:35 -04:00
expect ( data ) . to eq ( [ 'Discourse' , '社区' , '指南' ] )
2014-06-26 09:58:49 +10:00
end
it 'finds chinese topic based on title' do
2015-04-24 07:22:46 +10:00
skip ( " skipped until pg app installs the db correctly " ) if RbConfig :: CONFIG [ " arch " ] =~ / darwin /
2014-06-26 09:58:49 +10:00
SiteSetting . default_locale = 'zh_TW'
2014-09-16 19:15:05 +08:00
topic = Fabricate ( :topic , title : 'My Title Discourse社區指南' )
2014-09-02 19:15:08 +10:00
post = Fabricate ( :post , topic : topic )
2014-06-26 09:58:49 +10:00
2015-04-25 11:18:35 -04:00
expect ( Search . execute ( '社區指南' ) . posts . first . id ) . to eq ( post . id )
expect ( Search . execute ( '指南' ) . posts . first . id ) . to eq ( post . id )
2014-06-26 09:58:49 +10:00
end
2015-11-27 16:35:27 +11:00
it 'finds chinese topic based on title if tokenization is forced' do
skip ( " skipped until pg app installs the db correctly " ) if RbConfig :: CONFIG [ " arch " ] =~ / darwin /
SiteSetting . search_tokenize_chinese_japanese_korean = true
topic = Fabricate ( :topic , title : 'My Title Discourse社區指南' )
post = Fabricate ( :post , topic : topic )
expect ( Search . execute ( '社區指南' ) . posts . first . id ) . to eq ( post . id )
expect ( Search . execute ( '指南' ) . posts . first . id ) . to eq ( post . id )
end
2014-06-26 09:58:49 +10:00
end
2014-09-03 21:54:10 +10:00
describe 'Advanced search' do
2015-06-23 13:21:50 +10:00
2015-08-14 11:53:16 +10:00
it 'supports min_age and max_age in:first user:' do
2015-06-23 13:21:50 +10:00
topic = Fabricate ( :topic , created_at : 3 . months . ago )
Fabricate ( :post , raw : 'hi this is a test 123 123' , topic : topic )
2015-08-14 11:53:16 +10:00
_post = Fabricate ( :post , raw : 'boom boom shake the room' , topic : topic )
2015-06-23 13:21:50 +10:00
expect ( Search . execute ( 'test min_age:100' ) . posts . length ) . to eq ( 1 )
expect ( Search . execute ( 'test min_age:10' ) . posts . length ) . to eq ( 0 )
expect ( Search . execute ( 'test max_age:10' ) . posts . length ) . to eq ( 1 )
expect ( Search . execute ( 'test max_age:100' ) . posts . length ) . to eq ( 0 )
2015-06-23 13:39:40 +10:00
expect ( Search . execute ( 'test in:first' ) . posts . length ) . to eq ( 1 )
expect ( Search . execute ( 'boom' ) . posts . length ) . to eq ( 1 )
expect ( Search . execute ( 'boom in:first' ) . posts . length ) . to eq ( 0 )
2015-08-14 11:53:16 +10:00
expect ( Search . execute ( 'user:nobody' ) . posts . length ) . to eq ( 0 )
expect ( Search . execute ( " user: #{ _post . user . username } " ) . posts . length ) . to eq ( 1 )
2015-11-18 21:06:59 +01:00
expect ( Search . execute ( " user: #{ _post . user_id } " ) . posts . length ) . to eq ( 1 )
2015-06-23 13:21:50 +10:00
end
2015-09-15 17:39:14 +10:00
it 'supports group' do
topic = Fabricate ( :topic , created_at : 3 . months . ago )
post = Fabricate ( :post , raw : 'hi this is a test 123 123' , topic : topic )
group = Group . create! ( name : " Like_a_Boss " )
GroupUser . create! ( user_id : post . user_id , group_id : group . id )
expect ( Search . execute ( 'group:like_a_boss' ) . posts . length ) . to eq ( 1 )
expect ( Search . execute ( 'group:"like a brick"' ) . posts . length ) . to eq ( 0 )
end
2015-09-15 18:47:27 +10:00
it 'supports badge' do
2015-09-15 17:21:46 +10:00
topic = Fabricate ( :topic , created_at : 3 . months . ago )
post = Fabricate ( :post , raw : 'hi this is a test 123 123' , topic : topic )
badge = Badge . create! ( name : " Like a Boss " , badge_type_id : 1 )
UserBadge . create! ( user_id : post . user_id , badge_id : badge . id , granted_at : 1 . minute . ago , granted_by_id : - 1 )
2015-09-15 18:47:27 +10:00
expect ( Search . execute ( 'badge:"like a boss"' ) . posts . length ) . to eq ( 1 )
expect ( Search . execute ( 'badge:"test"' ) . posts . length ) . to eq ( 0 )
2015-09-15 17:21:46 +10:00
end
2015-08-10 17:41:14 +10:00
it 'can search numbers correctly, and match exact phrases' do
topic = Fabricate ( :topic , created_at : 3 . months . ago )
Fabricate ( :post , raw : '3.0 eta is in 2 days horrah' , topic : topic )
expect ( Search . execute ( '3.0 eta' ) . posts . length ) . to eq ( 1 )
expect ( Search . execute ( '"3.0, eta is"' ) . posts . length ) . to eq ( 0 )
end
2014-09-03 21:54:10 +10:00
it 'can find by status' do
post = Fabricate ( :post , raw : 'hi this is a test 123 123' )
topic = post . topic
2015-04-25 11:18:35 -04:00
expect ( Search . execute ( 'test status:closed' ) . posts . length ) . to eq ( 0 )
expect ( Search . execute ( 'test status:open' ) . posts . length ) . to eq ( 1 )
2015-06-23 12:14:06 +10:00
expect ( Search . execute ( 'test posts_count:1' ) . posts . length ) . to eq ( 1 )
2014-09-03 21:54:10 +10:00
topic . closed = true
topic . save
2015-04-25 11:18:35 -04:00
expect ( Search . execute ( 'test status:closed' ) . posts . length ) . to eq ( 1 )
2015-06-23 12:14:06 +10:00
expect ( Search . execute ( 'status:closed' ) . posts . length ) . to eq ( 1 )
2015-04-25 11:18:35 -04:00
expect ( Search . execute ( 'test status:open' ) . posts . length ) . to eq ( 0 )
2014-09-03 21:54:10 +10:00
topic . archived = true
topic . closed = false
topic . save
2015-04-25 11:18:35 -04:00
expect ( Search . execute ( 'test status:archived' ) . posts . length ) . to eq ( 1 )
expect ( Search . execute ( 'test status:open' ) . posts . length ) . to eq ( 0 )
2014-10-18 14:54:11 +11:00
2015-04-25 11:18:35 -04:00
expect ( Search . execute ( 'test status:noreplies' ) . posts . length ) . to eq ( 1 )
2014-10-18 14:54:11 +11:00
2015-04-25 11:18:35 -04:00
expect ( Search . execute ( 'test in:likes' , guardian : Guardian . new ( topic . user ) ) . posts . length ) . to eq ( 0 )
2014-10-18 15:19:08 +11:00
2015-04-25 11:18:35 -04:00
expect ( Search . execute ( 'test in:posted' , guardian : Guardian . new ( topic . user ) ) . posts . length ) . to eq ( 1 )
2014-10-18 15:19:08 +11:00
2014-10-18 15:34:05 +11:00
TopicUser . change ( topic . user . id , topic . id , notification_level : TopicUser . notification_levels [ :tracking ] )
2015-04-25 11:18:35 -04:00
expect ( Search . execute ( 'test in:watching' , guardian : Guardian . new ( topic . user ) ) . posts . length ) . to eq ( 0 )
expect ( Search . execute ( 'test in:tracking' , guardian : Guardian . new ( topic . user ) ) . posts . length ) . to eq ( 1 )
2014-10-18 15:34:05 +11:00
2014-09-03 22:10:18 +10:00
end
it 'can find by latest' do
topic1 = Fabricate ( :topic , title : 'I do not like that Sam I am' )
post1 = Fabricate ( :post , topic : topic1 )
post2 = Fabricate ( :post , raw : 'that Sam I am, that Sam I am' )
2015-04-25 11:18:35 -04:00
expect ( Search . execute ( 'sam' ) . posts . map ( & :id ) ) . to eq ( [ post1 . id , post2 . id ] )
expect ( Search . execute ( 'sam order:latest' ) . posts . map ( & :id ) ) . to eq ( [ post2 . id , post1 . id ] )
2014-09-03 21:54:10 +10:00
end
end
2015-08-13 17:55:10 +10:00
it 'can parse complex strings using ts_query helper' do
str = " grigio:babel deprecated? "
2015-08-19 09:27:47 +10:00
str << " page page on Atmosphere](https://atmospherejs.com/grigio/babel)xxx: aaa.js:222 aaa' \" bbb "
2015-08-13 17:55:10 +10:00
ts_query = Search . ts_query ( str , " simple " )
Post . exec_sql ( " SELECT to_tsvector('bbb') @@ " << ts_query )
end
2013-02-05 14:16:51 -05:00
end