# frozen_string_literal: true

RSpec.describe GroupMentionsUpdater do
  fab!(:post)

  before { Jobs.run_immediately! }

  describe ".update" do
    it "updates valid group mentions" do
      new_group_name = "awesome_team"
      old_group_name = "team"

      [
        ["@#{old_group_name} is awesome!", "@#{new_group_name} is awesome!"],
        ["This @#{old_group_name} is awesome!", "This @#{new_group_name} is awesome!"],
        ["Mention us @ @#{old_group_name}", "Mention us @ @#{new_group_name}"],
      ].each do |raw, expected_raw|
        group =
          Fabricate(:group, name: old_group_name, mentionable_level: Group::ALIAS_LEVELS[:everyone])

        post.update!(raw: raw)
        group.update!(name: new_group_name)
        post.reload

        expect(post.raw_mentions).to eq([new_group_name])
        expect(post.raw).to eq(expected_raw)

        group.destroy!
      end
    end

    it "does not update invalid group mentions" do
      group = Fabricate(:group, name: "team", mentionable_level: Group::ALIAS_LEVELS[:everyone])

      post.update!(raw: "This is not valid@team.com")

      expect(post.reload.raw_mentions).to eq([])

      group.update!(name: "new_team_name")

      expect(post.reload.raw_mentions).to eq([])
    end

    it "updates a category description that mentions the group" do
      group = Fabricate(:group, name: "old_team", mentionable_level: Group::ALIAS_LEVELS[:everyone])

      category = Fabricate(:category_with_definition)
      first_post = category.topic.first_post
      first_post.revise(first_post.user, { raw: "This category is managed by @old_team" })
      category.reload

      expect(category.description).to include("old_team")

      GroupMentionsUpdater.update("new_team", "old_team")
      category.reload

      expect(category.description).to include("new_team")
      expect(category.description).not_to include("old_team")
    end

    it "ignores validations" do
      everyone_mention_level = Group::ALIAS_LEVELS[:everyone]

      %w[awesome_team pro_team].each do |name|
        Fabricate(:group, name: name, mentionable_level: everyone_mention_level)
      end

      post.update!(raw: "@awesome_team is cool and so is @pro_team")

      SiteSetting.max_mentions_per_post = 1
      GroupMentionsUpdater.update("cool_team", "awesome_team")

      post.reload
      expect(post.raw_mentions).to match_array(%w[cool_team pro_team])
    end
  end
end
