Mutates the enqueue options of an Oban job — the keyword options passed when a job is
built (MyWorker.new(args, max_attempts: 3, unique: [...], schedule_in: 60)). These options
encode the job's retry / dedup / scheduling policy, so dropping or weakening one asks the
suite a pointed question.
The mutations
max_attempts: n (n ≠ 1) -> max_attempts: 1 no retries — is the retry asserted?
unique: [...] -> (dropped) dedup removed — is the dupe caught?
schedule_in: _ -> (dropped) runs now, not later — is the delay asserted?
scheduled_at: _ -> (dropped) runs now, not laterEach is a single mutant, delivered in place by Mutare's selector, and compile-safe by
construction (dropping a keyword pair or substituting the literal 1 always yields a legal
keyword list — even the empty [], a valid second argument to new/2).
Each mutant is a Mutare.Mutator.Mutation tagged with the option it attacks as its ignore
variant — so # mutare:ignore[oban_enqueue:unique] suppresses just the dedup drop on that
line (see Mutare.Ignore) — and carries a report note saying what a survivor leaves
unasserted.
How it matches
It matches the new/N call (not the keyword list — Mutare descends trailing keyword
options as individual call arguments, never offering the list as a single node), resolving it
through Mutare.Calls.resolved_call/1 so the direct, aliased, and piped
(args |> MyWorker.new(opts)) forms all match, and rebuilds the call with the mutated options
in the form the source wrote. It fires on any module's new whose options carry one of
the keys it mutates (max_attempts, unique, schedule_in, scheduled_at) — Oban-distinctive
enough that a false positive is unlikely, and would at worst rebuild an equivalent call
elsewhere, never miscompile.
This intentionally covers only the dynamic new/2 options. Static config in the
use Oban.Worker line is compile-time and unreachable — see Mutare.Oban.
Summary
Functions
The attacked-option vocabulary for # mutare:ignore[oban_enqueue:<label>] — each mutant is
tagged at production with the key it caps or drops.