mirror of
https://github.com/discourse/discourse.git
synced 2024-11-24 09:53:32 +08:00
e3925278e2
https://meta.discourse.org/t/search-logs-page/73281/11?u=techapj This commit adds following features: - support for tracking click through to user, tag and category - new filter for search type (header, full page) This commit also removes "most viewed topic" field from search logs page because we are now tracking multiple click through entities, so topic is not a special entity anymore. This also improves query perf. The query now takes `20.5ms` to runs, as opposed to `655.9ms` previously.
212 lines
6.1 KiB
Ruby
212 lines
6.1 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe SearchLog, type: :model do
|
|
|
|
describe ".log" do
|
|
|
|
context "invalid arguments" do
|
|
it "no search type returns error" do
|
|
status, _ = SearchLog.log(
|
|
term: 'bounty hunter',
|
|
search_type: :missing,
|
|
ip_address: '127.0.0.1'
|
|
)
|
|
expect(status).to eq(:error)
|
|
end
|
|
|
|
it "no IP returns error" do
|
|
status, _ = SearchLog.log(
|
|
term: 'bounty hunter',
|
|
search_type: :header,
|
|
ip_address: nil
|
|
)
|
|
expect(status).to eq(:error)
|
|
end
|
|
end
|
|
|
|
context "when anonymous" do
|
|
it "logs and updates the search" do
|
|
freeze_time
|
|
action, log_id = SearchLog.log(
|
|
term: 'jabba',
|
|
search_type: :header,
|
|
ip_address: '192.168.0.33'
|
|
)
|
|
expect(action).to eq(:created)
|
|
log = SearchLog.find(log_id)
|
|
expect(log.term).to eq('jabba')
|
|
expect(log.search_type).to eq(SearchLog.search_types[:header])
|
|
expect(log.ip_address).to eq('192.168.0.33')
|
|
|
|
action, updated_log_id = SearchLog.log(
|
|
term: 'jabba the hut',
|
|
search_type: :header,
|
|
ip_address: '192.168.0.33'
|
|
)
|
|
expect(action).to eq(:updated)
|
|
expect(updated_log_id).to eq(log_id)
|
|
end
|
|
|
|
it "creates a new search with a different prefix" do
|
|
freeze_time
|
|
action, _ = SearchLog.log(
|
|
term: 'darth',
|
|
search_type: :header,
|
|
ip_address: '127.0.0.1'
|
|
)
|
|
expect(action).to eq(:created)
|
|
|
|
action, _ = SearchLog.log(
|
|
term: 'anakin',
|
|
search_type: :header,
|
|
ip_address: '127.0.0.1'
|
|
)
|
|
expect(action).to eq(:created)
|
|
end
|
|
|
|
it "creates a new search with a different ip" do
|
|
freeze_time
|
|
action, _ = SearchLog.log(
|
|
term: 'darth',
|
|
search_type: :header,
|
|
ip_address: '127.0.0.1'
|
|
)
|
|
expect(action).to eq(:created)
|
|
|
|
action, _ = SearchLog.log(
|
|
term: 'darth',
|
|
search_type: :header,
|
|
ip_address: '127.0.0.2'
|
|
)
|
|
expect(action).to eq(:created)
|
|
end
|
|
end
|
|
|
|
context "when logged in" do
|
|
let(:user) { Fabricate(:user) }
|
|
|
|
it "logs and updates the search" do
|
|
freeze_time
|
|
action, log_id = SearchLog.log(
|
|
term: 'hello',
|
|
search_type: :full_page,
|
|
ip_address: '192.168.0.1',
|
|
user_id: user.id
|
|
)
|
|
expect(action).to eq(:created)
|
|
log = SearchLog.find(log_id)
|
|
expect(log.term).to eq('hello')
|
|
expect(log.search_type).to eq(SearchLog.search_types[:full_page])
|
|
expect(log.ip_address).to eq('192.168.0.1')
|
|
expect(log.user_id).to eq(user.id)
|
|
|
|
action, updated_log_id = SearchLog.log(
|
|
term: 'hello dolly',
|
|
search_type: :header,
|
|
ip_address: '192.168.0.33',
|
|
user_id: user.id
|
|
)
|
|
expect(action).to eq(:updated)
|
|
expect(updated_log_id).to eq(log_id)
|
|
end
|
|
|
|
it "logs again if time has passed" do
|
|
freeze_time(10.minutes.ago)
|
|
|
|
action, _ = SearchLog.log(
|
|
term: 'hello',
|
|
search_type: :full_page,
|
|
ip_address: '192.168.0.1',
|
|
user_id: user.id
|
|
)
|
|
expect(action).to eq(:created)
|
|
|
|
freeze_time(10.minutes.from_now)
|
|
|
|
action, _ = SearchLog.log(
|
|
term: 'hello',
|
|
search_type: :full_page,
|
|
ip_address: '192.168.0.1',
|
|
user_id: user.id
|
|
)
|
|
|
|
expect(action).to eq(:created)
|
|
end
|
|
|
|
it "logs again with a different user" do
|
|
freeze_time
|
|
|
|
action, _ = SearchLog.log(
|
|
term: 'hello',
|
|
search_type: :full_page,
|
|
ip_address: '192.168.0.1',
|
|
user_id: user.id
|
|
)
|
|
expect(action).to eq(:created)
|
|
|
|
action, _ = SearchLog.log(
|
|
term: 'hello dolly',
|
|
search_type: :full_page,
|
|
ip_address: '192.168.0.1',
|
|
user_id: Fabricate(:user).id
|
|
)
|
|
expect(action).to eq(:created)
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
context "trending" do
|
|
before do
|
|
SearchLog.log(term: 'ruby', search_type: :header, ip_address: '127.0.0.1')
|
|
SearchLog.log(term: 'php', search_type: :header, ip_address: '127.0.0.1')
|
|
SearchLog.log(term: 'java', search_type: :header, ip_address: '127.0.0.1')
|
|
SearchLog.log(term: 'ruby', search_type: :header, ip_address: '127.0.0.1', user_id: Fabricate(:user).id)
|
|
SearchLog.log(term: 'swift', search_type: :header, ip_address: '127.0.0.1')
|
|
SearchLog.log(term: 'ruby', search_type: :header, ip_address: '127.0.0.2')
|
|
end
|
|
|
|
it "considers time period" do
|
|
expect(SearchLog.trending.count).to eq(4)
|
|
|
|
SearchLog.where(term: 'swift').update_all(created_at: 1.year.ago)
|
|
expect(SearchLog.trending(:monthly).count).to eq(3)
|
|
end
|
|
|
|
it "correctly returns trending data" do
|
|
top_trending = SearchLog.trending.first
|
|
expect(top_trending.term).to eq("ruby")
|
|
expect(top_trending.searches).to eq(3)
|
|
expect(top_trending.unique).to eq(2)
|
|
expect(top_trending.click_through).to eq(0)
|
|
|
|
SearchLog.where(term: 'ruby', ip_address: '127.0.0.1').update_all(search_result_id: 12)
|
|
SearchLog.where(term: 'ruby', ip_address: '127.0.0.2').update_all(search_result_id: 24)
|
|
top_trending = SearchLog.trending.first
|
|
expect(top_trending.click_through).to eq(3)
|
|
end
|
|
end
|
|
|
|
context "clean_up" do
|
|
|
|
it "will remove old logs" do
|
|
SearchLog.log(term: 'jawa', search_type: :header, ip_address: '127.0.0.1')
|
|
SearchLog.log(term: 'jedi', search_type: :header, ip_address: '127.0.0.1')
|
|
SearchLog.log(term: 'rey', search_type: :header, ip_address: '127.0.0.1')
|
|
SearchLog.log(term: 'finn', search_type: :header, ip_address: '127.0.0.1')
|
|
|
|
SiteSetting.search_query_log_max_size = 5
|
|
SearchLog.clean_up
|
|
expect(SearchLog.count).to eq(4)
|
|
|
|
SiteSetting.search_query_log_max_size = 2
|
|
SearchLog.clean_up
|
|
expect(SearchLog.count).to eq(2)
|
|
expect(SearchLog.where(term: 'rey').first).to be_present
|
|
expect(SearchLog.where(term: 'finn').first).to be_present
|
|
end
|
|
|
|
end
|
|
|
|
end
|