CHANGELOG.md

# Changelog for Oban v2.12

_🌟 Looking for changes to Web or Pro? Check the [Oban.Pro Changelog][opc] or
the [Oban.Web Changelog][owc]. 🌟_

[Oban v2.12 Upgrade Guide](v2-12.html)

Oban v2.12 was dedicated to enriching the testing experience and expanding
config, plugin, and queue validation across all environments.

## Testing Modes

Testing modes bring a new, vastly improved, way to configure Oban for testing.
The new `testing` option makes it explicit that Oban should operate in a
restricted mode for the given environment.

Behind the scenes, the new testing modes rely on layers of validation within
Oban's `Config` module. Now production configuration is validated automatically
during test runs. Even though queues and plugins aren't _started_ in the test
environment, their configuration is still validated.

To switch, stop overriding `plugins` and `queues` and enable a testing mode
in your `test.exs` config:

```elixir
config :my_app, Oban, testing: :manual
```

Testing in `:manual` mode is identical to testing in older versions of Oban:
jobs won't run automatically so you can use helpers like `assert_enqueued` and
execute them manually with `Oban.drain_queue/2`.

An alternate `:inline` allows Oban to bypass all database interaction and run
jobs _immediately in the process that enqueued them_.

```elixir
config :my_app, Oban, testing: :inline
```

Finally, new [testing guides][tst] cover test setup, unit [testing
workers][tsw], integration [testing queues][tsq], and testing [dynamic
configuration][tsc].

[tst]: testing.html
[tsw]: testing_workers.html
[tsq]: testing_queues.html
[tsc]: testing_config.html

## Global Peer Module

Oban v2.11 introduced centralized leadership via Postgres tables. However,
Postgres based leadership isn't always a good fit. For example, an ephemeral
leadership mechanism is preferred for integration testing.

In that case, you can make use of the new `:global` powered peer module for
leadership:

```elixir
config :my_app, Oban,
  peer: Oban.Peers.Global,
  ...
```

## 2.12.0 — 2022-04-19

### Enhancements

- [Oban] Replace queue, plugin, and peer test configuration with a single
  `:testing` option. Now configuring Oban for testing only requires one change,
  setting the test mode to either `:inline` or `:manual`.

  - `:inline`—jobs execute immediately within the calling process and without
    touching the database. This mode is simple and may not be suitable for apps
    with complex jobs.
  - `:manual`—jobs are inserted into the database where they can be verified and
    executed when desired. This mode is more advanced and trades simplicity for
    flexibility.

- [Testing] Add `with_testing_mode/2` to temporarily change testing modes
  within the context of a function.

  Once the application starts in a particular testing mode it can't be changed.
  That's inconvenient if you're running in `:inline` mode and don't want a
  particular job to execute inline.

- [Config] Add `validate/1` to aid in testing dynamic Oban configuration.

- [Config] Validate full plugin and queue options on init, without the need
  to start plugins or queues.

- [Peers.Global] Add an alternate `:global` powered peer module.

- [Plugin] A new `Oban.Plugin` behaviour formalizes starting and validating
  plugins. The behaviour is implemented by all plugins, and is the foundation of
  enhanced config validation.

- [Plugin] Emit `[:oban, :plugin, :init]` event on init from every plugin.

### Bug Fixes

- [Executor ] Skip timeout check with an unknown worker

  When the worker can't be resolved we don't need to check the timeout. Doing so
  prevents returning a helpful "unknown worker" message, and instead causes a
  function error for `nil.timeout/1`.

- [Testing] Include `log` and `prefix` in generated conf for `perform_job`.

  The opts, and subsequent conf, built for `perform_job` didn't include the
  `prefix` or `log` options. That prevented functions that depend on a job's
  `conf` within `perform/1` from running with the correct options.

- [Drainer] Retain the currently configured engine while draining a queue.

- [Watchman] Skip pausing queues when shutdown is immediate. This prevents
  queue's from interacting with the database during short test runs.

For changes prior to v2.12 see the [v2.11][prv] docs.

[opc]: https://getoban.pro/docs/pro/changelog.html
[owc]: https://getoban.pro/docs/web/changelog.html
[prv]: https://hexdocs.pm/oban/2.11.2/changelog.html