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