# `AshOban.Test`
[🔗](https://github.com/ash-project/ash_oban/blob/v0.8.0-rc.0/lib/test.ex#L5)

Helpers for testing AshOban triggers and scheduled actions.

This module provides a convenient wrapper around `AshOban.schedule_and_run_triggers/2`
that defaults to draining queues, which is the typical behavior you want in tests.

## Setup

Before using this module, ensure your Oban config uses `testing: :manual`:

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

See the [Testing Guide](/documentation/topics/testing.md) for full setup instructions.

## Basic Usage

    # Run all triggers for a resource
    AshOban.Test.schedule_and_run_triggers(MyApp.MyResource)

    # Run a specific trigger
    AshOban.Test.schedule_and_run_triggers({MyApp.MyResource, :process})

    # Run all triggers for a domain
    AshOban.Test.schedule_and_run_triggers(MyApp.MyDomain)

    # Run all triggers for an OTP app
    AshOban.Test.schedule_and_run_triggers(:my_app)

    # Include scheduled actions (excluded by default)
    AshOban.Test.schedule_and_run_triggers(MyApp.MyResource, scheduled_actions?: true)

## Asserting Results

The function returns a map of job outcomes that you can pattern match on:

    assert %{success: 2} =
      AshOban.Test.schedule_and_run_triggers({MyApp.MyResource, :process})

    assert %{success: 1, failure: 0} =
      AshOban.Test.schedule_and_run_triggers(MyApp.MyResource)

# `schedule_and_run_triggers`

Schedules and runs triggers, draining queues by default.

This is a wrapper around `AshOban.schedule_and_run_triggers/2` with `drain_queues?: true`
set by default, making it suitable for use in tests where you want jobs to execute
synchronously.

## Arguments

* `resources_or_domains_or_otp_apps` - Can be any of the following:
  * A resource module - runs all triggers for that resource
  * A `{resource, :trigger_name}` tuple - runs a specific trigger
  * A domain module - runs all triggers for all resources in that domain
  * An OTP app atom - runs all triggers for all domains in that app
  * A list of any of the above

## Options

* `:drain_queues?` - Whether to drain queues after scheduling. Defaults to `true`
  (unlike `AshOban.schedule_and_run_triggers/2` which defaults to `false`).
* `:scheduled_actions?` - Whether to include scheduled actions. Defaults to `false`.
  When passing a `{resource, :scheduled_action_name}` tuple this is automatically enabled.
* `:triggers?` - Whether to include triggers. Defaults to `true`.
* `:actor` - The actor to pass to the trigger actions. Requires an actor persister to be configured.
* `:oban` - The Oban instance to use. Defaults to `Oban`.
* `:queue` - Passed through to `Oban.drain_queue/2`.
* `:with_limit` - Passed through to `Oban.drain_queue/2`.
* `:with_recursion` - Passed through to `Oban.drain_queue/2`.
* `:with_safety` - Passed through to `Oban.drain_queue/2`.
* `:with_scheduled` - Passed through to `Oban.drain_queue/2`.

## Return Value

Returns a map with job outcome counts:

    %{
      success: non_neg_integer(),
      failure: non_neg_integer(),
      discard: non_neg_integer(),
      cancelled: non_neg_integer(),
      snoozed: non_neg_integer(),
      queues_not_drained: [atom()]
    }

## Examples

    # Run all triggers for a resource and assert outcomes
    assert %{success: 3, failure: 0} =
      AshOban.Test.schedule_and_run_triggers(MyResource)

    # Run a specific trigger with an actor
    assert %{success: 2} =
      AshOban.Test.schedule_and_run_triggers({MyResource, :process},
        actor: %MyApp.User{id: 1}
      )

---

*Consult [api-reference.md](api-reference.md) for complete listing*
