mperham--sidekiq/test/sidekiq_test.rb

109 lines
3.1 KiB
Ruby

# frozen_string_literal: true
require_relative "helper"
describe Sidekiq do
before do
@config = reset!
end
describe "json processing" do
it "handles json" do
assert_equal({"foo" => "bar"}, Sidekiq.load_json("{\"foo\":\"bar\"}"))
assert_equal "{\"foo\":\"bar\"}", Sidekiq.dump_json({"foo" => "bar"})
end
end
describe "redis connection" do
it "returns error without creating a connection if block is not given" do
assert_raises(ArgumentError) do
@config.redis
end
end
end
describe "lifecycle events" do
it "handles invalid input" do
@config[:lifecycle_events][:startup].clear
e = assert_raises ArgumentError do
@config.on(:startp)
end
assert_match(/Invalid event name/, e.message)
e = assert_raises ArgumentError do
@config.on("startup")
end
assert_match(/Symbols only/, e.message)
@config.on(:startup) do
1 + 1
end
assert_equal 2, @config[:lifecycle_events][:startup].first.call
end
end
describe "default_job_options" do
it "stringifies keys" do
@old_options = Sidekiq.default_job_options
begin
Sidekiq.default_job_options = {queue: "cat"}
assert_equal "cat", Sidekiq.default_job_options["queue"]
ensure
Sidekiq.default_job_options = @old_options
end
end
end
describe "error handling" do
it "deals with user-specified error handlers which raise errors" do
output = capture_logging(@config) do
@config.error_handlers << proc { |x, hash|
raise "boom"
}
@config.handle_exception(RuntimeError.new("hello"))
ensure
@config.error_handlers.pop
end
assert_includes output, "boom"
assert_includes output, "ERROR"
end
end
describe "redis connection" do
it "does not continually retry" do
assert_raises Sidekiq::RedisClientAdapter::CommandError do
@config.redis do |c|
raise Sidekiq::RedisClientAdapter::CommandError, "READONLY You can't write against a replica."
end
end
end
it "reconnects if connection is flagged as readonly" do
counts = []
@config.redis do |c|
counts << c.info["total_connections_received"].to_i
raise Sidekiq::RedisClientAdapter::CommandError, "READONLY You can't write against a replica." if counts.size == 1
end
assert_equal 2, counts.size
assert_equal counts[0] + 1, counts[1]
end
it "reconnects if instance state changed" do
counts = []
@config.redis do |c|
counts << c.info["total_connections_received"].to_i
raise Sidekiq::RedisClientAdapter::CommandError, "UNBLOCKED force unblock from blocking operation, instance state changed (master -> replica?)" if counts.size == 1
end
assert_equal 2, counts.size
assert_equal counts[0] + 1, counts[1]
end
end
describe "redis info" do
it "calls the INFO command which returns at least redis_version" do
output = @config.redis_info
assert_includes output.keys, "redis_version"
end
end
end