2015-10-11 17:41:23 +08:00
|
|
|
require 'rails_helper'
|
2013-02-06 03:16:51 +08:00
|
|
|
|
|
|
|
describe SearchController do
|
|
|
|
|
2014-09-02 17:15:08 +08:00
|
|
|
context "integration" do
|
|
|
|
before do
|
2016-12-22 10:13:14 +08:00
|
|
|
SearchIndexer.enable
|
2014-09-02 17:15:08 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it "can search correctly" do
|
|
|
|
my_post = Fabricate(:post, raw: 'this is my really awesome post')
|
|
|
|
xhr :get, :query, term: 'awesome', include_blurb: true
|
|
|
|
|
2015-01-10 01:04:02 +08:00
|
|
|
expect(response).to be_success
|
2014-09-02 17:15:08 +08:00
|
|
|
data = JSON.parse(response.body)
|
2015-01-10 01:04:02 +08:00
|
|
|
expect(data['posts'][0]['id']).to eq(my_post.id)
|
|
|
|
expect(data['posts'][0]['blurb']).to eq('this is my really awesome post')
|
|
|
|
expect(data['topics'][0]['id']).to eq(my_post.topic_id)
|
2014-09-02 17:15:08 +08:00
|
|
|
end
|
2017-07-15 01:56:58 +08:00
|
|
|
|
|
|
|
it 'performs the query with a type filter' do
|
|
|
|
user = Fabricate(:user)
|
|
|
|
my_post = Fabricate(:post, raw: "#{user.username} is a cool person")
|
|
|
|
xhr :get, :query, term: user.username, type_filter: 'topic'
|
|
|
|
|
|
|
|
expect(response).to be_success
|
|
|
|
data = JSON.parse(response.body)
|
|
|
|
|
|
|
|
expect(data['posts'][0]['id']).to eq(my_post.id)
|
|
|
|
expect(data['users']).to be_blank
|
|
|
|
|
|
|
|
xhr :get, :query, term: user.username, type_filter: 'user'
|
|
|
|
expect(response).to be_success
|
|
|
|
data = JSON.parse(response.body)
|
|
|
|
|
|
|
|
expect(data['posts']).to be_blank
|
|
|
|
expect(data['users'][0]['id']).to eq(user.id)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "can search for id" do
|
|
|
|
user = Fabricate(:user)
|
|
|
|
my_post = Fabricate(:post, raw: "#{user.username} is a cool person")
|
|
|
|
xhr(
|
|
|
|
:get,
|
|
|
|
:query,
|
|
|
|
term: my_post.topic_id,
|
|
|
|
type_filter: 'topic',
|
|
|
|
search_for_id: true
|
|
|
|
)
|
|
|
|
expect(response).to be_success
|
|
|
|
data = JSON.parse(response.body)
|
|
|
|
expect(data['topics'][0]['id']).to eq(my_post.topic_id)
|
|
|
|
end
|
2014-09-02 17:15:08 +08:00
|
|
|
end
|
|
|
|
|
2017-07-14 01:34:31 +08:00
|
|
|
context "#query" do
|
|
|
|
it "logs the search term" do
|
|
|
|
SiteSetting.log_search_queries = true
|
|
|
|
xhr :get, :query, term: 'wookie'
|
2017-07-17 23:57:13 +08:00
|
|
|
|
2017-07-14 01:34:31 +08:00
|
|
|
expect(response).to be_success
|
|
|
|
expect(SearchLog.where(term: 'wookie')).to be_present
|
2017-07-17 23:57:13 +08:00
|
|
|
|
|
|
|
json = JSON.parse(response.body)
|
|
|
|
search_log_id = json['grouped_search_result']['search_log_id']
|
|
|
|
expect(search_log_id).to be_present
|
|
|
|
|
|
|
|
log = SearchLog.where(id: search_log_id).first
|
|
|
|
expect(log).to be_present
|
|
|
|
expect(log.term).to eq('wookie')
|
2017-07-14 01:34:31 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it "doesn't log when disabled" do
|
|
|
|
SiteSetting.log_search_queries = false
|
|
|
|
xhr :get, :query, term: 'wookie'
|
|
|
|
expect(response).to be_success
|
|
|
|
expect(SearchLog.where(term: 'wookie')).to be_blank
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "#show" do
|
|
|
|
it "logs the search term" do
|
|
|
|
SiteSetting.log_search_queries = true
|
|
|
|
xhr :get, :show, q: 'bantha'
|
|
|
|
expect(response).to be_success
|
|
|
|
expect(SearchLog.where(term: 'bantha')).to be_present
|
|
|
|
end
|
|
|
|
|
|
|
|
it "doesn't log when disabled" do
|
|
|
|
SiteSetting.log_search_queries = false
|
|
|
|
xhr :get, :show, q: 'bantha'
|
|
|
|
expect(response).to be_success
|
|
|
|
expect(SearchLog.where(term: 'bantha')).to be_blank
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-07-15 01:56:58 +08:00
|
|
|
context "search context" do
|
2013-05-25 02:03:45 +08:00
|
|
|
it "raises an error with an invalid context type" do
|
2015-01-10 01:04:02 +08:00
|
|
|
expect {
|
2013-05-25 02:03:45 +08:00
|
|
|
xhr :get, :query, term: 'test', search_context: {type: 'security', id: 'hole'}
|
2015-01-10 01:04:02 +08:00
|
|
|
}.to raise_error(Discourse::InvalidParameters)
|
2013-05-25 02:03:45 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it "raises an error with a missing id" do
|
2015-01-10 01:04:02 +08:00
|
|
|
expect {
|
2013-05-25 02:03:45 +08:00
|
|
|
xhr :get, :query, term: 'test', search_context: {type: 'user'}
|
2015-01-10 01:04:02 +08:00
|
|
|
}.to raise_error(Discourse::InvalidParameters)
|
2013-05-25 02:03:45 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
context "with a user" do
|
|
|
|
let(:user) { Fabricate(:user) }
|
|
|
|
it "raises an error if the user can't see the context" do
|
|
|
|
Guardian.any_instance.expects(:can_see?).with(user).returns(false)
|
|
|
|
xhr :get, :query, term: 'test', search_context: {type: 'user', id: user.username}
|
2015-01-10 01:04:02 +08:00
|
|
|
expect(response).not_to be_success
|
2013-05-25 02:03:45 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'performs the query with a search context' do
|
|
|
|
xhr :get, :query, term: 'test', search_context: {type: 'user', id: user.username}
|
2017-07-15 01:56:58 +08:00
|
|
|
expect(response).to be_success
|
2013-05-25 02:03:45 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-07-15 01:56:58 +08:00
|
|
|
end
|
2013-05-25 02:03:45 +08:00
|
|
|
|
2017-07-18 03:42:32 +08:00
|
|
|
context "#click" do
|
|
|
|
it "doesn't work wthout the necessary parameters" do
|
|
|
|
expect(-> {
|
|
|
|
xhr :post, :click
|
|
|
|
}).to raise_error(ActionController::ParameterMissing)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "doesn't record the click for a different user" do
|
|
|
|
log_in(:user)
|
|
|
|
|
|
|
|
_, search_log_id = SearchLog.log(
|
|
|
|
term: 'kitty',
|
|
|
|
search_type: :header,
|
|
|
|
user_id: -10,
|
|
|
|
ip_address: '127.0.0.1'
|
|
|
|
)
|
|
|
|
|
|
|
|
xhr :post, :click, {
|
|
|
|
search_log_id: search_log_id,
|
|
|
|
search_result_id: 12345,
|
|
|
|
search_result_type: 'topic'
|
|
|
|
}
|
|
|
|
expect(response).to be_success
|
|
|
|
|
|
|
|
expect(SearchLog.find(search_log_id).clicked_topic_id).to be_blank
|
|
|
|
end
|
|
|
|
|
|
|
|
it "records the click for a logged in user" do
|
|
|
|
user = log_in(:user)
|
|
|
|
|
|
|
|
_, search_log_id = SearchLog.log(
|
|
|
|
term: 'kitty',
|
|
|
|
search_type: :header,
|
|
|
|
user_id: user.id,
|
|
|
|
ip_address: '127.0.0.1'
|
|
|
|
)
|
|
|
|
|
|
|
|
xhr :post, :click, {
|
|
|
|
search_log_id: search_log_id,
|
|
|
|
search_result_id: 12345,
|
|
|
|
search_result_type: 'topic'
|
|
|
|
}
|
|
|
|
expect(response).to be_success
|
|
|
|
|
|
|
|
expect(SearchLog.find(search_log_id).clicked_topic_id).to eq(12345)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "records the click for an anonymous user" do
|
|
|
|
request.stubs(:remote_ip).returns('192.168.0.1')
|
|
|
|
|
|
|
|
_, search_log_id = SearchLog.log(
|
|
|
|
term: 'kitty',
|
|
|
|
search_type: :header,
|
|
|
|
ip_address: '192.168.0.1'
|
|
|
|
)
|
|
|
|
|
|
|
|
xhr :post, :click, {
|
|
|
|
search_log_id: search_log_id,
|
|
|
|
search_result_id: 22222,
|
|
|
|
search_result_type: 'topic'
|
|
|
|
}
|
|
|
|
expect(response).to be_success
|
|
|
|
|
|
|
|
expect(SearchLog.find(search_log_id).clicked_topic_id).to eq(22222)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "doesn't record the click for a different IP" do
|
|
|
|
request.stubs(:remote_ip).returns('192.168.0.2')
|
|
|
|
|
|
|
|
_, search_log_id = SearchLog.log(
|
|
|
|
term: 'kitty',
|
|
|
|
search_type: :header,
|
|
|
|
ip_address: '192.168.0.1'
|
|
|
|
)
|
|
|
|
|
|
|
|
xhr :post, :click, {
|
|
|
|
search_log_id: search_log_id,
|
|
|
|
search_result_id: 22222,
|
|
|
|
search_result_type: 'topic'
|
|
|
|
}
|
|
|
|
expect(response).to be_success
|
|
|
|
|
|
|
|
expect(SearchLog.find(search_log_id).clicked_topic_id).to be_blank
|
|
|
|
end
|
|
|
|
end
|
2013-02-06 03:16:51 +08:00
|
|
|
end
|