# frozen_string_literal: true

RSpec.describe Jobs::CleanUpInactiveUsers do
  it "should clean up new users that have been inactive" do
    SiteSetting.clean_up_inactive_users_after_days = 0

    user =
      Fabricate(
        :user,
        created_at: 5.days.ago,
        last_seen_at: 5.days.ago,
        trust_level: TrustLevel.levels[:newuser],
      )

    Fabricate(:active_user)

    Fabricate(
      :post,
      user:
        Fabricate(
          :user,
          trust_level: TrustLevel.levels[:newuser],
          created_at: 5.days.ago,
          last_seen_at: 5.days.ago,
        ),
    ).user

    Fabricate(
      :user,
      trust_level: TrustLevel.levels[:newuser],
      created_at: 5.days.ago,
      last_seen_at: 2.days.ago,
    )

    Fabricate(:user, trust_level: TrustLevel.levels[:basic], created_at: 5.days.ago)

    expect { described_class.new.execute({}) }.to_not change { User.count }

    SiteSetting.clean_up_inactive_users_after_days = 4

    expect { described_class.new.execute({}) }.to change { User.count }.by(-1)

    expect(User.exists?(id: user.id)).to eq(false)
  end

  it "doesn't delete inactive admins" do
    SiteSetting.clean_up_inactive_users_after_days = 4
    admin =
      Fabricate(
        :admin,
        created_at: 5.days.ago,
        last_seen_at: 5.days.ago,
        trust_level: TrustLevel.levels[:newuser],
      )

    expect { described_class.new.execute({}) }.to_not change { User.count }
    expect(User.exists?(admin.id)).to eq(true)
  end

  it "doesn't delete inactive mods" do
    SiteSetting.clean_up_inactive_users_after_days = 4
    moderator =
      Fabricate(
        :moderator,
        created_at: 5.days.ago,
        last_seen_at: 5.days.ago,
        trust_level: TrustLevel.levels[:newuser],
      )

    expect { described_class.new.execute({}) }.to_not change { User.count }
    expect(User.exists?(moderator.id)).to eq(true)
  end

  it "should clean up a user that has a deleted post" do
    SiteSetting.clean_up_inactive_users_after_days = 1

    Fabricate(:active_user)

    Fabricate(
      :post,
      user:
        Fabricate(
          :user,
          trust_level: TrustLevel.levels[:newuser],
          created_at: 5.days.ago,
          last_seen_at: 2.days.ago,
        ),
      # ensuring that topic author is a different user as the topic is non-deleted
      topic: Fabricate(:topic, user: Fabricate(:user)),
      deleted_at: Time.now,
    ).user

    expect { described_class.new.execute({}) }.to change { User.count }.by(-1)
  end

  it "should clean up user that has a deleted topic" do
    SiteSetting.clean_up_inactive_users_after_days = 1

    Fabricate(:active_user)

    Fabricate(
      :topic,
      user:
        Fabricate(
          :user,
          trust_level: TrustLevel.levels[:newuser],
          created_at: 2.days.ago,
          last_seen_at: 2.days.ago,
        ),
      deleted_at: Time.now,
    ).user

    expect { described_class.new.execute({}) }.to change { User.count }.by(-1)
  end
end