# frozen_string_literal: true

require_relative "helper"

class InlineError < RuntimeError; end

class ParameterIsNotString < RuntimeError; end

class InlineWorker
  include Sidekiq::Job
  def perform(pass)
    raise ArgumentError, "no jid" unless jid
    raise InlineError unless pass
  end
end

class InlineWorkerWithTimeParam
  include Sidekiq::Job
  def perform(time)
    raise ParameterIsNotString unless time.is_a?(String) || time.is_a?(Numeric)
  end
end

describe "Sidekiq::Testing.inline" do
  before do
    require "sidekiq/testing/inline"
    Sidekiq::Testing.inline!
  end

  after do
    Sidekiq::Testing.disable!
  end

  it "stubs the async call when in testing mode" do
    assert InlineWorker.perform_async(true)

    assert_raises InlineError do
      InlineWorker.perform_async(false)
    end
  end

  it "stubs the enqueue call when in testing mode" do
    assert Sidekiq::Client.enqueue(InlineWorker, true)

    assert_raises InlineError do
      Sidekiq::Client.enqueue(InlineWorker, false)
    end
  end

  it "stubs the push_bulk call when in testing mode" do
    assert Sidekiq::Client.push_bulk({"class" => InlineWorker, "args" => [[true], [true]]})

    assert_raises InlineError do
      Sidekiq::Client.push_bulk({"class" => InlineWorker, "args" => [[true], [false]]})
    end
  end

  it "should relay parameters through json" do
    assert Sidekiq::Client.enqueue(InlineWorkerWithTimeParam, Time.now.to_f)
  end
end