# Testing

Use `Oban.Pro.Testing` — a drop-in replacement for `Oban.Testing` with Pro helpers.

## Configuration

```elixir
# config/test.exs
config :my_app, Oban, testing: :manual
```

## Helpers

**Unit testing** — execute jobs without the database:

- `perform_job/3` — execute a single job
- `perform_callback/4` — execute batch callbacks
- `perform_chunk/3` — execute chunk workers

**Integration testing** — insert and execute jobs:

- `drain_jobs/1` — execute jobs across queues
- `run_workflow/2` — insert and execute a workflow
- `run_batch/2` — insert and execute a batch
- `run_chunk/2` — insert and execute chunked jobs

**Always use `drain_jobs/1` instead of `Oban.drain_queue/2`:**

- Drains all queues with `queue: :all`
- Handles workflows, batches, and chains correctly
- Supports recursive draining
- Returns completion counts

```elixir
defmodule MyApp.WorkerTest do
  use MyApp.DataCase, async: false
  use Oban.Pro.Testing, repo: MyApp.Repo

  test "processes job" do
    assert :ok == perform_job(SomeWorker, %{user_id: 123})
  end

  test "drains enqueued jobs" do
    MyApp.enqueue_work()
    assert %{completed: 3} = drain_jobs(queue: :all)
  end
end
```
