# frozen_string_literal: true

RSpec.describe Jobs::RemoveBanner do
  fab!(:topic) { Fabricate(:topic) }
  fab!(:user) { topic.user }

  context "when topic is not bannered until" do
    it "doesn’t enqueue a future job to remove it" do
      expect do topic.make_banner!(user) end.not_to change { Jobs::RemoveBanner.jobs.size }
    end
  end

  context "when topic is bannered until" do
    context "when bannered_until is a valid date" do
      it "enqueues a future job to remove it" do
        bannered_until = 5.days.from_now

        expect(topic.archetype).to eq(Archetype.default)

        expect do topic.make_banner!(user, bannered_until.to_s) end.to change {
          Jobs::RemoveBanner.jobs.size
        }.by(1)

        topic.reload
        expect(topic.archetype).to eq(Archetype.banner)

        job = Jobs::RemoveBanner.jobs[0]
        expect(Time.at(job["at"])).to be_within_one_minute_of(bannered_until)
        expect(job["args"][0]["topic_id"]).to eq(topic.id)

        job["class"].constantize.new.perform(*job["args"])
        topic.reload
        expect(topic.archetype).to eq(Archetype.default)
      end
    end

    context "when bannered_until is an invalid date" do
      it "doesn’t enqueue a future job to remove it" do
        expect do
          expect do topic.make_banner!(user, "xxx") end.to raise_error(Discourse::InvalidParameters)
        end.not_to change { Jobs::RemoveBanner.jobs.size }
      end
    end
  end
end