# frozen_string_literal: true

RSpec.describe Jobs::PeriodicalUpdates do
  fab!(:admin)
  before do
    UserAvatar.where(last_gravatar_download_attempt: nil).update_all(
      last_gravatar_download_attempt: Time.now,
    )
  end

  it "works" do
    # does not blow up, no mocks, everything is called
    Jobs::PeriodicalUpdates.new.execute(nil)
  end

  it "can rebake old posts when automatically_download_gravatars is false" do
    SiteSetting.automatically_download_gravatars = false
    post = create_post(user: admin)
    post.update_columns(baked_at: Time.new(2000, 1, 1), baked_version: -1)

    Sidekiq::Testing.fake! do
      Jobs::ProcessPost.jobs.clear

      Jobs::PeriodicalUpdates.new.execute

      jobs = Jobs::ProcessPost.jobs
      expect(jobs.length).to eq(1)

      expect(jobs[0]["queue"]).to eq("ultra_low")
    end

    post.reload
    expect(post.baked_at).to be > 1.day.ago
    baked = post.baked_at

    # does not rebake
    Jobs::PeriodicalUpdates.new.execute
    post.reload
    expect(post.baked_at).to eq_time(baked)
  end

  it "does not rebake old posts when automatically_download_gravatars is true and a valid user avatar needs updating" do
    SiteSetting.automatically_download_gravatars = true
    UserAvatar.last.update!(last_gravatar_download_attempt: nil)
    post = create_post(user: admin)
    post.update_columns(baked_at: Time.new(2000, 1, 1), baked_version: -1)

    Sidekiq::Testing.fake! do
      Jobs::ProcessPost.jobs.clear
      Jobs::PeriodicalUpdates.new.execute
      expect(Jobs::ProcessPost.jobs).to be_empty
    end
  end

  it "does not rebake old posts when there are user avatars that need updating" do
    SiteSetting.automatically_download_gravatars = true

    post = create_post(user: admin)
    post.update_columns(baked_at: Time.new(2000, 1, 1), baked_version: -1)
    UserAvatar.last.update!(last_gravatar_download_attempt: nil)

    Sidekiq::Testing.fake! do
      Jobs::ProcessPost.jobs.clear
      Jobs::PeriodicalUpdates.new.execute
      expect(Jobs::ProcessPost.jobs).to be_empty
    end
  end

  # inconsistent data will be fixed by ensure_consistency! of the relevant models
  it "rebakes old posts when there are user avatars that need updating but have inconsistent data" do
    SiteSetting.automatically_download_gravatars = true

    user_avatar_without_user = Fabricate(:user_avatar, last_gravatar_download_attempt: Time.now)
    user_avatar_without_user.user.delete
    user_without_any_email = Fabricate(:user)
    user_without_any_email.user_emails.delete_all
    user_without_primary_email = Fabricate(:user)
    user_without_primary_email.primary_email.update_column(:primary, false)

    post = create_post(user: admin)
    post.update_columns(baked_at: Time.new(2000, 1, 1), baked_version: -1)

    Sidekiq::Testing.fake! do
      Jobs::ProcessPost.jobs.clear
      Jobs::PeriodicalUpdates.new.execute
      expect(Jobs::ProcessPost.jobs.length).to eq(1)
    end
  end
end