about summary refs log tree commit diff
path: root/spec/models/trending_tags_spec.rb
blob: b6122c994817bb17fb551708bdaa0d19795eed98 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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