forked from mstdn/mastodon
69 lines
2.1 KiB
Ruby
69 lines
2.1 KiB
Ruby
|
require 'rails_helper'
|
||
|
|
||
|
RSpec.describe TrendingTags do
|
||
|
describe '.record_use!' do
|
||
|
pending
|
||
|
end
|
||
|
|
||
|
describe '.update!' do
|
||
|
let!(:at_time) { Time.now.utc }
|
||
|
let!(:tag1) { Fabricate(:tag, name: 'Catstodon') }
|
||
|
let!(:tag2) { Fabricate(:tag, name: 'DogsOfMastodon') }
|
||
|
let!(:tag3) { Fabricate(:tag, name: 'OCs') }
|
||
|
|
||
|
before do
|
||
|
allow(Redis.current).to receive(:pfcount) do |key|
|
||
|
case key
|
||
|
when "activity:tags:#{tag1.id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts"
|
||
|
2
|
||
|
when "activity:tags:#{tag1.id}:#{at_time.beginning_of_day.to_i}:accounts"
|
||
|
16
|
||
|
when "activity:tags:#{tag2.id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts"
|
||
|
0
|
||
|
when "activity:tags:#{tag2.id}:#{at_time.beginning_of_day.to_i}:accounts"
|
||
|
4
|
||
|
when "activity:tags:#{tag3.id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts"
|
||
|
13
|
||
|
end
|
||
|
end
|
||
|
|
||
|
Redis.current.zadd('trending_tags', 0.9, tag3.id)
|
||
|
Redis.current.sadd("trending_tags:used:#{at_time.beginning_of_day.to_i}", [tag1.id, tag2.id])
|
||
|
|
||
|
tag3.update(max_score: 0.9, max_score_at: (at_time - 1.day).beginning_of_day + 12.hours)
|
||
|
|
||
|
described_class.update!(at_time)
|
||
|
end
|
||
|
|
||
|
it 'calculates and re-calculates scores' do
|
||
|
expect(described_class.get(10, filtered: false)).to eq [tag1, tag3]
|
||
|
end
|
||
|
|
||
|
it 'omits hashtags below threshold' do
|
||
|
expect(described_class.get(10, filtered: false)).to_not include(tag2)
|
||
|
end
|
||
|
|
||
|
it 'decays scores' do
|
||
|
expect(Redis.current.zscore('trending_tags', tag3.id)).to be < 0.9
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe '.trending?' do
|
||
|
let(:tag) { Fabricate(:tag) }
|
||
|
|
||
|
before do
|
||
|
10.times { |i| Redis.current.zadd('trending_tags', i + 1, Fabricate(:tag).id) }
|
||
|
end
|
||
|
|
||
|
it 'returns true if the hashtag is within limit' do
|
||
|
Redis.current.zadd('trending_tags', 11, tag.id)
|
||
|
expect(described_class.trending?(tag)).to be true
|
||
|
end
|
||
|
|
||
|
it 'returns false if the hashtag is outside the limit' do
|
||
|
Redis.current.zadd('trending_tags', 0, tag.id)
|
||
|
expect(described_class.trending?(tag)).to be false
|
||
|
end
|
||
|
end
|
||
|
end
|