module PostArchiveTestHelper
  def setup
    super

    mock_post_archive_service!
    start_post_archive_transaction
  end

  def teardown
    super

    rollback_post_archive_transaction
  end

  def mock_post_archive_service!
    mock_sqs_service = Class.new do
      def send_message(msg, *options)
        _, json = msg.split(/\n/)
        json = JSON.parse(json)
        json.delete("created_at")
        json["version"] = 1 + PostArchive.where(post_id: json["post_id"]).count
        prev = PostArchive.where(post_id: json["post_id"]).order("id desc").first
        if prev
          json["added_tags"] = json["tags"].scan(/\S+/) - prev.tags.scan(/\S+/)
          json["removed_tags"] = prev.tags.scan(/\S+/) - json["tags"].scan(/\S+/)
        else
          json["added_tags"] = json["tags"].scan(/\S+/)
        end
        if merge?(prev, json)
          prev.update_columns(json)
        else
          PostArchive.create(json)
        end
      end

      def merge?(prev, json)
        prev && (prev.updater_id == json["updater_id"]) && (prev.updated_at >= 1.hour.ago)
      end
    end

    PostArchive.stubs(:sqs_service).returns(mock_sqs_service.new)
  end

  def start_post_archive_transaction
    PostArchive.connection.begin_transaction joinable: false
  end

  def rollback_post_archive_transaction
    PostArchive.connection.rollback_transaction
  end
end
