View Source Testing Config

An Oban instance's config is built from options passed to Oban.start_link during initialization and it determines the supervision tree that Oban builds. The instance config is encapsulated by an Oban.Config struct, which is then referenced by plugins, queues, and most public functions.

testing-dynamic-config

Testing Dynamic Config

Oban automatically normalizes and validates config options on initialization. That covers any static configuration, but it won't help when config is generated dynamically, at runtime.

The Oban.Config.validate/1 helper is used internally when the config initializes. Along with each top level option, like the :engine or :repo, it recursively verifies all queue and plugin options.

You can use validate/1 to verify dynamic configuration, e.g. options specified in runtime.exs:

test "production oban config is valid" do
  config =
    "config/config.exs"
    |> Config.Reader.read!(env: :prod)
    |> get_in([:my_app, Oban])

  assert :ok = Oban.Config.validate(config)
end

When the configuration contains any invalid options, like an invalid engine, you'll see the test fail with an error like this:

{:error, "expected :engine to be an Oban.Queue.Engine, got: MyApp.Repo"}

testing-dynamic-plugin-config

Testing Dynamic Plugin Config

Validation is especially helpful for plugins that have complex configuration, e.g. Cron or the Dynamic* plugins from Oban Pro. As of Oban v2.12.0 all plugins implement the Oban.Plugin.validate/1 callback and we can test them in isolation as well as through the top level config.

Suppose you have a helper function that returns a crontab config at runtime:

defmodule MyApp.Oban do
  def cron_config do
    [crontab: [{"0 24 * * *", MyApp.Worker}]]
  end
end

You can call that function within a test and then assert that it is valid with Oban.Plugin.validate/1:

test "testing cron plugin configuration" do
  config = MyApp.Oban.cron_config()

  assert :ok = Oban.Plugins.Cron.validate(config)
end

Running this test will return an error tuple, showing that the cron expression isn't valid.

{:error, %ArgumentError{message: "expression field 24 is out of range 0..23"}}

Switch the expression from 0 24 * * * to 0 23 * * *, run the tests again, and everything passes!