# frozen_string_literal: true

RSpec.describe DistributedMemoizer do
  after do
    Discourse.redis.del(DistributedMemoizer.redis_key("hello"))
    Discourse.redis.del(DistributedMemoizer.redis_lock_key("hello"))
  end

  def memoize(&block)
    DistributedMemoizer.memoize("hello", duration = 120, &block)
  end

  it "returns the value of a block" do
    expect(memoize { "abc" }).to eq("abc")
  end

  it "return the old value once memoized" do
    memoize { "abc" }

    expect(memoize { "world" }).to eq("abc")
  end

  it "memoizes correctly when used concurrently" do
    results = []
    threads = []

    5.times do
      threads << Thread.new do
        results << memoize do
          sleep 0.001
          SecureRandom.hex
        end
      end
    end

    threads.each(&:join)
    expect(results.uniq.length).to eq(1)
    expect(results.count).to eq(5)
  end
end