# frozen_string_literal: true

require 'rails_helper'
require_dependency 'jobs/base'

describe Jobs::Base do
  class GoodJob < Jobs::Base
    attr_accessor :count
    def execute(args)
      self.count ||= 0
      self.count += 1
    end
  end

  class BadJob < Jobs::Base
    attr_accessor :fail_count

    def execute(args)
      @fail_count ||= 0
      @fail_count += 1
      raise StandardError
    end
  end

  it 'handles correct jobs' do
    job = GoodJob.new
    job.perform({})
    expect(job.count).to eq(1)
  end

  it 'handles errors in multisite' do
    RailsMultisite::ConnectionManagement.expects(:all_dbs).returns(['default', 'default', 'default'])
    # one exception per database
    Discourse.expects(:handle_job_exception).times(3)

    bad = BadJob.new
    expect { bad.perform({}) }.to raise_error(Jobs::HandledExceptionWrapper)
    expect(bad.fail_count).to eq(3)
  end

  it 'delegates the process call to execute' do
    Jobs::Base.any_instance.expects(:execute).with('hello' => 'world')
    Jobs::Base.new.perform('hello' => 'world', 'sync_exec' => true)
  end

  it 'converts to an indifferent access hash' do
    Jobs::Base.any_instance.expects(:execute).with(instance_of(HashWithIndifferentAccess))
    Jobs::Base.new.perform('hello' => 'world', 'sync_exec' => true)
  end

end