Sidekiq Config Testing

Often times during a refactor there can be things missed. That’s one of the reasons why we write unit tests. Unfortunately I ran into the exact situation where I’m describing, I renamed one of job’s modules from Channel to Channels but I forgot to update the sidekiq.yml file. 🤦‍♂️

The worst part was finding this much later and only after users were complaining about the job not working.

To counteract that I wrote the following unit test for ensuring valid configuration.

require 'test_helper'

class SidekiqConfigurationTest < ActiveJob::TestCase
  test "sidekiq.yml contains only valid classes" do
    file_path = Rails.root.join('config/sidekiq.yml')

    configuration = YAML.load_file(file_path)

    assert configuration.present?

    jobs = configuration.dig(:schedule).keys
    jobs.each do |job|
      # Rails can convert a string to a class with constantize
      # https://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-constantize
      # This raises a NameError if the configuration isn't valid
      job.constantize
    end
  end
end

There we have it! A simple, straight to the point Sidekiq job configuration test. There’s a lot more you can do with this rather than just test the class exists. We could kick off a test of each job and ensure that all of them ran successfully. We could test the queue names to ensure that each job is correctly assigned to a queue. Or we could do the opposite, check all the items in app/jobs to ensure there is an associated entry in the sidekiq.yml file.